Câu hỏi thú vị; bạn thường không xem đó là một thiết kế. Tôi có một chương trình sử dụng một kỹ thuật tương tự mờ nhạt để ghi lại lịch sử, nhưng nó sử dụng định dạng nhị phân. 'Tệp nhật ký' có bốn phần, tất cả được trình bày ở định dạng trung lập máy:
- Một tiêu đề chứa số ma thuật và số lượng mục (tối đa) trong danh sách được sử dụng và danh sách miễn phí, số thứ tự cho mục lịch sử tiếp theo, số mục thực tế trong danh sách được sử dụng, số mục thực tế trong danh sách miễn phí và độ dài của tệp (mỗi tệp là 4 byte).
- Danh sách được sử dụng, mỗi mục nhập có độ lệch và độ dài (4 byte cho mỗi phần của mỗi mục).
- Danh sách miễn phí, mỗi mục tương tự như mục nhập danh sách được sử dụng.
- Dữ liệu chính, mỗi bản ghi lịch sử bao gồm một tập hợp các byte liền kề được kết thúc bởi một byte kết thúc null.
Khi một bản ghi mới được phân bổ, nếu có không gian trong danh sách miễn phí, thì nó sẽ ghi đè lên một mục ở đó (không nhất thiết phải sử dụng tất cả - trong trường hợp đó đoạn vẫn nằm trong danh sách miễn phí). Khi không có không gian trong danh sách miễn phí, thì không gian mới sẽ được phân bổ ở cuối. Khi một bản ghi cũ quay ra, không gian của nó được chuyển sang danh sách miễn phí và kết hợp với bất kỳ bản ghi miễn phí liền kề nào. Nó được thiết kế để xử lý các câu lệnh SQL để các bản ghi có thể được trải rộng trên nhiều dòng. Mã này hoạt động trên một số lượng hồ sơ xác định. Nó không giới hạn kích thước của tệp mỗi se (mặc dù sẽ không khó để làm như vậy).
Mã lịch sử mã chính nằm trong hai tệp, history.c và history.h, có sẵn từ nguồn cho chương trình SQLCMD (phiên bản của tôi, không phải của Microsoft; của tôi đã tồn tại một thập kỷ trở lên trước Microsoft), có thể được tải xuống từ Lưu trữ phần mềm của nhóm người dùng thông tin quốc tế . Ngoài ra còn có chương trình kết xuất tệp lịch sử (histdump.c) và trình kiểm tra lịch sử (histtest.ec - nó tự xưng là ESQL / C, nhưng bản thân nó thực sự là mã C, một trong những chức năng hỗ trợ mà nó gọi sử dụng một số Informix ESQL / C chức năng thư viện). Liên hệ với tôi nếu bạn muốn thử nghiệm mà không sử dụng Informix ESQL / C - xem hồ sơ của tôi. Có một số thay đổi nhỏ để làm cho nó biên dịch histtest bên ngoài môi trường thiết kế của nó, cộng với bạn cần một makefile.