Domanda

Sto lavorando a una piccola utility sperimentale da utilizzare all'interno della nostra azienda che indicizza le note memorizzate nel nostro software CRM personalizzato per la ricerca full-text. Queste note sono memorizzate in un database Btrieve (un file chiamato NOTES.DAT). È possibile connettersi al database e recuperare le note per l'indicizzazione utilizzando il provider ADO.NET di Pervasive. Tuttavia, l'indicizzatore attualmente scorre ogni nota e la reindicizza ogni 5 minuti. Questo sembra gravemente inefficiente.

Sfortunatamente, il nostro software CRM non ha modo di segnalare al servizio di indicizzazione che una nota è stata modificata, perché è possibile che il database esista su una macchina remota (e gli sviluppatori non scriveranno una procedura su comunicare con il mio servizio su una rete, poiché per ora è solo un progetto hobby).

Piuttosto che arrendermi, vorrei cogliere l'occasione per saperne di più sui database grezzi di Btrieve. Quindi, ecco il mio piano ...

Il file NOTES.DAT deve essere condiviso, poiché il nostro software CRM utilizza l'API Btrieve anziché il driver ODBC (il che significa che le installazioni client devono essere in grado di vedere il file stesso sulla rete). Vorrei monitorare questo file (usando qualcosa come FileSystemWatcher?) E quindi determinare i byte che sono stati modificati. Usando queste informazioni, proverò a calcolare il record in quella posizione e ad ottenere la sua chiave primaria. Quindi l'indicizzatore aggiornerà solo quel record usando il provider ADO.NET di Pervasive.

Il problema (oltre al fatto che non conosco ancora abbastanza la struttura dei file Btrieve o se è possibile determinare la chiave primaria dai dati grezzi) è che non so come determinare l'intervallo di inizio e fine di byte che sono stati modificati in NOTES.DAT.

Potrei diffondere due versioni, ma ciò significherebbe archiviare una copia di NOTES.DAT da qualche parte (e può essere abbastanza grande, quindi il motivo di un servizio di indicizzazione full-text).

Qual è il modo più efficiente per farlo?

Grazie!

EDIT: è possibile aggiungere, modificare o eliminare più di una nota in una transazione, quindi, se possibile, il metodo deve essere in grado di determinare più intervalli di byte separati.

È stato utile?

Soluzione

Se il file NOTES.DAT è archiviato in una partizione NTFS , dovresti essere in grado di eseguire una delle seguenti operazioni:

  • utilizza il diario USN per identificare modifiche al tuo file (preferito)
  • utilizza il servizio di copia shadow del volume per tenere traccia delle modifiche al tuo file eseguendo istantanee tramite VSS (molto veloce) e quindi:
    • diff ing versioni N e N-1 (probabilmente non lenti come la reindicizzazione, ma comunque lenti) o
    • approfondendo e tentando di fare diff il $ Mft per determinare quali blocchi sono cambiati in quali offset per i file di interesse (molto più complessi, ma anche molto più veloce - ma non ancora così veloce, affidabile e semplice come usare la rivista USN)

L'uso del diario USN dovrebbe essere il tuo metodo preferito. Puoi utilizzare l'utilità FSUTIL per crea e tronca il diario USN.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top