-
Refactor DP_Irbis64Native to pure PHP, implement advanced search and dictionary merging (clean)
-
Реализация нативного провайдера БД ИРБИС 64 (DP_Irbis64Native) на чистом PHP
Обновление модуля DPIrbis64Native, которое реализует полный цикл работы с базами данных ИРБИС 64 (чтение, запись, поиск, актуализация словарей, выполнение GBL и печать) средствами PHP без необходимости использования расширения phpirbis64.dll.
Основные архитектурные и функциональные изменения:
-
Движок базы данных и файловые операции:
- Реализованы классы для бинарного чтения/записи форматов MST, XRF, N01, L01 и IFP.
- Добавлен менеджер транзакций (IrbisTransactionManager) с использованием
.jou файлов, обеспечивающий атомарность операций сохранения и автоматическое восстановление БД при сбоях.
- Добавлено автоопределение формата XRF (8 или 12 байт) для поддержки баз ИРБИС 64 и ИРБИС 64+.
- Реализован механизм блокировок записей (RecLock, RecUnlock, RecLockTime).
-
Индексирование и актуализация словарей:
- Разработаны парсер FST-файлов (FstProcessor) и механизм извлечения терминов (TermExtractor).
- Написаны классы актуализации (Inverter, TreeManager, IfpManager), которые перестраивают B-дерево (N01/L01) и файл постингов (IFP) "на лету" при изменении записей.
- Улучшено чтение словарей (GetTermList): добавлена поддержка фильтрации префиксов, сортировки по числу постингов и пропуска нулевых ссылок.
-
Глобальная корректировка (GBL) и контроль:
- Создан собственный движок
GblEngine для выполнения команд глобальной корректировки.
- Реализована поддержка AutoIn (ApplyAutoin) и форматно-логического контроля (CheckFLC) перед сохранением записи (HandleRecordSave).
-
Полнотекстовый поиск (FT) и извлечение текста:
- Разработан
FullTextInverter для автоматического создания полнотекстового индекса во вложенной базе TEXT.
- В модуль
FT добавлена функция ExtractText для извлечения текста из PDF и офисных документов с использованием pdftotext, mutool, COM-объектов (на Windows) и Pandoc.
-
Вывод, статистика и поиск:
- Полностью реализована генерация табличных и статистических форм в формат RTF на стороне сервера (Print.inc, Stat.inc).
- В поиске (Search) улучшена работа с последовательным поиском и ограничениями выборки (FirstMfn, NumMfn).
- Добавлена возможность массового форматирования записей по массиву или диапазону MFN (RecFormatMfn, RecFormatMfnRange).
-
Системные улучшения:
- Модуль
i128f теперь умеет напрямую парсить irbis*server.ini (GetServerIni, getServerValue), что позволило отказаться от функции irbis*server_ini().
- В модуль
General добавлены функции mb*strcmp и mb*strcasecmp на базе Collator для корректной сортировки UTF-8 строк.
- Оптимизирована логика нормализации путей (CorPath, PathLowerCase).
- В модуле
TestA добавлены страницы для отладки Bдерева (IndexDebug.page) и сравнения работы нативного провайдера с Directверсией (TestNative.page).
-
- DP_Irbis64Native/Print.inc:
- Переработана логика генерации печатных RTF-отчетов.
- Улучшен парсинг файлов таблиц (.tbu): добавлена обработка заголовков (Header), форматов (Tab), итогов (sum) и многостраничных/связанных таблиц (NextTab).
- Реализована автонумерация строк (тег numeration).
- Переписан механизм сортировки записей перед печатью (SortRecords).
- Добавлена явная инициализация провайдера DP_Irbis64Native при формировании отчета.
- DP_Irbis64Native/Stat.inc:
- Оптимизирован процесс построения статистики: методы AddItemToStat и AddItemToStatFormat теперь принимают mfn и самостоятельно читают запись из контекста.
- Улучшено формирование итогового RTF-файла: теперь используются системные константы табличной верстки (например, HEADER_RTF1, HeadStatTab, TwoCell и др.) вместо жестко закодированных строк.
- Добавлена обработка опций формата (PftOpt) при стат. анализе.
- DP_Irbis64Native/GetFile.inc & prvGetFilePath.inc:
- Добавлена поддержка позиционных аргументов для обратной совместимости и упрощенного вызова (преобразование аргументов в массив $params).
- Format/Format64.inc:
- Расширена функция загрузки форматов loadFormat: добавлена автоматическая подстановка форматов по умолчанию на основе $db->PftOpt, если передано имя @.
- TestA/TestNative.page:
- Ужесточены тесты проверки генерации RTF: допустимая погрешность в размере файлов снижена с 500 до 50 байт.
- В вывод результатов теста добавлено отображение точной разницы (diff), если проверка не пройдена.
-
Провайдер уже может функционировать в качестве основного.
Есть еще проблемы в сохранении записей - тут требуется отладка (пока ломает индексные файлы)
DP_Irbis64Native: актуализация, B-деревья, GBL и защита от рекурсий
Core / Базовые классы:
- В классы
ObjectData, ObjectModule и ObjectRecordData добавлена надежная защита от бесконечной рекурсии (переполнения стека) в магических методах *_call с использованием счетчика $*callDepth (лимит 150 вызовов) и конструкции try...finally.
Движок DP_Irbis64Native (Индексация и Словари):
- Реализована полноценная поддержка работы с B-деревьями словарей (
TreeManager): добавлены алгоритмы разделения переполненных узлов (splitLeaf, splitIndex), продвижение ключей и очистка пустых узлов для файлов N01/L01.
- Глобальная переработка извлекателя терминов (
TermExtractor): теперь поддерживаются все основные методы индексирования FST (с 0 по 9), обработка префиксов, извлечение слов, работа со стоп-словами, а также функции управления регистром (MHL/MPL).
- Внедрен механизм дельта
индексирования (Inverter::actualize): корректное сравнение текущей и предыдущей актуализированной версий записи для добавления/удаления постингов в IFPцепочках.
- В файлы L01, N01, IFP, MST внедрен
safeFwrite для записи изменений в рамках единой транзакции (IrbisTransactionManager).
Мастер-файл (MST) и XRF:
- Добавлен алгоритм
ReadLastActualizedRecord в MstSpace. Позволяет отследить по цепочке nxt (лидер записи) предыдущую актуализированную версию (Undo/History) для дельта-индексации.
- Реализованы методы актуализации
ActualizeRecord и ActualizeDatabase. При успешном обновлении словаря автоматически сбрасываются биты BIT*NOTACT*REC в .xrf и лидере .mst.
- В
MstFile оптимизировано парсирование подполей (ParseField) для увеличения скорости работы.
Поиск и Глобальная корректировка (GBL):
- Полностью переписан движок
GblEngine. Добавлена работа с циклами (REPEAT..UNTIL), условиями (IF..FI), вложенными вызовами (@include), а также поддержка расширенных команд: ADD, DEL, REP, COR, CHA, DEFFLD, GETFLD, PUTFLD, NEWREC, UNDOR.
- Расширен
IrbisTokenizer — улучшена логика токенизации ISIS-запросов (кавычки, стандартные операторы ИРБИС).
- В API поиска (
Search.inc, RecSearch.inc и др.) реализована поддержка прямого/обратного чтения по диапазону MFN (FirstMfn, NumMfn) в случае пустого поискового запроса.
Модуль Format:
- Добавлена защита от циклических зависимостей при вложенных вызовах форматов через массив
self::$loadingFormats.
- Полностью переписаны реализации команд Unifor:
M (оперирование датами и временем) и S (сравнение строк и изменение регистра)
Документация:
- В каталог
Help/ модуля DP_Irbis64Native добавлены подробные описания физических структур файлов ИРБИС64: .mst, .xrf, .n01, .l01, .ifp.
-
Рефакторинг логики словаря (IFP), поддержка Unicode-баз и синхронизация статусов MST/XRF
- Обновление формата структур постингов (IFP): Устаревший флаг $is2017Compatible заменен на более семантически точный $is32Bit. Теперь расширенная 32
байтовая структура ссылок (вместо стандартной 16байтовой) применяется не только для полнотекстовых баз ИРБИС64+ (Is2018Plus), но и для баз в кодировке Unicode (IsUnicode). Изменения применены в классах IfpPostingRec, IfpSpecialRec, IfpFile, IfpManager и FstProcessor.
- Исправление логики записи в инвертированный файл (.ifp): В IfpManager при выделении новых блоков смещение теперь вычисляется на основе указателя в управляющей записи словаря (CntrlIfp->nxt), а не простого перехода в конец файла (SEEK_END). После записи указатель nxt обновляется и управляющая запись корректно сохраняется, что поддерживает целостность структуры файла.
- Синхронизация актуализации XRF и MST: В классе IrbisSpaceNative исправлено снятие флагов неактуализированной записи (BITNOTACTREC и BITNOTACTFULLTEXT_REC). Теперь при актуализации записи эти флаги снимаются не только в файле перекрестных ссылок .xrf, но и синхронно обновляются в лидере (MstRecLeader) текущей версии записи в главном файле .mst. Это необходимо для корректного прохождения диагностики утилитой irbistool diaglnk.
-
Поддержка DP_Irbis64Native в качестве основного провайдера
-
Рефакторинг, оптимизация производительности и документирование модуля DP_Irbis64Native
- Очистка отладочного кода (Clean up)
- Удалены вызовы записи отладочной информации в файлы (fileputcontents('debug.txt', ...)), которые использовались при разработке TreeManager, InvTermInfo, InvBlockRec, Inverter и других компонентов.
- Из api.php удален метод DbgLog, а из call/RecReadSrv.inc и call/Search.inc удалены его вызовы.
- Удален устаревший или неиспользуемый файл include/UniforUtils.inc.
- Документирование (PHPDoc)
- Проведено документирование кодовой базы: во все классы в директории include/ добавлены PHPDoc-блоки для свойств, методов и их параметров.
- Оптимизация производительности
- TermExtractor: Существенно оптимизировано извлечение поисковых терминов.
- Проверка стоп-слов переведена с in_array на использование ключей ассоциативного массива (isset), что дает сложность O(1).
- Добавлено кэширование результатов форматирования ($formatCache).
- Вместо создания новых объектов IfpPostingRec в цикле используется клонирование заранее подготовленного прототипа.
- Тяжелые строковые функции и регулярные выражения (pregsplit, pregmatchall) оптимизированы или заменены на более быстрые аналоги (explode, strreplace).
- N01File: Внедрено LRU
подобное кэширование блоков Bдерева в памяти ($this->cache с лимитом в 1000 элементов) для минимизации обращений к диску при поиске и вставке терминов.
- Архитектурный рефакторинг
- Логика B-дерева: Алгоритм расщепления переполненных узлов (L01 и N01) перенесен из TreeManager в новый метод Split() класса InvBlockRec. Это инкапсулирует логику управления структурой блока внутри самого блока.
- IfpManager: Убрана прямая зависимость от IfpFile. Теперь менеджер работает через фасад InvSpace, что делает систему более модульной.
- InvSpace: Расширен функционал фасада. Добавлены методы
обертки для работы с терминами (addTerm, removeTerm), управления указателями в IFPфайле (IfpSeek, IfpTell), а также управления записью блоков (WriteIfpBlock, WriteIfpPostings).
-
перенос GblEngine из DP_Irbis64Native в GlobalCorrection
- Файл GblEngine.php перемещен в модуль GlobalCorrection (modules/GlobalCorrection/include/)
- В API модуля GlobalCorrection добавлен метод GetEngine() для инстанцирования ядра
- В скриптах ApplyAutoin, GBLRecord и HandleGBL заменено прямое создание объекта на вызов UseModule('GlobalCorrection')->GetEngine()
- Удалены лишние require_once
- В GblEngine удалена зависимость от XpftConst, константа XpftConst::BITLOGDEL заменена на глобальную BITLOGDEL
-
Упрощение вызова чтения постингов в IndexDebug
Заменены цепочки вызовов $invSpace~~>getIfpFile()~~>ReadPostings() на прямое обращение к методу $invSpace->ReadIfpPostings().
-
Оптимизация и рефакторинг логики извлечения повторений подполей (GetSubField)
- Сложный итеративный поиск подполей с использованием
mb*strpos и mb*substr в цикле заменен на более эффективное и читаемое разбиение строки с помощью explode().
- Упрощена логика извлечения конкретного повторения подполя (
$sfOcc).
- Изменена логика обработки первого повторения (
$sfOcc === 1): теперь при наличии маркеров корректно возвращается значение самого подполя (после маркера ^), а не предшествующий первому маркеру текст. Если маркеров в строке нет — возвращается вся строка.
- Улучшена общая читаемость кода и устранена избыточность строковых операций.