Frage

Ich bin auf einem kleines experimentelles Programm arbeite innerhalb unseres Unternehmens zu verwenden, die Indizes Notizen in unserer eigenen CRM-Software für die Volltextsuche gespeichert. Diese Hinweise sind in einer Btrieve-Datenbank gespeichert (eine Datei NOTES.DAT genannt). Es ist möglich, die Datenbank zu verbinden und die Hinweise für die Indizierung abrufen von Pervasive der ADO.NET-Provider verwenden. Allerdings Schleifen der Indexer zur Zeit durch jede Note und indexiert sie alle 5 Minuten. Dies scheint höchst ineffizient.

Leider gibt es keine Möglichkeit für unsere CRM-Software auf den Indexdienst zu signalisieren, dass eine Note geändert wurde, weil es möglich ist, für die Datenbank auf einem entfernten Rechner vorhanden ist (und die Entwickler kein Verfahren zu gehen schreiben kommunizieren mit meinem Service über ein Netzwerk, da es jetzt nur ein Hobby-Projekt ist).

Anstatt aufgeben, ich möchte diese Gelegenheit nutzen, um ein wenig mehr über rohe Btrieve Datenbanken zu lernen. So, hier ist mein Plan ...

Die NOTES.DAT Datei hat gemeinsam genutzt werden, da unsere CRM-Software, um die Btrieve API anstelle der ODBC-Treiber verwendet (was bedeutet, Client-Installationen in der Lage sein, die Datei selbst im Netz zu sehen). Ich mag diese Datei überwachen (mit so etwas wie Filesystemwatcher?) Und dann den Bytes bestimmen, die geändert wurden. Mit Hilfe dieser Informationen, werde ich versuchen, den Datensatz an dieser Position zu berechnen und ihren Primärschlüssel zu erhalten. Dann wird der Indexer nur aktualisieren, damit dieser Datensatz des Pervasive ADO.NET-Provider verwendet wird.

Das Problem (neben der Tatsache, dass ich die Struktur der Btrieve weiß nicht recht, Dateien noch oder wenn der Primärschlüssel aus der Rohdaten Bestimmung möglich ist) ist, dass ich weiß nicht, wie die Start- und End-Bereich zu bestimmen, von Bytes, die in NOTES.DAT verändert wurden.

Ich kann zwei Versionen diff, aber das würde bedeuten, eine Kopie von NOTES.DAT Speicher irgendwo (und es kann ziemlich groß sein, daher auch der Grund für eine Volltextindizierung Dienst).

Was ist der effizienteste Weg, dies zu tun?

Danke!

EDIT:. Es ist möglich, dass mehr als eine Note in einer Transaktion hinzugefügt, bearbeitet oder gelöscht werden, so dass, wenn möglich, das Verfahren mehr separaten Bytebereichen um zu bestimmen, muss in der Lage sein

War es hilfreich?

Lösung

Wenn Sie Ihre NOTES.DAT Datei auf einem NTFS-Partition gespeichert ist, dann sollten Sie in der Lage sein, führen Sie eine der folgenden Möglichkeiten:

  • verwenden, um das USN-Journal zu identifizieren Änderungen zu Ihrer Datei (bevorzugt)
  • verwenden, um die Volume Shadow Copy Service indem periodisch Snapshots Dateien Änderungen verfolgen durch VSS (sehr schnell), und dann entweder:
    • diffing Versionen N und N-1 (wahrscheinlich nicht so langsam wie Reindizierung, aber immer noch langsam), oder
    • Tiefer und versuchen, die diff zu tun $Mft, um zu bestimmen, welche Blöcke geändert, bei dem für die Datei (en) von Interesse (viel komplexe, aber auch viel schneller ausgleicht - und doch noch nicht so schnell, zuverlässig und einfach wie mit der USN-Journal)

Mit dem USN-Journal sollte Ihre bevorzugte Methode sein. Sie können die FSUTIL Dienstprogramm das USN-Journal zu erstellen und zu kürzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top