Я работаю над небольшой экспериментальной утилитой для использования в нашей компании, которая индексирует заметки, хранящиеся в нашем пользовательском программном обеспечении CRM, для полнотекстового поиска. Эти заметки хранятся в базе данных Btrieve (файл с именем NOTES.DAT). Возможно подключение к базе данных и получение заметок для индексирования с использованием провайдера Pervasive ADO.NET. Тем не менее, индексатор в настоящее время проходит каждую ноту и повторно индексирует ее каждые 5 минут. Это кажется крайне неэффективным.
К сожалению, нет никакого способа, чтобы наше программное обеспечение CRM сигнализировало службе индексирования о том, что заметка была изменена, поскольку она может существовать на удаленной машине (и разработчики не собираются писать процедуру для общаться с моим сервисом по сети, так как это просто хобби-проект на данный момент).
Вместо того, чтобы сдаваться, я хотел бы воспользоваться этой возможностью, чтобы узнать немного больше о необработанных базах Btrieve. Итак, вот мой план...
Файл NOTES.DAT должен быть общим, поскольку наше программное обеспечение CRM использует API Btrieve, а не драйвер ODBC (что означает, что установки клиента должны иметь возможность видеть сам файл в сети). Я хотел бы отслеживать этот файл (используя что-то вроде FileSystemWatcher?), А затем определять байты, которые были изменены. Используя эту информацию, я попытаюсь вычислить запись в этой позиции и получить ее первичный ключ. Затем индексист обновит только эту запись, используя провайдер Pervasive ADO.NET.
Проблема (помимо того, что я еще не совсем знаю структуру файлов Btrieve или если определение первичного ключа из необработанных данных возможно) заключается в том, что я не знаю, как определить начальный и конечный диапазон байтов, которые были изменены в NOTES.DAT.
Я мог бы различать две версии, но это означало бы хранение копии NOTES.DAT где-нибудь (и она может быть довольно большой, следовательно, причина для полнотекстовой службы индексирования).
Каков наиболее эффективный способ сделать это?
Спасибо!
EDIT: возможно, что в одной транзакции добавляется, редактируется или удаляется более одной заметки, поэтому, если это возможно, метод должен иметь возможность определять несколько отдельных диапазонов байтов.
Если ваш файл NOTES.DAT
хранится на разделе NTFS, вы должны иметь возможность выполнить одно из следующих действий:
diff
версии N
и N-1
(возможно, не так медленно, как переиндексация, но все же медленная) илиdiff
$Mft
, чтобы определить, какие блоки изменились, при каких смещениях для интересующего (ых) файла (гораздо более сложного, но также намного более быстрого, но все же не столь быстрого, надежного и просто, как использование журнала USN)Использование журнала USN должно быть вашим предпочтительным методом. Вы можете использовать утилиту FSUTIL
для создания и обрезания журнала USN.