Цікаве запитання; ти зазвичай не сприймаєш це як дизайн. У мене є програма, яка використовує мало схожу техніку для запису історії, але вона використовує двійковий формат. Файл журналу складається з чотирьох частин, усі вони викладені в нейтральному для машини форматі:
- Заголовок, що містить магічне число та (максимальну) кількість записів у використаному списку та вільному списку, порядковий номер наступного запису історії, фактичну кількість записів у використаному списку, фактичну кількість записів у вільному списку , і довжина файлу (кожен з яких - 4 байти).
- Список, що використовується, кожен запис дає зміщення та довжину (4 байти для кожної частини кожного запису).
- Безкоштовний список, кожен запис аналогічний використаному списку.
- Основні дані, кожен запис історії складається з суміжного набору байтів, що закінчуються нульовим байтом термінатора.
Коли виділяється нова запис, якщо у вільному списку є пробіл, вона перезаписує запис (не обов’язково використовуючи його весь - у цьому випадку фрагмент залишається у вільному списку). Коли у вільному списку немає місця, то в кінці виділяється новий пробіл. Коли старий запис обертається, його простір переміщується у вільний список і поєднується з будь-якими суміжними вільними записами. Він призначений для обробки операторів SQL, щоб записи могли бути розповсюджені по багатьох рядках. Цей код працює на певній кількості записів. Він не обмежує розмір файлу сам по собі (хоча зробити це не важко).
Основний код історії коду є у двох файлах, history.c та history.h, доступних у джерелі для програми SQLCMD (моя версія, а не Microsoft; моя існувала за десять років і більше до Microsoft), яку можна завантажити з архіву програмного забезпечення Міжнародної групи користувачів Informix . Існує також програма демпінгу файлів історії (histdump.c) та тестер історії (histtest.ec - він стверджує, що це ESQL / C, але сам по собі справді код C; одна з функцій підтримки, яку він викликає, використовує деякі Informix ESQL / C функції бібліотеки). Зверніться до мене, якщо ви хочете експериментувати без використання Informix ESQL / C - дивіться мій профіль. Існує кілька дрібницьких змін, щоб зробити його для компіляції histtest поза його дизайнерською середовищем, плюс вам потрібен makefile.