Интересный вопрос; Вы обычно не видите это как дизайн. У меня есть программа, которая использует слегка похожую технику для записи истории, но она использует двоичный формат. «Файл журнала» состоит из четырех частей, все они представлены в машинно-нейтральном формате:
- Заголовок, содержащий магическое число и (максимальное) количество записей в используемом списке и свободном списке, порядковый номер для следующей записи в истории, фактическое количество записей в используемом списке, фактическое количество записей в свободном списке и длина файла (каждый из которых составляет 4 байта).
- Используемый список, каждая запись дает смещение и длину (4 байта для каждой части каждой записи).
- Свободный список, каждая запись аналогична используемой записи списка.
- Основные данные, каждая запись истории, состоящая из непрерывного набора байтов, оканчивающихся нулевым завершающим байтом.
Когда выделяется новая запись, если в свободном списке есть место, тогда она перезаписывает запись там (необязательно используя все это - в этом случае фрагмент остается в свободном списке). Когда в свободном списке нет места, в конце выделяется новое место. Когда старая запись вращается, ее пространство перемещается в свободный список и объединяется с любыми соседними бесплатными записями. Он предназначен для обработки операторов SQL, поэтому записи могут быть распределены по многим строкам. Этот код работает с указанным количеством записей. Он не ограничивает размер файла как такового (хотя сделать это будет несложно).
Основной код истории кода находится в двух файлах history.c и history.h, доступных из источника для программы SQLCMD (моя версия, а не Microsoft; моя существовала за десять или более лет до Microsoft), которую можно загрузить с архив программного обеспечения Международной группы пользователей Informix . Существует также программа для выгрузки файла истории (histdump.c) и тестер истории (histtest.ec - он претендует на то, чтобы быть ESQL / C, но сам по себе является кодом C; одна из функций поддержки, которую он вызывает, использует некоторый Informix ESQL / C библиотечные функции). Свяжитесь со мной, если вы хотите экспериментировать без использования Informix ESQL / C - смотрите мой профиль. Существуют некоторые тривиальные изменения, которые необходимо сделать, чтобы он скомпилировал историю за пределами его среды проектирования, плюс вам нужен make-файл.