Язык SQL

Сложности при обновлении записей в файле


Замену записи записью большей длины невозможно осуществить без перемещения по меньшей мере одной записи на новое место. В данном случае попытке записать более длинную запись на место второй записи будет мешать поле длины третьей записи. Это может привести к нарушению целостности файла. Наиболее дальновидным решением является удалить вторую запись из того места, где она находится в текущий момент, а затем добавить ее новое значение в конец файла. Если не беспокоиться о порядке записей, такое решение будет вполне удовлетворительным.

Таким образом, теперь необходимо рассмотреть задачу удаления записи. Нужно иметь возможность оставить в файле пространство, а не запись. По приведенным выше причинам нельзя трогать поле длины. Следовательно, необходимо поместить некоторую метку в файл, чтобы отметить, что запись удалена. В рассматриваемом случае, когда записи вносятся в файл с помощью класса RecordFile, длина хранится как короткое целое со знаком. Поскольку длина всегда является положительной, можно использовать отрицательное значение для длины, чтобы указать, что запись удалена. Следующая запись располагается в файле дальше на число байт, равное абсолютному значению длины.

После удаления записи из файла необходимо модифицировать метод последовательного чтения, чтобы иметь возможность считать следующую неудаленную запись после текущей позиции. Кроме того, нужно изменить метод прямого чтения, чтобы он оканчивался неудачей при попытке считать удаленную запись.

Метод write следует переименовать в update и модифицировать так, как описано выше, чтобы он не нарушал целостность файла. Эту модификацию предлагается осуществить в качестве упражнения.

Комментарии закрыты