Pregunta

Estoy trabajando en una pequeña utilidad experimental para usar dentro de nuestra empresa que indexa las notas almacenadas en nuestro software CRM personalizado para la búsqueda de texto completo. Estas notas se almacenan en una base de datos Btrieve (un archivo llamado NOTES.DAT). Es posible conectarse a la base de datos y recuperar las notas para indexar utilizando el proveedor ADO.NET de Pervasive. Sin embargo, el indexador actualmente recorre cada nota y la vuelve a indexar cada 5 minutos. Esto parece extremadamente ineficiente.

Desafortunadamente, nuestro software CRM no puede indicarle al servicio de indexación que se ha cambiado una nota, porque es posible que la base de datos exista en una máquina remota (y los desarrolladores no van a escribir un procedimiento para comunicarme con mi servicio a través de una red, ya que es solo un proyecto de hobby por ahora).

En lugar de rendirme, me gustaría aprovechar esta oportunidad para aprender un poco más sobre las bases de datos Btrieve en bruto. Entonces, aquí está mi plan ...

El archivo NOTES.DAT debe compartirse, ya que nuestro software CRM utiliza la API Btrieve en lugar del controlador ODBC (lo que significa que las instalaciones del cliente deben poder ver el archivo en la red). Me gustaría monitorear este archivo (¿usando algo como FileSystemWatcher?) Y luego determinar los bytes que se cambiaron. Usando esa información, intentaré calcular el registro en esa posición y obtener su clave principal. Luego, el indexador actualizará solo ese registro utilizando el proveedor ADO.NET de Pervasive.

El problema (además del hecho de que todavía no conozco la estructura de los archivos Btrieve o si es posible determinar la clave primaria a partir de los datos sin procesar) es que no sé cómo determinar el rango inicial y final de bytes que se cambiaron en NOTES.DAT.

Podría diferir dos versiones, pero eso significaría almacenar una copia de NOTES.DAT en algún lugar (y puede ser bastante grande, de ahí la razón de un servicio de indexación de texto completo).

¿Cuál es la forma más eficiente de hacer esto?

¡Gracias!

EDITAR: es posible agregar, editar o eliminar más de una nota en una transacción, por lo que si es posible, el método debe poder determinar múltiples rangos de bytes separados.

¿Fue útil?

Solución

Si su archivo NOTES.DAT está almacenado en una partición NTFS , entonces deberías poder realizar una de las siguientes acciones:

  • use la revista USN para identificar cambios a su archivo (preferido)
  • use el servicio de instantáneas de volumen para realizar un seguimiento de los cambios en su archivo al tomar instantáneas periódicas VSS (muy rápido), y luego:
    • diff ing versiones N y N-1 (probablemente no tan lento como reindexar, pero aún así lento), o
    • profundizando e intentando hacer diff el $ Mft para determinar qué bloques cambiaron en qué compensaciones para los archivos de interés (mucho más complejo, pero también mucho más rápido, pero aún así no es tan rápido, confiable y simple como usar el diario USN)

Usar el diario USN debería ser su método preferido. Puede utilizar la utilidad FSUTIL para crear y truncar el diario USN.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top