Pergunta interessante; você normalmente não vê isso como um design. Eu tenho um programa que usa uma técnica levemente semelhante para registrar o histórico, mas ele usa um formato binário. O 'arquivo de log' possui quatro partes, todas dispostas em um formato neutro à máquina:
- Um cabeçalho contendo o número mágico e o número (máximo) de entradas na lista usada e na lista livre, o número de sequência para a próxima entrada no histórico, o número real de entradas na lista usada, o número real de entradas na lista livre e o comprimento do arquivo (cada um com 4 bytes).
- A lista usada, cada entrada fornecendo um deslocamento e um comprimento (4 bytes para cada parte de cada entrada).
- A lista livre, cada entrada semelhante à entrada da lista usada.
- Os dados principais, cada registro de histórico que consiste em um conjunto contíguo de bytes finalizados por um byte de terminador nulo.
Quando um novo registro é alocado, se houver espaço na lista livre, ele substitui uma entrada lá (não necessariamente usando tudo - nesse caso, o fragmento permanece na lista livre). Quando não há espaço na lista livre, o novo espaço é alocado no final. Quando um registro antigo é rotacionado, seu espaço é movido para a lista livre e unido a quaisquer registros livres adjacentes. Ele foi projetado para lidar com instruções SQL, para que os registros possam se espalhar por muitas linhas. Este código funciona em um número especificado de registros. Ele não limita o tamanho do arquivo em si (embora não seja difícil fazê-lo).
O código principal do histórico de código está em dois arquivos, history.c e history.h, disponíveis na fonte do programa SQLCMD (minha versão, não da Microsoft; a minha existia uma década ou mais antes da Microsoft), que pode ser baixada em Arquivo de Software do Grupo Internacional de Usuários Informix . Também existe um programa de despejo de arquivo de histórico (histdump.c) e um testador de histórico (histtest.ec - ele afirma ser ESQL / C, mas é realmente um código C; uma das funções de suporte que ele chama usa algum Informix ESQL / C funções da biblioteca). Entre em contato comigo se desejar experimentar sem usar o Informix ESQL / C - veja meu perfil. Existem algumas mudanças triviais para compilar o teste de história fora do ambiente de design, além de você precisar de um makefile.