Pergunta

Eu estou trabalhando em um pequeno utilitário experimental para usar dentro de nossa empresa que indexa notas armazenadas em nosso software personalizado CRM para pesquisa de texto completo. Estas notas são armazenadas em um banco de dados Btrieve (um arquivo chamado NOTES.DAT). É possível conectar ao banco de dados e recuperar as notas de indexação usando provedor ADO.NET da Pervasive. No entanto, o indexador laços actualmente através de cada nota e re-it índices a cada 5 minutos. Isto parece extremamente ineficiente.

Infelizmente, não há nenhuma maneira para o nosso software de CRM para sinal para o serviço de indexação que uma nota foi alterada, porque é possível para o banco de dados de existir em uma máquina remota (e os desenvolvedores não estão indo para escrever um procedimento para comunicar com o meu serviço através de uma rede, uma vez que é apenas um hobby por agora).

Ao invés de desistir, eu gostaria de aproveitar esta oportunidade para aprender um pouco mais sobre bancos de dados Btrieve matérias. Então, aqui vai o meu plano ...

O arquivo NOTES.DAT tem que ser compartilhada, pois o nosso software CRM usa a API do Btrieve em vez do driver ODBC (o que significa que as instalações de cliente tem que ser capaz de ver o próprio arquivo na rede). Gostaria de monitorar o arquivo (usando algo como FileSystemWatcher?) E, em seguida, determinar os bytes que foram alterados. Usando essa informação, vou tentar calcular o registro nessa posição e obter sua chave primária. Em seguida, o indexador irá atualizar somente esse registro usando o provedor ADO.NET da Pervasive.

O problema (além do fato de que eu não sei bem a estrutura do Btrieve arquivos ainda ou se determinar a chave primária dos dados brutos é possível) é que eu não sei como para determinar o intervalo de início e fim de bytes que foram alterados em NOTES.DAT.

que eu poderia diff duas versões, mas isso significaria armazenar uma cópia de NOTES.DAT algum lugar (e ele pode ser bastante grande, daí a razão para um serviço de indexação de texto completo).

O que é a maneira mais eficiente de fazer isso?

Obrigado!

EDIT:. É possível que mais de uma nota a ser adicionado, editado ou excluído em uma transação, por isso, se possível, o método precisa ser capaz de determinar vários intervalos de bytes separado

Foi útil?

Solução

Se o seu arquivo NOTES.DAT é armazenada em um NTFS partição , então você deve ser capaz de execute um dos seguintes:

  • usar o USN revista para identificar muda ao seu arquivo (preferencial)
  • usar o Volume Shadow Copy Service para rastrear alterações no seu arquivo tomando instantâneos periódicos através VSS (muito rápido), e então:
    • diffing versões N e N-1 (provavelmente não tão lento como reindexação, mas ainda lento), ou
    • aprofundando e tentando fazer diff o $Mft para determinar quais blocos alterados a que compensa para o arquivo (s) de interesse (muito mais complexo, mas também muito mais rápido - mas ainda não tão rápido, fiável e simples como usar o USN Journal)

Usando o diário USN deve ser o seu método preferido. Você pode usar o utilitário FSUTIL para criar e truncar o diário USN.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top