2009-03-10 13 views
2

Je travaille sur un petit utilitaire expérimental à utiliser dans notre société pour indexer les notes stockées dans notre logiciel CRM personnalisé pour la recherche de texte intégral. Ces notes sont stockées dans une base de données Btrieve (un fichier appelé NOTES.DAT). Il est possible de se connecter à la base de données et de récupérer les notes pour l'indexation en utilisant le fournisseur ADO.NET de Pervasive. Cependant, l'indexeur boucle actuellement chaque note et la réindexe toutes les 5 minutes. Cela semble grossièrement inefficace. Malheureusement, notre logiciel CRM ne peut malheureusement pas signaler au service d'indexation qu'une note a été modifiée, car il est possible que la base de données existe sur une machine distante (et les développeurs n'écriront pas de procédure). pour communiquer avec mon service sur un réseau, puisque c'est juste un projet de passe-temps pour l'instant).Détermination de la plage de début et de fin des octets modifiés dans un fichier

Plutôt que d'abandonner, j'aimerais profiter de l'occasion pour en apprendre un peu plus sur les bases de données Btrieve. Donc, voici mon plan ...

Le fichier NOTES.DAT doit être partagé, car notre logiciel CRM utilise l'API Btrieve plutôt que le pilote ODBC (ce qui signifie que les installations client doivent pouvoir voir le fichier lui-même sur le réseau). Je voudrais surveiller ce fichier (en utilisant quelque chose comme FileSystemWatcher?), Puis déterminer les octets qui ont été modifiés. En utilisant cette information, je vais essayer de calculer l'enregistrement à cette position et obtenir sa clé primaire. Ensuite, l'indexeur mettra à jour uniquement cet enregistrement en utilisant le fournisseur ADO.NET de Pervasive. Le problème (outre le fait que je ne connais pas encore la structure des fichiers Btrieve ou si la détermination de la clé primaire à partir des données brutes est possible) est que je ne sais pas comment déterminer le début et la fin plage d'octets qui ont été modifiés dans NOTES.DAT.

Je pourrais diff deux versions, mais cela signifierait stocker une copie de NOTES.DAT quelque part (et il peut être assez grand, d'où la raison d'un service d'indexation de texte intégral).

Quel est le moyen le plus efficace de le faire?

Merci!

EDIT: Il est possible d'ajouter, d'éditer ou de supprimer plus d'une note en une seule transaction. Si possible, la méthode doit pouvoir déterminer plusieurs plages d'octets distinctes.

+0

Hahaha, le curieux cas de disparition des commentaires. =) Quoi qu'il en soit, je ne suis pas une personne Windows mais d'après ce que je peux voir, FileSystemWatcher ne vous aidera pas. Vous devez probablement utiliser des API de niveau inférieur. –

+0

Correct. Je me suis dit que FileSystemWatcher ne me dirait pas quels octets ont été changés, mais j'espérais l'utiliser pour au moins m'avertir quand le fichier a été changé. J'ai juste besoin de savoir quoi faire après avoir été averti. –

+0

Espérons qu'un expert Windows (Skeet?) Vous aidera. OTOH, si garder le fichier sur une machine Linux (et peut-être partager via SAMBA) est une option, inotify pourrait faire l'affaire. –

Répondre

1

Si votre fichier NOTES.DAT est stocké sur un NTFS partition, alors vous devriez être en mesure d'effectuer une des opérations suivantes:

  • utiliser le USN journal pour identifier changes à votre fichier (préféré)
  • utiliser le volume shadow copy service pour suivre les modifications de votre fichier en prenant des instantanés périodiques via VSS (très rapide), puis:
    • diff ing versions N et (probablement pas aussi lent que la réindexation, mais toujours lent), ou
    • creuser plus profond et tenter de faire diff le $Mft pour déterminer quels blocs ont changé à quels décalages pour le fichier (s) d'intérêt (beaucoup plus complexe, mais aussi beaucoup plus rapide - mais toujours pas aussi rapide, fiable et simple que d'utiliser le journal USN)

Utilisation du journal USN devrait être votre méthode préférée.Vous pouvez utiliser l'utilitaire FSUTIL pour créer et tronquer le journal USN.