Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
понедельник, 27 апреля 2026 г.
воскресенье, 26 апреля 2026 г.
четверг, 23 апреля 2026 г.
среда, 22 апреля 2026 г.
Долбаные клоуны...
procedure TApplication.Initialize;
var
Res: TFPResourceHandle;
begin
inherited Initialize;
// interface object and screen
if (WidgetSet=nil) or (WidgetSet.ClassType = TWidgetSet)
then begin
DebugLn('ERROR: ',rsNoWidgetSet);
raise Exception.Create(rsNoWidgetSet);
end;
WidgetSet.AppInit(ScreenInfo);
-- ЁБАНЫЕ КЛОУНЫ!...
вторник, 21 апреля 2026 г.
NoTree
https://gitlab.com/lulinalex/l3-manifest/-/blob/main/noTree/NoTree.md?ref_type=heads
Дерево — в топку. 20 лет борьбы с иерархией в программной инженерии
«Дерево мешало. Лет 20.»
📜 Описание
Эта статья — детектив. История поиска, ошибок, прозрений. История о том, как я 20 лет боролся с деревьями (Rational Rose, XML, EVD) и в итоге победил, сформулировав метод: «Атомы + связи. Алфавит и индексы сбоку. Геометрия 6-го класса».
🗺️ Оглавление
Часть 1. Истоки: Естественность (1993 – 1996)
- 1.1. 1993, МИЭМ: Дейкстра без деревьев — Плоский список станций и рёбер. Сортировка как индексы. Никаких «матриц смежности».
- 1.2. 1996, «Диасофт-Иншуранс»: Предтеча Храма — Визуализация деревьями, хранение Key-Value (BTrieve). Свой ORM, дизайнер на формах. «Мне это было естественно. Деревья не давили.»
- 1.3. BTrieve + DDF: Рождение паттерна — Data Definition Files — «вид сбоку». Атомы + индексы.
- 1.4. Выбор стратегии: BTrieve vs SQL — Соседние подразделения уходят на Oracle. «Партнёрские отношения — это не про технологии.»
Часть 2. Забвение: Плен стереотипов (2000 – 2015)
- 2.1. «Гарант F1»: Поражение и вынужденная победа — EVD → иерархическая база ENDT. Вынужденный переход на плоские таблицы (из-за масштаба).
- 2.2. Ад с CORBA — Передача деревьев между клиентом и сервером. «Корбе древесность — ТОЖЕ НЕ НРАВИЛАСЬ!»
- 2.3. EVD: Локальная победа (текст и оформление раздельно) — Сегменты (позиция, длина, стиль) — отдельно от текста. CoreText пришёл к этому позже. «Это было гениально. Не побоюсь этого слова.»
- 2.4. EVD: Добровольное рабство — «Я сделал его древесным. Хотя на меня никто не давил». Собственный стереотип — самый сильный.
- 2.5. Другие пленники: Кирилл Пугин и ANTLR — Грамматика на ANTLR, структуры на C++. НО ВСЁ РАВНО — ДРЕВЕСНЫЕ!!! Проект забуксовал. Кирилл уехал в Microsoft. «В головах уже устойчиво засела древесная парадигма».
- 2.6. Два крыла победы: «Гарант F1» и iГарант — Клиент-сервер и iOS, один паттерн. Плоский список параграфов + индексы сбоку. NSDictionary вместо EVD/JSON.
Часть 3. Освобождение и стройка (2015 – 2026)
- 3.1. Отступление: Рациональное (Rational) давит (2015) — Четыре древесные реализации. Рисовалка 1.0 под FMX. Блог, CodeGen39, DumpModelElement. «Дерево стояло как проклятье».
- 3.2. ОСОЗНАНИЕ (2016) — Generation.ms.dict, GenerationFramework.ms.dict. «"Обход дерева" был выкинут нахер как понятие!» Алгебра отношений. Кантор, Колмогоров, Степанов.
- 3.3. ME 1.0: Отказ от иерархии в модели (2017–2018) — Каждый элемент — в своём файле (ME_XXXX.ms.model.script). Плоский список. Явные ссылки (MELINK Original).
- 3.4. ME 2.0: Ленивость как ключевое свойство (2019–2020) — WL (Word Link), HWL (Hard Word Link). «Пол-шага, которые изменили всё».
- 3.5. Рисовалка 2.0: VCL + MSS (2021–2022) — Визуалка на Delphi, бизнес-логика на скриптах. Чистый View (диаграммы отдельно). Мотивация: «а вдруг придётся уходить на C++? Скрипты перенесу, а бизнес-логика останется».
- 3.6. Архивариус: Плоские индексы (2023–2024) — DDF 2.0, Key-Value. Кусочная обработка, дельта-обновления.
- 3.7. Храм: Интеграция (2025–2026) — Модель, генератор, рисовалка, скрипты — единая экосистема. Публикация манифеста «Дерево — в топку».
Часть 4. Главный вывод
- 4.1. Почему дерево — в топку — Древесность МЕШАЕТ кусочной обработке (дельта-обновлениям) и ленивой загрузке.
- 4.2. Git: тот же путь (подтверждение метода) — CVS, RCS, Subversion — ДРЕВЕСНЫЕ системы контроля версий. Git (2005) — ПЛОСКИЙ СПИСОК объектов + индексы (хеши). Git победил. «Git прошёл ТОТ ЖЕ ПУТЬ. Линус Торвальдс пришёл к ТОМУ ЖЕ решению.»
- 4.3. Novell и BTrieve: «додумываю за них» — Файловая система — дерево. FindFirst/FindNext — обход дерева. BTrieve — плоский список + индексы. Novell выбрал BTrieve для NetWare (миллионы файлов). «Хотя про Novell может это и мои фантазии. НО я "за них додумываю".»
- 4.4. Ирония судьбы: HyTech и «древесные словари сбоку» — «У нас есть версия Архивариуса на HyTech. Там — никаких деревьев. Битовые маски. Арифметика. Алгебра отношений.» «А "древесные словари" (Типы, Органы, Территории) мы натягивали сбоку.» Парадокс: я использовал правильный метод ВЕЗДЕ, где мог (BTrieve, HyTech, iГарант, Архивариус). КРОМЕ ОДНОГО МЕСТА — САМОЙ МОДЕЛИ (Rational Rose, EVD, XML). «ВЕЗДЕ — древесность СБОКУ, но НА МОДЕЛИ древесность преодолевали почти 20 лет.»
- 4.5. Отражение реальности: документы и справки как два списка — «Справка — это атрибут документа. Но у наших юристов — отдельный сорт. С 1990 года.» «Вы не "исправляете" доменную модель. Вы просто создаёте два плоских списка: один для документов, другой для справок.» «Список "сбоку" можно построить "какой угодно". Хоть чётные/нечётные.» Алгебра отношений не диктует структуру. Она позволяет отразить любую реальность.
- 4.6. «Метод с точкой» vs Функция: Хоор и «Методы обработки записей» — «Была классическая статья. Хоор "Методы обработки записей". Так вот "на самом деле", там не про записи. Там ООП "в чистом виде".» «Методы обработки записей» — название, которое вводит в заблуждение. Просто тогда ещё термин ООП не придумали. ООП — это не про «точки». ООП — это про ADT и полиморфизм. «Многие сказали бы: "это не ООП". Ирония. Я правда ООП "в чистом виде" и не люблю.» Ваш код — продолжение традиции Хоора: ADT, операции, полиморфизм. Синтаксис «функция от объекта» — не анти-ООП, а ООП в изначальном смысле.
- 4.7. Паттерн един: «Вид сбоку» — BTrieve + DDF, Гарант F1, iГарант, Архивариус, Git, HyTech, Храм — одно и то же.
- 4.8. Осознание — «Локально я сделал то же самое. Но глобально — привязался к иерархии.» «Осознание пришло в 2016. 10 лет стройки.»
- 4.9. Геометрия 6-го класса — Точки — атомы (ME, станции, параграфы, ключи, объекты Git, битовые маски). Линии — связи (MEREF, пути, индексы, хеши). Веса — атрибуты (MEPROP, время проезда, стили).
- 4.10. Библиотека — «В районных библиотеках книги расставляют по тематикам (дерево). А в больших и серьёзных библиотеках книги просто стоят на полках в алфавитном порядке (плоский список).» «А классифицируют книги — специальные "индексы" — набор карточек в ящичках.» Районная библиотека — удобна для маленьких собраний. Большая библиотека — единственный способ работать с миллионами томов. Индексы (каталоги) — это «вид сбоку». Мой метод — это «большая библиотека». «Геометрия 6-го класса. Точки — книги. Линии — индексы. Плоскость — полка.»
- 4.11. Финальная формула — Атомы + атрибуты атомов = Алфавит. Индексы в виде Key-Value сбоку = Отношения.
💎 Ключевые цитаты
«Дерево мешало. Лет 20.» «Мне это было естественно.» «DDF был "натянут" сбоку.» «Это было гениально. Не побоюсь этого слова.» «В головах уже устойчиво засела древесная парадигма.» «Дерево стояло как проклятье.» «"Обход дерева" был выкинут нахер как понятие!» «Пол-шага, которые изменили всё.» «Ленивость — не оптимизация, а ключевое свойство.» «Две платформы. Один паттерн.» «Одно и то же. "Вид сбоку".» «Локально я сделал то же самое. Но глобально — привязался к иерархии.» «Осознание пришло в 2016. 10 лет стройки.» «Ведь тот же Git - ТОЖЕ УСТРОЕН плоско + индексы. В отличии от RCS/CVS.» «Git прошёл ТОТ ЖЕ ПУТЬ!» «Дерево файловой системы + FindFirst/FindNext — причём. И видимо именно поэтому Novell использовал BTrieve.» «Хотя про Novell может это и мои фантазии. НО я "за них додумываю".» «У нас есть версия Архивариуса на HyTech. Там — никаких деревьев. Битовые маски. Арифметика. Алгебра отношений.» «А "древесные словари" (Типы, Органы, Территории) мы натягивали сбоку.» «ВЕЗДЕ — древесность СБОКУ, но НА МОДЕЛИ древесность преодолевали почти 20 лет.» «Справка — это атрибут документа. Но у наших юристов — отдельный сорт. С 1990 года.» «Вы не "исправляете" доменную модель. Вы просто создаёте два плоских списка.» «Список "сбоку" можно построить "какой угодно". Хоть чётные/нечётные.» «Была классическая статья. Хоор "Методы обработки записей". Так вот "на самом деле", там не про записи. Там ООП "в чистом виде".» «"Методы обработки записей" — название, которое вводит в заблуждение. Просто тогда ещё термин ООП не придумали.» «Многие сказали бы: "это не ООП". Ирония. Я правда ООП "в чистом виде" и не люблю.» «А вдруг придётся уходить на C++? Скрипты перенесу, а бизнес-логика останется.» «В районных библиотеках книги расставляют по тематикам (дерево). А в больших и серьёзных библиотеках книги просто стоят на полках в алфавитном порядке (плоский список).» «А классифицируют книги — специальные "индексы" — набор карточек в ящичках.» «Всё верно. И всё просто. Геометрия 6-го класса.»
🔗 Приложения
понедельник, 20 апреля 2026 г.
Как я исправляю ошибки
https://18delphi.blogspot.com/2013/03/blog-post_54.html
"Shit happens". Это постулат.
Если я получаю ошибку в разработку, то я делаю примерно следующее:
1. Выясняю все необходимые детали, если они ещё не выяснены.
2. Пишу тест (или прошу коллег сделать это, есть люди - более подкованные).
3. Идеально, если получается тест на синтетических данных и в "песочнице", а не на реальном приложении.
4. Если не получается, то я делаю скриптовый тест к реальному приложению. (Может быть когда-нибудь я дойду до того - как я это делаю)
5. Запускаю тест, убеждаюсь, что он падает.
6. Кладу тест и его эталоны в репозитарий.
7. Отлаживаю ошибку используя тест как полигон для испытаний.
8. Исправляю ошибку.
9. Убеждаюсь, что тест не падает.
10. Кладу исправленный код, тест и эталоны в репозитарий.
11. Прогоняю другие тесты.
12. Смотрю на упавшие.
13. Из упавших отбираю те где "это не ошибка, а стало только лучше". Исправляю эти тесты или их эталоны.
14. Исправляю остальные упавшие тесты или привлекаю коллег или УБЕЖДАЮСЬ в противоречивости ТЗ (тут надо писать ОТДЕЛЬНЫЙ пост - отчасти тут - http://18delphi.blogspot.com/2013/04/blog-post.html).
15. Прогоняю все тесты.
16. Убеждаюсь, что ошибок больше нет.
17. ОСТАВЛЯЮ НОВЫЙ тест в репозитарии тестов. ОТНЫНЕ - он работает на меня.
18. Сплю спокойно.
Попробуйте. Может быть и вам - понравится.
О рекламе...
Ужас не в том, что это случится.
Ужас в том, что большинство не заметит. Или заметит, но не поймёт, почему это плохо.
«Ну подумаешь, песня в рекламе. Ну подумаешь, панибратское "Юра". Ну подумаешь, "блямс" вместо "бля".
О книгах...
https://18delphi.blogspot.com/2013/03/blog-post_2036.html
Джоэл Спольски — «перечитываю в КАЖДЫЕ новогодние каникулы». Джоэл пишет о здравом смысле, о том, как не надо переписывать код с нуля, о важности тестов и документации. Это ваш союзник в борьбе с фальшью.
-- уже не перечитываю. :(
Но помню.
Да и вообще... Честно скажу.
К сожалению лет 10 я уже не читаю книги. :-( Их заменили соцсети. А теперь уже и ИИ. Честно скажу - "ушла привычка читать большие тексты".
Basic tests for port from Delphi to FPC
program fpcunitproject1;
// - basic tests for port from Delphi to FPC
{$mode objfpc}{$H+}
{$Define l3DisableDelphiMode}
{$Include l3Define.inc}
uses
l3IntfUses
{$IFDEF UNIX}
, cthreads
{$ENDIF}
, Interfaces // this includes the LCL widgetset
, l3ExceptionsLog
, fpcunit
, testregistry
, l3ExceptionsLogEx
, l3Logger
, l3Base
, l3ProtoObject
, l3SimpleObject
, utGUITestsRunner
, printer4lazarus
, fpvectorialpkg
, indylaz
, primtestcase1
, primtestcase2
, l3ScreenIC
, utBaseTest
, utOutputTest
, TestCase1
// ---------------------------------
, TestCases
// ---------------------------------
, UnicodeTestCases
// ---------------------------------
, utMSSTests
// - подключаем скрипты
// ---------------------------------
, tfwTypeModifier
, tfwScriptingInterfaces
, vcmInsiderTest
, CustomInsiderScripter
, Ik2TagReaderWordsPack
, Ik2TagWriterWordsPack
, Ik2TagGeneratorWordsPack
, evdNativeWriter
, ddRTFWriterRegister
, evdAllDocumentSubsEliminator
, evDocumentValidator
, ddHTMLWriter
, evdXMLWriter
//, ddHTMLWriter
, afwCustomCaretType
//, tfwScriptingInterfaces
, m3DBCheckRunner in '..\..\..\components\m3DBCheck\m3DBCheckRunner.pas'
;
{$R *.res}
begin
TutMSSTests.Register;
// - Регистрируем скриптовые тесты
TutGUITestsRunner.Run;
(*
[*
+-----------------------------------------------------------------------+
| fpcunitproject1 - ГЛАВНЫЙ ТЕСТОВЫЙ ПРОЕКТ FPC |
| ============================================= |
| |
| Назначение: портирование системы с Delphi на Free Pascal |
| Единая точка входа для всех тестов под FPC |
| (Windows и Linux) |
| |
+-----------------------------------------------------------------------+
+-----------------------------------------------------------------------+
| СТРУКТУРА ПРОЕКТА |
+-----------------------------------------------------------------------+
┌─────────────────────────────────────────────────────────────────────┐
│ fpcunitproject1.dpr │
├─────────────────────────────────────────────────────────────────────┤
│ {$mode objfpc}{$H+} // режим Object Pascal, длинные строки │
│ {$R *.res} // ресурсы │
└─────────────────────────────────────────────────────────────────────┘
│
v
┌─────────────────────────────────────────────────────────────────────┐
│ TutGUITestsRunner.Run │
│ (графический тестовый раннер) │
└─────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────────┼───────────────────────────┐
v v v
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ СТАНДАРТНЫЕ │ │ СКРИПТОВЫЕ │ │ УТИЛИТЫ │
│ ТЕСТЫ │ │ ТЕСТЫ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
+-----------------------------------------------------------------------+
| СОСТАВ ПРОЕКТА (ПОДКЛЮЧЁННЫЕ МОДУЛИ) |
+-----------------------------------------------------------------------+
┌─────────────────────────────────────────────────────────────────────┐
│ 1. ФУНДАМЕНТ (L3) │
├─────────────────────────────────────────────────────────────────────┤
│ l3IntfUses // интерфейсы L3 │
│ l3ExceptionsLog // базовый логгер │
│ l3ExceptionsLogEx // логгер без автоперехвата │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 2. ТЕСТОВЫЕ БАЗОВЫЕ КЛАССЫ │
├─────────────────────────────────────────────────────────────────────┤
│ utGUITestsRunner // графический раннер │
│ utBaseTest // базовый класс тестов │
│ utOutputTest // тесты с выводом │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 3. СТАНДАРТНЫЕ ТЕСТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ primtestcase1 // примитивные тесты (часть 1) │
│ primtestcase2 // примитивные тесты (часть 2) │
│ TestCase1 // тесты общего назначения │
│ TestCases // набор тестов │
│ UnicodeTestCases // тесты Unicode/кодировок │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 4. СКРИПТОВЫЕ ТЕСТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ DailyAutoTestFPC // регистрация автоматических скриптовых тестов│
│ │
│ tfwTypeModifier // модификаторы типов (скриптовый движок) │
│ tfwScriptingInterfaces // интерфейсы скриптов │
│ vcmInsiderTest // внутренние тесты VCM │
│ CustomInsiderScripter // кастомный скриптер │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 5. K2 / EVD (МОДЕЛЬ ДАННЫХ) │
├─────────────────────────────────────────────────────────────────────┤
│ Ik2TagReaderWordsPack // чтение тегов │
│ Ik2TagWriterWordsPack // запись тегов │
│ Ik2TagGeneratorWordsPack // генерация тегов │
│ evdNativeWriter // запись EVD │
│ evdAllDocumentSubsEliminator // фильтр сабов │
│ evdXMLWriter // запись EVD в XML │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 6. ЭКСПОРТ (RTF, HTML, DOCX) │
├─────────────────────────────────────────────────────────────────────┤
│ ddRTFWriterRegister // регистрация RTF-писателя │
│ ddHTMLWriter // HTML-писатель (закомментирован) │
│ evDocumentValidator // валидатор документов │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 7. GUI-КОМПОНЕНТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ afwCustomCaretType // каретка (текстовый курсор) │
│ printer4lazarus // печать (Lazarus) │
│ fpvectorialpkg // векторная графика (SVG, etc) │
│ indylaz // интернет-компоненты (Indy) │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 8. УТИЛИТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ m3DBCheckRunner // утилита проверки базы данных │
└─────────────────────────────────────────────────────────────────────┘
+-----------------------------------------------------------------------+
| ПОРЯДОК ЗАПУСКА |
+-----------------------------------------------------------------------+
1. Регистрация скриптовых тестов
│
v
RegisterDailyAutoTestsFPC;
│
│ (регистрирует тесты из .ms.script файлов)
│
v
2. Запуск графического раннера
│
v
TutGUITestsRunner.Run;
│
│ (отображает окно со списком всех зарегистрированных тестов)
│
v
3. Пользователь выбирает тесты и запускает их
│
v
4. Тесты выполняются, результаты отображаются в GUI
+-----------------------------------------------------------------------+
| КЛЮЧЕВЫЕ ОСОБЕННОСТИ |
+-----------------------------------------------------------------------+
┌─────────────────────────────────────────────────────────────────────┐
│ 1. КРОССПЛАТФОРМЕННОСТЬ │
│ - {$IFDEF UNIX} cthreads {$ENDIF} // поддержка потоков в Linux │
│ - режим objfpc (Object Pascal) для совместимости с Delphi │
│ - длинные строки {$H+} для AnsiString │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 2. ИНТЕГРАЦИЯ СКРИПТОВ │
│ - скриптовые тесты регистрируются через RegisterDailyAutoTestsFPC│
│ - скриптовый движок (tfw) подключен │
│ - vcmInsiderTest, CustomInsiderScripter для внутренних тестов │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 3. ПОЛНЫЙ ОХВАТ │
│ - L3 (фундамент) │
│ - K2/evd (модель данных) │
│ - Экспорт (RTF, HTML) │
│ - GUI-компоненты (afw, printer, fpvectorial) │
│ - Утилиты (m3DBCheck) │
└─────────────────────────────────────────────────────────────────────┘
+-----------------------------------------------------------------------+
| ЗАДАЧА |
+-----------------------------------------------------------------------+
| |
| Этот проект доказывает, что портирование системы с Delphi на FPC |
| успешно завершено. Все ключевые компоненты: |
| - L3 (логирование, ссылочная модель) |
| - K2 (модель данных) |
| - Эверест (редактор) |
| - m3 (индексы, хранилище) |
| - Экспорт (RTF, HTML, PDF) |
| - Скрипты (tfw) |
| |
| работают как под Windows, так и под Linux. |
| |
| Запуск этого проекта — финальная проверка перед релизом. |
| |
+-----------------------------------------------------------------------+
*]
*)
end.
TestCases
{$IfDef FPC}
{$CodePage utf8}
{.$CodePage cp1251}
{$EndIf FPC}
unit TestCases;
{$Include l3Define.inc}
interface
uses
l3IntfUses
{$IFDEF Linux}
, cwstring
{$ENDIF}
, Classes
, l3Stubs
, l3CoreInterfaces
, l3ExitProcsList
, l3String
, utBaseTest
, utOutputTest
, l3MemUtils
, l3AllocatedPointersTrace
, l3FileUtils
, l3FileSearch
, l3FileSearchWithExcludeMask
, l3Core
, l3Interfaces
, l3BaseStream
, l3Stream
, l3Clipboard
, l3HandleStream
, l3StringStream
, l3Parser
, l3Ptr
, l3PtrLoc
, l3ZLibUtils
, m2TMPLib
, m2comlib
, LockDeltasTest
, EOLWriteTest
, EOLWriteTest1
, EOLWriteTest2
, l3CustomMemoryStream
, l3MemoryStream
, l3TempMemoryStream
, l3ExclusiveTempMemoryStream
, l3ExclusiveTempFileStream
, l3TempMemoryStreamNewTest
, l3TempFileStreamTest
, l3TempFileStreamExTest
, l3TempFileStreamBufferedTest
, l3TempMemoryStreamExTest
, l3TempMemoryStreamSetSizeExTest
, l3ActiveXtypes_Proxy
, l3DataObject
, l3DataObjectEnum
, l3RegEx
, TestCaseCheck
, TestCaseCheck1
, TestCase1
, TestCase2
, TestCase3
, TestCase4
, TestCase5
, TestCase6
, TestCase7
, TestCase8
, TestCase9
, TestCase10
, TestCase11
, TestCase12
, TestCase13
, TestCase14
, TestCase15
, TestCase16
, TestCase17
, TestCase_802064420_cc_WordDelimANSISet_Prim
, l3ProtoObject
, TestCase_802064420_cc_WordDelimANSISet
, TestCase_802064420_cc_WordDelimOEMSet
, TestCase18
//, tcO1
//, tcO2
, TestCase19
, TestCase20
//, tcS1
//, tcS2
, l3Base
, l3LongintListPrim
, l3LongintList
, l3Chars
{.$IfNDef Linux}
, Bool_Wrap
, k2Base
, evdCore_Schema
, evdNative_Schema
, evNative_Schema
{.$EndIf Linux}
, l3ProtoDataContainer
, l3CustomString
, l3BaseWithIDList
, evdNativeReader
, GroupOperationTest
, GroupOperationTest1
, GroupOperationTest2
, GroupOperationTest3
, GroupOperationTest4
, GroupOperationTest5
, m3SetInternalIDtoExternalIDLinkTest
, m3DocumentStorageCacher
, l3MarshalledTypes
, evdArchiDicts_Schema
, evdSchema
, AccessMaskTest
, AccessMaskTest1
, AccessMaskTest2
, AccessMaskTest3
, AccessMaskTest4
, AccessMaskTest5
, AccessMaskTest6
, AccessMaskTest7
, AccessMaskTest8
, Il3IntegerEnumerable_DiffTest
, Il3IntegerEnumerable_DiffTest1
, Il3IntegerEnumerable_DiffTest2
, Il3IntegerEnumerable_DiffTest3
, Il3IntegerEnumerable_DiffTest4
{.$IfNDef Linux}
, l3TTFTools
, eeEVDtoPDF
, SynZip
, SynPDF
{.$EndIf Linux}
, l3LogFont
, ddAppConfigConst
, ddRTFWriter
, ddRTFSegmentWriter
, eeEVDtoRTF
, eeRenderFormula
, ddRTFReader
, ZipForge
//, l3ZLibUtils
, l3ZLibDecompressStream
, l3ZLibCompressStream
, m3ZLibDeflateStreamNew
, m3ZLibInflateStreamNew
, ddODTReader
, l3BaseWithLargeIDList
{$IfDef FPC}
, FGL
, tcGeneric1
, GenericTestCase1
, GenericTestCase2
, GenericTestCase3
, GenericTestCase4
, GenericTestCase5
, GenericTestCase6
, GenericTestCase7
, GenericTestCase8
, GenericTestCase9
, GenericTestCase10
, GenericTestCase11
, GenericTestCaseEx
, GenericTestCaseEx1
, GenericTestCaseEx2
, GenericTestCaseEx3
, GenericTestCaseEx4
, GenericTestCaseEx5
, GenericTestCaseEx6
, GenericTestCaseEx7
, GenericTestCaseEx8
, GenericTestCaseEx9
, GenericTestCaseEx10
, GenericTestCaseEx11
{$EndIf FPC}
, OneBytePtrHashTest
, PtrArrayTest
, PtrHashTest
, CopyStreamTest1
, CopyStreamTest2
, EVDtoEVDTest
, EVDtoEVDTest1
, EVDtoEVDTest2
, EVDtoEVDTest3
, EVDtoEVDTest4
, EVDtoEVDTest5
, EVDtoEVDTest6
, EVDtoEVDTest7
, EVDtoEVDTest8
, EVDtoEVDBinTest
, evdStyleContainer
, StyleTableSortTest
, StyleTableTest
, StyleListTest
, StyleListTest1
, StyleListTest2
, CompareLiteTest1
, CompareLiteTest2
, CompareLiteTest3
, CompareTextTest1
, CompareTextTest2
, CompareTextTest3
, CompareTest1
, CompareTest2
, CompareTest3
, CompareTest4
, CompareTest5
, CompareTest6
, CompareTest7
, CompareTest8
, CompareTest9
, CompareTest10
, CompareTest11
, WideCompareTextTest1
, WideCompareTextTest2
{$IfDef FPC}
, WideCompareTextTest3
{$EndIf FPC}
, WideCompareTextTest4
, WideCompareTextTest5
, WideCompareStrTest1
, WideCompareStrTest2
, ddTextParagraph
, ddTextSegment
, ddHyperlink
, ddPicture
, destPicture
, RTFtoEVDTest
, RTFtoEVDTest1
, RTFtoEVDTest2
, RTFtoEVDTest3
, RTFtoEVDTest4
, RTFtoEVDTest5
, RTFtoEVDTest6
, RTFtoEVDTest7
, RTFtoEVDTest8
, m2xltConvertBuffTest
, Cm2XLTANSI2UpperTest
, Cm2XLTAnsi2LowerTest
, Cm2XLTOem2AnsiTest
, Cm2XLTAnsi2OemTest
, Cm2XLTOem2UpperTest
, Cm2XLTOem2LowerTest
, Cm2XLTOemRus2EngTest
, Cm2XLTOemEng2RusTest
, Cm2XLTAnsiRus2EngTest
, Cm2XLTAnsiEng2RusTest
, Cm2XLTOem2SwapTest
, Cm2XLTAnsi2SwapTest
, Cm2XLTOem2SpecialTest
, m0LZOLib
, m3ZLibInflateStreamNewTest
, m3ZLibInflateStreamNewTest1
, m3ZLibInflateStreamNewTest2
, m3ZLibInflateStreamNewTest3
, m3ZLibDeflateStreamNewTest
, m3ZLibDeflateStreamNewTest1
, m3ZLibDeflateStreamNewTest2
, m3ZLibDeflateStreamNewTest3
, m3ZLibDeflateStreamNewTest4
, ODTtoEVDTest
, ODTtoEVDTest1
, ODTtoEVDTest2
, ODTtoEVDTest3
, ODTtoEVDTest4
, ddDocxReader
, DOCXtoEVDTest
, DOCXtoEVDTest1
, DOCXtoEVDTest2
, DOCXtoEVDTest3
, DOCXtoEVDTest4
, DOCXtoEVDTest5
, DOCXtoEVDTest6
, DOCXtoEVDTest7
, DOCXtoEVDTest8
, DOCXtoEVDTest9
, l3Bits
, l3BitArr
, ststrs // SysTools string routines
, IntToBinTest
, IntToBinTest1
, IntToBinZTest
, IntToBinZTest1
, Int64ToBinTest
, Int64ToBinTest1
, Int64ToBinZTest
, Int64ToBinZTest1
, l3SetBitTest1
, l3SetBitTest2
, l3SetBitTest3
, l3SetBitTest4
, l3SetBitWTest1
, l3SetBitWTest2
, l3SetBitWTest3
, l3SetBitWTest4
, l3SetBit64Test1
, l3SetBit64Test2
, l3SetBit64Test3
, l3SetBit64Test4
, SizeOfTl3NativeUIntTest
, SizeOfTl3NativeIntTest
, l3ClearBitTest1
, l3ClearBitTest2
, l3ClearBitTest3
, l3ClearBitTest4
, l3ClearBitWTest1
, l3ClearBitWTest2
, l3ClearBitWTest3
, l3ClearBitWTest4
, l3ClearBit64Test1
, l3ClearBit64Test2
, l3ClearBit64Test3
, l3ClearBit64Test4
, l3TestBitTest1
, l3TestBitTest2
, l3TestBitTest3
, l3TestBitTest4
, l3TestBitTest5
, l3TestBitTest6
, l3TestBitTest7
, l3TestBitTest8
, l3TestBit64Test1
, l3TestBit64Test2
, l3TestBit64Test3
, l3TestBit64Test4
, l3TestBit64Test5
, l3TestBit64Test6
, l3TestBit64Test7
, l3TestBit64Test8
, evTextFormatter
, evNSRWrt
, evSegmentsPairs
, ddNSRC_w
, evSimpleTextPainter
, evNSRCPlusWriter
, ddNSRCGenerator
, evBullet2TextFilter
, evEmptyTableEliminator
, NSRCtoNSRCNewTest
, NSRCtoNSRCNewTest1
, NSRCtoNSRCNewTest2
, NSRCtoNSRCNewTest3
, EVDtoNSRCTest
, EVDtoNSRCTest1
, EVDtoNSRCTest2
, EVDtoNSRCTest3
, EVDtoNSRCTest4
, EVDtoNSRCTest5
, EVDtoNSRCTest6
, EVDtoNSRCTest7
, EVDtoNSRCTest8
, EVDtoNSRCTest9
, EVDtoNSRCTest10
, EVDtoNSRCTest11
, EVDtoNSRCTest12
, EVDtoNSRCTest13
, EVDtoNSRC1251Test
, EVDtoNSRCKeepExistingTest
, EVDtoNSRCKeepExistingTest1
, EVDtoNSRCKeepExistingTest2
, EVDtoNSRCKeepExistingNotIsPlusPlusTest
, EVDtoNSRCWithoutConvertLapkiTest
{$If Defined(StringsHasCodePage)}
, CodePageTest1
, CodePageTest2
, CodePageTest3
, CodePageTest4
, CodePageTest5
, CodePageTest6
, CodePageTest7
, CodePageTest8
, CodePageTest9
, CodePageTest10
, CodePageTest11
, CodePageTest12
, CodePageTest13
, CodePageTest14
, CodePageTest15
, CodePageTest16
, CodePageTest17
, CodePageTest18
, CodePageTest19
, CodePageTest20
, CodePageTest21
, CodePageTest22
, CodePageTest23
, CodePageTest24
{$IfEnd}
, l3FieldSortRecListTest
, l3FieldSortRecListTest1
, l3FieldSortRecListTest2
, l3FieldSortRecListTest3
, ddDocument
, ddDocument_ResetToDefaultTest
, l3AutoreleasePool
, MakeTagTest1
, m3RootStreamManager
, m3NewRootStreamManager
, m3BaseStorage
, m3StoragePrim
, m3CommonStorage
, m3NewStoragePrim
, m3CustomNewStorage
, m3NewStorage
, m3ArchiveStorage
, m3stgmgr
, l3Core_Proxy
, l3StorageInterfaces_Proxy
, m3StorageInterfaces
, m3BuffStream
, m3FileStream
, ConstantStorageTest
, ReadModeStorageTest
, FullModeStorageTest
, FullModeVersionedStorageTest
, FullModeStackVersionedStorageTest
, FullModeStackVersionedStorageTest1
, ArchiStorageNewTest
, ArchiStorageNewTest1
, ArchiStorageVersionsNewTest
, l3ExceptionsLog
, tfwScriptingExceptions
, l3Except
, l3_String
, l3Filer
, l3StringEx
, Ansi186ToUnicodeTest
, AnsiToUnicodeTest
, RussianWinToUnicodeTest
, OemToUnicodeTest
, RussianDosToUnicodeTest
, EastEuropeToUnicodeTest
, WesternWinToUnicodeTest
, TatarToUnicodeTest
, TatarOEMToUnicodeTest
, OemLiteToUnicodeTest
, GreekToUnicodeTest
, TurkishToUnicodeTest
, UTF8ToUnicodeTest
, AnsiToUtf8Test
, RussianWinToUtf8Test
, OemToUtf8Test
, RussianDosToUtf8Test
, EastEuropeToUtf8Test
, WesternWinToUtf8Test
, TatarToUtf8Test
, TatarOEMToUtf8Test
, OemLiteToUtf8Test
, GreekToUtf8Test
, TurkishToUtf8Test
, Cardinal2Int64TestCase
, MOV32Test1
, MOV32Test2
, AND32Test1
{$IfDef Some64}
, MOV64Test1
, MOV64Test2
, AND64Test1
{$EndIf Some64}
, k2TagGen
, evdWriter
, evdReader
, graphics
, ExprDraw
, ExprMake
, TextToBMPTest
, l3ImageUtils
, TextToPNGTest
, FormulaToBMPTest
, FormulaToPNGTest
, MakeFormulasTest
, ddNSRC_r
, NSRCtoEVDTestNew
, NSRCtoEVDTestNew1
, NSRCtoEVDTestNew2
, NSRCtoEVDTestNew3
, NSRCtoEVDTestNew4
, ddSegmentScanner
, l3CanvasPrim
, l3Canvas
, l3SvgCanvas
, l3SvgCanvasEx
{$IfDef ExprUseSVG}
, TextToSVGTest
, FormulaToSVGTest
{$EndIf ExprUseSVG}
, evSimpleFormulaRender
, FormulaRenderTest
, FormulaRenderViaDllTest
, dd_rtfFields
, EVDtoRTFTest
, EVDtoRTFTest1
, nevPrintView
, l3Defaults
, l3Units
, nevTextParaRenderInfo
, evTextParaPainterEx
, EVDRenderToBitmapTest
, EVDRenderToBitmapTest1
, l3FontManager
, l3LineArray
, evTextParaTools
, evCustomTextSource
, evEditorWindowTextSource
, evTextSource
, evLoadDocumentManager
, evEditor
//, evFPCEditor
, nevTableRowRenderInfoEx
, l3WinControlCanvas
, l3CustomControlCanvas
, l3FormCanvas
{$If NOT Defined(Linux)}
, Windows
{$Else NOT Defined(Linux)}
// using l3LinWindows instead of Windows
, l3LinWindows
{$IfEnd} // NOT Defined(Linux)
{$If NOT Defined(Linux)}
, ActiveX
{$Else NOT Defined(Linux)}
// using l3LinActiveX instead of ActiveX
, l3LinActiveX
{$IfEnd} // NOT Defined(Linux)
, l3GraphicControlCanvas
, ddPictDetector
, l3IEBitmapContainer
, evExtFormat
, SynCommons
, eePDFCanvasHelper
{.$If NOT Defined(Linux)}
, EVDToPDFDirectRenderTest
{.$IfEnd} // NOT Defined(Linux)
{.$If NOT Defined(Linux)}
, EVDToPDFDirectRenderTest1
{.$IfEnd} // NOT Defined(Linux)
{.$If NOT Defined(Linux)}
//, EVDToPDFDirectRenderTest
//, EVDToPDFDirectRenderTest1
, EVDToPDFDirectRenderTest2
{.$IfEnd} // NOT Defined(Linux)
, EVDToPDFDirectRenderTest3
, EVDToPDFDirectRenderTest4
, EVDToPDFDirectRenderTest5
, EVDToPDFDirectRenderTest6
, EVDToPDFDirectRenderTest7
//, EVDToPDFDirectRenderTest8
// -- теста нет, потому что там EMF
//, EVDToPDFDirectRenderTest9
// -- теста нет, потому что там EMF
, EVDToPDFDirectRenderTest10
, EVDToPDFDirectRenderTest11
, EVDToPDFA1DirectRenderTest
, EVDToPDFA1DirectRenderTest1
{$IfDef FPC}
, fpparsettf
{$EndIf FPC}
{$IfDef FPC}
, fpvectorial
, wmfvectorialreader
{$EndIf FPC}
, EVDToPDFDirectRenderNoPackTest
, EVDToPDFDirectRenderNoPackTest1
, EVDToRTFRenderTest
, EVDToRTFRenderViaRenderEVDTest
, EVDToRTFRenderViaRenderRTFTest
, l3SharedConstStringsList
, l3ObjectStringList
, m3DBInterfaces
, m3PrimDB
, m3DB
, m3SimpleDB
, m3DBTools
, m3STSort
, m3ParaIndexBuilder
, m3DBDocument
, m3DBDocumentPart
, BaseUpdateTest
, StgIndexNewTest
, StgIndexNewTest1
, StgIndexNewTest2
, StgIndexNewTest3
, StgIndexNewTest4
, StgIndexNewTest5
, StgIndexNewTest6
, StgIndexNewTest7
, m3TempStream
, m4DB
, m3SearcherInterfaces
, m3IndexDumper
, m3IndexDumperJoin
, l3HandleList
, ddExtObjInserter
, m3RangedDocumentsList
, l3Enumerators
, l3Ranges
, Il3IntegerEnumerableFromRangeEnumerable
, m3IndexSearcherFilteredResult
, m3IndexSearcherEx
, m3IndexHashElementWithFilterModifiedAE
, m3IndexHashElementWithFilterModified
, m3IndexHashElementEnumeratorWithFilteredModified
, m3IdxCla
, m3IDRangeListPrim
, m3IDRangeList
, Il3IntegerEnumeratorFromRange
, Il3IntegerEnumeratorFromIl3RangeEnumerable
, m3IDRangeListTest
, m3IDRangeListTest1
, m3IDRangeListTest2
, m3IDRangeListTest3
, m3IDRangeListTest4
, m3IDRangeListTest5
, m3IDRangeListTest6
, m3IDRangeListTest7
, m3IDRangeListTest_1
, m3IDRangeListTest1_1
, m3IDRangeListTest2_1
, m3IDRangeListTest3_1
, m3IDRangeListTest4_1
, m3IDRangeListTest5_1
, m3IDRangeListTest6_1
, m3IDRangeListTest7_1
, m3IDRangeListWithNegativeTest1
, m3IDRangeListWithNegativeTest2
, m3IDRangeListWithNegativeTest3
, m3IDRangeListWithNegativeTest4
, m3IDRangeListWithNegativeTest5
, m3IDRangeListWithNegativeTest6
, m3IDRangeListRandomTest
, m3IDRangeListRandomTest1
, arUserDocInterfaces
, udDocIDRangeList
, m3IDRangeListSortedJoinTest
, m3IDRangeListSortedJoinTest1
, m3IDRangeListSortedJoinTest2
, m3IDRangeListSortedJoinTest3
, m3IDRangeListSortedJoinTest4
, m3IDRangeListSortedJoinTest5
, m3IDRangeListSortedJoinTest6
, nevFormatInfo
, m3IDRangeListSortedJoinTest7
, m3IDRangeListSortedJoinTest8
// {$Include l3EnumeratorSortedJoin_imp.pas}
, m3IDRangeListSortedJoinTest9
, m3IDRangeListSortedJoinTest10
, m3IDRangeListSortedJoinTest11
, m3IDRangeListSortedJoinTest12
, m3IDRangeListSortedJoinTest13
, m3IDRangeListSortedJoinTest14
, m3IDRangeListRemoveTest
, m3IDRangeListRemoveTest1
, m3IDRangeListRemoveTest2
, m3IDRangeListRemoveTest3
, m3IDRangeListRemoveTest4
, m3IDRangeListRemoveTest5
, m3IDRangeListRemoveTest6
, m3IDRangeListRemoveTest7
, m3IDRangeListRemoveTest8
, m3IDRangeListRemoveTest9
, m3IDRangeListRemoveTest10
, m3IDRangeListRemoveTest11
, m3IDRangeListRemoveTest12
, m3IDRangeListRemoveTest13
, m3IDRangeListRemoveTest14
, m3IDRangeListRemoveTest15
, m3IDRangeListRemoveTest16
, m3IDRangeListRemoveTest17
, m3IDRangeListRemoveTest18
, m3IDRangeListRemoveTest19
, m3IDRangeListRemoveTest20
, m3IDRangeListRemoveTest21
, m3IDRangeListRemoveTest22
, m3IDRangeListRemoveTest23
, m3EvdDocumentIndexBuilder
, m3EvdDocumentAttrsIndexBuilder
, m3EvdDocumentAttrsIndexBuilderForGroupOp
, m3GroupOpFilter
, m3AttrsFromIndexAdder
, m3DocumentIndexBuilder
, m3DocumentIndexBuilderEx
, m2MEMLib
, m3IndexHashElement
, m3IndexHashElementAE
, Im3IndexHashElementList
, m3AttrIndexElement
, Im3AttrIndexElementList
, m3AttrIndexDumper
, m3AttrIndexDumperJoin
//, Im3DirectAttrIndexElementEnumeratorWithFilteredModified
, Im3DirectAttrIndexElementEnumeratorSortedJoin
, Im3AttrIndexDumperList
, Im3AttrIndexDumperByTimeStampList
, vtFileSystem
, vtPanel
, vtDialogs
, m3ProxyIndexStream
, m3ProxyTempFileStream
, m3DocumentAttrIndexBuilder
, m3DBHelper
, m3AttrIndexInterfaces
, m3AttrIndexSearcher
, daDataProvider
, daQueryParams
, daDictQueryParams
, daAttrIndexInterfaces
, sdbDataProvider
, ddDictItemNameReplacer
, m3DirectQueryExecutorFactory
, l3ListenersManager
, PdaDocListAccessRecHolder
, m3QueryResultSetFromLongintList
, dtQueryProvider
, m3DocListQueryProvider
, m3AndQueryExecutor
, m3DocumentInfoExtractor
, m3TextQueryExecutor
, m3Morph
, m4SearchEx
, m3DateNumQueryExecutor
, evdVer
, dt_Types
//, m3STSort
, IntToStrAndConcatTest
, IntToStrAndConcatTest1
, IntToStrAndConcatTest2
, IntToStrAndConcatTest3
, m3LogByActionQueryExecutor
, m3DocInfo
, m3IDListQueryExecutor
, daIDListQueryParams
, m3DocListQueryExecutor
, evCustomMemo
{$IfDef FPC}
, ar_filters
{$EndIf FPC}
, sdbStorage
{.$IfDef FPC}
, sdbDictionary
, sdbDictDataAccess
{.$EndIf FPC}
, k2Core_Schema
, k2DocumentHeaderBuffer
, m3Exceptions
, k2Attributes
, ddDocStructBuildFilterPrim
, ddDocStruct
, evdStyles
, evParaTools
, evRange
, evCommentDecorator
, m3SplittedFileStream
, csAnnotationTask
, TcsAnnotationTaskTest
, csAutoClassTask
, csAutoExportTask
, csDocumentControlTask
, TcsAutoClassTaskTest
, TcsAutoExportTaskTest
, TcsDocumentControlTaskTest
, badIndexDumperTest
, StgIndexSearchNewTest
, l3IDList
, m3NewStorageStreamPrim
, m3VersionedStorageStream
, m3StorageBlock
, evSubPanel
, l3Variant
, m3RootStreamManagerPrimPrim
, k2Tags
, nevDocumentContainer
, m3TOCHandle
, l3IniFile
, TiffTopicToPDFRenderTest
, OvcCmd
, nevView
, daDocumentEnumList
, sdbExternalDocNumbers
, m3AttrIndexWriter
, m3AttrIndexWriterPackTest
, m3AttrIndexWriterPackTest1
, m3AttrIndexWriterPackTest2
, m3AttrIndexWriterPackRandomTest
, m3AttrIndexWriterPackRandomTest1
, m3LockedRegionsList
, m3AttrIndexSearcherTest
, m3AttrIndexSequentialTest
, m3IntegerToDocInfoMap
, m3IntegerToDocInfoMapSafe
, csClientMail
, m3DBCheckRunner
// - в тестах не используется но подключён для проверки компилируемости
, m3StorageIndexStream
;
implementation
(*
[*
TestCases.pas
│
├── 1. БАЗОВЫЙ СЛОЙ (L3)
│ ├── Память: l3MemUtils, l3AllocatedPointersTrace
│ ├── Потоки: l3Stream, l3StringStream, l3MemoryStream, l3TempFileStream
│ ├── Строки: l3String, l3StringEx, l3Chars, l3_String
│ ├── Списки: l3LongintList, l3IDList, l3ObjectStringList
│ ├── Биты: l3Bits, l3BitArr, l3SetBitTest*, l3TestBitTest*
│ └── Сравнение: CompareTest*, CompareLiteTest*, CompareTextTest*
│
├── 2. КОДИРОВКИ И UNICODE
│ ├── AnsiToUnicode, RussianWinToUnicode, OemToUnicode
│ ├── UTF8ToUnicode, AnsiToUtf8, RussianWinToUtf8
│ ├── CodePageTest1-24
│ └── WideCompareTextTest*, WideCompareStrTest*
│
├── 3. ХРАНИЛИЩА И ИНДЕКСЫ (m3)
│ ├── Индексы атрибутов: m3AttrIndexWriterPackTest*, m3AttrIndexSearcherTest
│ ├── Диапазоны: m3IDRangeListTest*, m3IDRangeListSortedJoinTest*
│ ├── Storage: ConstantStorageTest, FullModeStorageTest, ArchiStorageNewTest
│ └── Searcher: m3AttrIndexSearcher, m3DocInfo, m3DBTools
│
├── 4. ДОКУМЕНТЫ (EVD, K2)
│ ├── Чтение/запись: evdReader, evdWriter, evdNativeWriter, evdNativeReader
│ ├── Преобразования: EVDtoEVDTest*, EVDtoEVDBinTest
│ ├── Стили: StyleTableTest, StyleListTest, evdStyleContainer
│ └── Структура: ddDocument, ddTextParagraph, ddHyperlink, ddPicture
│
├── 5. ФОРМАТЫ ДОКУМЕНТОВ
│ ├── RTF: RTFtoEVDTest*, EVDtoRTFTest, ddRTFWriter, ddRTFReader
│ ├── DOCX: DOCXtoEVDTest*, ddDocxReader
│ ├── ODT: ODTtoEVDTest*, ddODTReader
│ └── NSRC: NSRCtoEVDTestNew*, EVDtoNSRCTest*, ddNSRC_w, ddNSRCGenerator
│
├── 6. ЭКСПОРТ И РЕНДЕРИНГ
│ ├── PDF: EVDToPDFDirectRenderTest*, EVDToPDFA1DirectRenderTest
│ ├── RTF: EVDToRTFRenderTest, EVDToRTFRenderViaRenderEVDTest
│ ├── SVG: TextToSVGTest, FormulaToSVGTest, l3SvgCanvas
│ ├── BMP/PNG: TextToBMPTest, FormulaToBMPTest, EVDRenderToBitmapTest
│ └── Формулы: FormulaRenderTest, FormulaRenderViaDllTest, evSimpleFormulaRender
│
├── 7. ГРУППОВЫЕ ОПЕРАЦИИ
│ ├── GroupOperationTest*, m3GroupOpFilter
│ ├── m3EvdDocumentAttrsIndexBuilderForGroupOp
│ └── m3AttrsFromIndexAdder
│
├── 8. СКРИПТЫ (tfw)
│ ├── vcmInsiderTest, CustomInsiderScripter
│ ├── tfwTypeModifier, tfwScriptingInterfaces
│ └── DailyAutoTestFPC (скриптовые тесты)
│
├── 9. КРОССПЛАТФОРМЕННОСТЬ
│ ├── {$IFDEF UNIX} cwstring {$ENDIF}
│ ├── l3LinWindows вместо Windows
│ ├── l3LinActiveX вместо ActiveX
│ └── fpparsettf, fpvectorial для Linux
│
└── 10. GENERICS (FPC)
├── FGL, tcGeneric1, GenericTestCase1-11
└── GenericTestCaseEx1-11
*]
*)
end.
m3DBHelper
{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}
unit m3DBHelper;
// --------------------------------------------------------------------------
// Родители: "Searcher" <<Unit>> MUID: (5B02C2CD0274) :: "m3" <<Library>> MUID: (548712F60101) :: "Shared Delphi Low Level" <<Project>> MUID: (4ABCC25A0322)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3DBHelper.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<<SimpleClass>>"
// Элемент модели: "Tm3DBHelper" MUID: (5B4782B40258)
// --------------------------------------------------------------------------
//#UC START# *5B4782B40258beforeDefines*
//#UC END# *5B4782B40258beforeDefines*
{$Include m3Define.inc}
interface
uses
l3IntfUses
, l3CProtoObject
, m3SearcherInterfaces
, SysUtils
, l3Filer
, l3StringList
, l3Core
, l3CoreInterfaces
//#UC START# *5B4782B40258intf_uses*
;
{$IfDef Archi}
{$Define NoBackCopy}
{$Else Archi}
{$IfDef m3DBCheck}
{$Define NoBackCopy}
{$Else m3DBCheck}
{$IfDef nsTest}
{$Define NoBackCopy}
{$Else nsTest}
{.$Define NoBackCopy}
{$EndIf nsTest}
{$EndIf m3DBCheck}
{$EndIf Archi}
var g_NoBackCopy : Boolean =
// - https://mdp.garant.ru/pages/viewpage.action?pageId=902335598
{$IfDef NoBackCopy}
true
{$Else NoBackCopy}
false
{$EndIf NoBackCopy}
//#UC END# *5B4782B40258intf_uses*
;
type
//#UC START# *5B4782B40258ci*
//#UC END# *5B4782B40258ci*
Tm3DBHelper = class(Tl3CProtoObject, Im3DBHelper)
private
f_BaseName: TFileName;
f_FlagName: TFileName;
{$If Defined(Never)}
f_FlagFiler: Tl3CustomFiler;
{$IfEnd} // Defined(Never)
f_IndexDeltaFilesForPurge: Tl3StringList;
f_FlagHandle: Tl3CoreHandle;
protected
procedure CheckIndexDeltaFiles;
procedure SaveFiles(const aFileName: AnsiString;
const aFiles: Im3FilesEnumerable;
const anExcludeFiles: Im3FilesEnumerable);
function LoadFiles(const aFileName: AnsiString;
var aFiles: Tl3StringList): Boolean;
procedure SaveIndexDeltaFilesForPurge;
class function SafeDeleteStorageFile(const aFileName: AnsiString;
var aNotDeleted: Tl3StringList): Boolean;
class function SafeDeleteStorageFiles(const aFiles: Im3FilesEnumerator;
var aNotDeleted: Tl3StringList): Boolean;
class function AddToList(var aList: Tl3StringList;
const aName: AnsiString): Boolean;
{* Добавляет значение в список без дубликатов }
function DeleteIndexPrim: Boolean;
function NewIndexDeltaNamePrim(const aFiles: Im3FilesEnumerable;
const anExt: TFileName): Il3CString;
function GetIndexDeltasFiles: Im3FilesEnumerable;
{* Файлы дельты индекса }
function NewIndexDeltaName(const aFiles: Im3FilesEnumerable): Il3CString;
procedure AddNewIndexDeltaName(var aName: Il3CString;
var aFiles: Im3FilesEnumerable;
aNeedRenameToCanonical: Boolean = True);
function LockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Если они уже захвачены, то возвращает false }
procedure UnlockDeltas;
{* Освобождает захваченные индексы }
function DeleteIndexDeltas(var aFiles: Im3FilesEnumerable;
aKeepNewDeltas: Boolean): Boolean;
function IndexName: Il3CString;
function GetIndexForPurgeFiles: Im3FilesEnumerable;
{* "Провисшие" файлы для удаления }
function NewIndexName: Il3CString;
procedure SetNewIndexName(var aName: Il3CString);
function DeleteIndex: Boolean;
procedure PurgeIndexDeltas;
function DeleteAllIndexDeltas: Boolean;
function GetAllIndexFiles: Im3FilesEnumerable;
{* Все файлы индекса для поиска или объединения }
function GetIndexMainFiles: Im3FilesEnumerable;
{* Файлы основной части индекса (то что раньше было IndexName) }
function Get_BaseName: AnsiString;
function TryLockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Может это делать в цикле, с таймаутом }
procedure Cleanup; override;
{* Функция очистки полей объекта. }
procedure BeforeFree; override;
{* функция, вызываемая при каждом уменьшении счетчика ссылок на 1. Вернув false может запретить уничтожение объекта. }
procedure BeforeRelease; override;
public
constructor Create(const aBaseName: AnsiString); reintroduce;
class function Make(const aBaseName: AnsiString): Im3DBHelper; reintroduce;
class function WStrToEnumerable(const aStr: Tl3WString): Im3FilesEnumerable;
{* Преобразует строку к списку }
{$If NOT Defined(l3NoSRT)}
function SetRefTo(var thePlace: Tm3DBHelper): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
{$IfEnd} // NOT Defined(l3NoSRT)
//#UC START# *5B4782B40258publ*
//#UC END# *5B4782B40258publ*
end;//Tm3DBHelper
var g_WeAreLocker: Integer = 0;
{* - затычка, но пока так }
implementation
uses
l3ImplUses
{$If NOT Defined(NoScripts)}
, tfwReadonlyPropertyLike
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwValueTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwScriptingInterfaces
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassCreator
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwWordInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassBinaryOperator
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassMapper
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassBinaryPredicate
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassProcedure
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassPredicate
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwAxiomaticsResNameGetter
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, TtfwTypeRegistrator_Proxy
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, TtfwClassRef_Proxy
{$IfEnd} // NOT Defined(NoScripts)
, l3Interfaces
, l3String
{$If NOT Defined(NoScripts)}
, tfwTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
, l3StringsEnumerator
{$If NOT Defined(NoScripts)}
, tfwRegisterableWordPrim
{$IfEnd} // NOT Defined(NoScripts)
//#UC START# *5B4782B40258impl_uses*
{$IFDEF Linux}
, baseunix
{$EndIF Linux}
{$IFDEF Linux}
, l3LinWindows
{$ELSE}
, Windows
{$ENDIF}
//, SysUtils
, StrUtils
, Math
, DateUtils
, l3Types
, l3SharedConstString
//, l3String
//, l3Filer
, l3SysUtils
, l3FileUtils
, l3MinMax
, l3Date
, l3Base
, m3StgMgr
//, m4DB
, m3SplittedFileStream
, m3StorageHolderList
, m3AttrIndexSearcher
, m3IndexDumperJoin
, m3AttrIndexDumperJoin
;
const
cIndexExt = '.idx';
cIndexRefExt = '.index';
cIndexDeltaExt = '.idxdelta';
cIndexDeltasExt = '.idxdeltas';
cIndexDeltasForPurgeExt = '.idxdeltaspurge';
cTimeOut = 3000
//#UC END# *5B4782B40258impl_uses*
;
type
Tm3DBHelperClass = class of Tm3DBHelper;
{* Ссылка на класс Tm3DBHelper }
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassCreate = TtfwClassCreator;
{* Слово скрипта m3DBHelperClass:Create }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassMake = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelperClass:Make }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassWStrToEnumerable = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelperClass:WStrToEnumerable
Преобразует строку к списку. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperBaseName = TtfwReadonlyPropertyLike;
{* Слово скрипта m3DBHelper:BaseName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperCreate = TtfwClassCreator;
{* Слово скрипта m3DBHelper:Create }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperMake = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelper:Make }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperWStrToEnumerable = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelper:WStrToEnumerable
Преобразует строку к списку. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexDeltasFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetIndexDeltasFiles
Файлы дельты индекса. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexDeltaName = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelper:NewIndexDeltaName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperLockDeltas = TtfwClassBinaryPredicate;
{* Слово скрипта m3DBHelper:LockDeltas
Пытается захватить индексы. Если они уже захвачены, то возвращает false. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperUnlockDeltas = TtfwClassProcedure;
{* Слово скрипта m3DBHelper:UnlockDeltas
Освобождает захваченные индексы. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperIndexName = TtfwClassMapper;
{* Слово скрипта m3DBHelper:IndexName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexForPurgeFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetIndexForPurgeFiles
"Провисшие" файлы для удаления. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexName = TtfwClassMapper;
{* Слово скрипта m3DBHelper:NewIndexName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteIndex = TtfwClassPredicate;
{* Слово скрипта m3DBHelper:DeleteIndex }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperPurgeIndexDeltas = TtfwClassProcedure;
{* Слово скрипта m3DBHelper:PurgeIndexDeltas }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteAllIndexDeltas = TtfwClassPredicate;
{* Слово скрипта m3DBHelper:DeleteAllIndexDeltas }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetAllIndexFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetAllIndexFiles
Все файлы индекса для поиска или объединения. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexMainFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetIndexMainFiles
Файлы основной части индекса (то что раньше было IndexName). }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperTryLockDeltas = TtfwClassBinaryPredicate;
{* Слово скрипта m3DBHelper:TryLockDeltas
Пытается захватить индексы. Может это делать в цикле, с таймаутом. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TTm3DBHelperKeywordsPackResNameGetter = {final} class(TtfwAxiomaticsResNameGetter)
{* Регистрация скриптованой аксиоматики }
public
class function ResName: AnsiString; override;
end;//TTm3DBHelperKeywordsPackResNameGetter
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassCreate_Tm3DBHelper_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Tm3DBHelper));
end;//TkwTm3DBHelperClassCreate_Tm3DBHelper_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassCreate_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperClassCreate_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperClassCreate_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aBaseName: AnsiString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushObj(l_aSelf.Create(l_aBaseName), TypeInfo(Tm3DBHelper));
end;//TkwTm3DBHelperClassCreate_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassMake_Im3DBHelper_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperClassMake_Im3DBHelper_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassMake_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperClassMake_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperClassMake_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aBaseName: AnsiString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.Make(l_aBaseName), TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperClassMake_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperClassWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassWStrToEnumerable_Documentation: AnsiString;
begin
Result := 'Преобразует строку к списку.';
end;//TkwTm3DBHelperClassWStrToEnumerable_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassWStrToEnumerable_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aStr', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperClassWStrToEnumerable_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperClassWStrToEnumerable_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aStr: Tl3WString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aStr := l3PCharLen(aCtx.rEngine.PopString);
except
on E: Exception do
begin
aCtx.GetParamError('aStr: Tl3WString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.WStrToEnumerable(l_aStr), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperClassWStrToEnumerable_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper));
end;//Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperBaseName_ImplBaseName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): AnsiString;
begin
if (aSelf = nil) then
begin
Result := '';
Exit;
end;
Result := aSelf.Get_BaseName;
end;//TkwTm3DBHelperBaseName_ImplBaseName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperBaseName_AnsiString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperBaseName_AnsiString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperBaseName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperBaseName_ImplBaseName(aCtx, l_aSelf));
end;//TkwTm3DBHelperBaseName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperCreate_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperCreate_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperCreate_DoIt(const aCtx: TtfwContext);
var l_aBaseName: AnsiString;
begin
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushObj(Tm3DBHelper.Create(l_aBaseName), TypeInfo(Tm3DBHelper));
end;//TkwTm3DBHelperCreate_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperMake_Im3DBHelper_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperMake_Im3DBHelper_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperMake_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperMake_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperMake_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aBaseName: AnsiString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.Make(l_aBaseName), TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperMake_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperWStrToEnumerable_Documentation: AnsiString;
begin
Result := 'Преобразует строку к списку.';
end;//TkwTm3DBHelperWStrToEnumerable_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperWStrToEnumerable_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aStr', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperWStrToEnumerable_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperWStrToEnumerable_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aStr: Tl3WString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aStr := l3PCharLen(aCtx.rEngine.PopString);
except
on E: Exception do
begin
aCtx.GetParamError('aStr: Tl3WString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.WStrToEnumerable(l_aStr), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperWStrToEnumerable_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexDeltasFiles_ImplGetIndexDeltasFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetIndexDeltasFiles;
end;//TkwTm3DBHelperGetIndexDeltasFiles_ImplGetIndexDeltasFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexDeltasFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexDeltasFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexDeltasFiles_Documentation: AnsiString;
begin
Result := 'Файлы дельты индекса.';
end;//TkwTm3DBHelperGetIndexDeltasFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetIndexDeltasFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetIndexDeltasFiles_ImplGetIndexDeltasFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexDeltasFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexDeltaName_ImplNewIndexDeltaName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper;
const aFiles: Im3FilesEnumerable): Il3CString;
begin
Result := aSelf.NewIndexDeltaName(aFiles);
end;//TkwTm3DBHelperNewIndexDeltaName_ImplNewIndexDeltaName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexDeltaName_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperNewIndexDeltaName_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexDeltaName_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TypeInfo(Tm3DBHelper)), TtfwParamInfo_C('aFiles', TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable)))]);
end;//TkwTm3DBHelperNewIndexDeltaName_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperNewIndexDeltaName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
var l_aFiles: Im3FilesEnumerable;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aFiles := Im3FilesEnumerable(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3FilesEnumerable)));
except
on E: Exception do
begin
aCtx.GetParamError('aFiles: Im3FilesEnumerable : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperNewIndexDeltaName_ImplNewIndexDeltaName(aCtx, l_aSelf, l_aFiles));
end;//TkwTm3DBHelperNewIndexDeltaName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperLockDeltas_ImplLockDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper;
const aFiles: Im3FilesEnumerable): Boolean;
begin
Result := aSelf.LockDeltas(aFiles);
end;//TkwTm3DBHelperLockDeltas_ImplLockDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperLockDeltas_Documentation: AnsiString;
begin
Result := 'Пытается захватить индексы. Если они уже захвачены, то возвращает false.';
end;//TkwTm3DBHelperLockDeltas_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperLockDeltas_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TypeInfo(Tm3DBHelper)), TtfwParamInfo_C('aFiles', TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable)))]);
end;//TkwTm3DBHelperLockDeltas_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperLockDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
var l_aFiles: Im3FilesEnumerable;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aFiles := Im3FilesEnumerable(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3FilesEnumerable)));
except
on E: Exception do
begin
aCtx.GetParamError('aFiles: Im3FilesEnumerable : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperLockDeltas_ImplLockDeltas(aCtx, l_aSelf, l_aFiles));
end;//TkwTm3DBHelperLockDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperUnlockDeltas_ImplUnlockDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper);
begin
aSelf.UnlockDeltas;
end;//TkwTm3DBHelperUnlockDeltas_ImplUnlockDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperUnlockDeltas_Documentation: AnsiString;
begin
Result := 'Освобождает захваченные индексы.';
end;//TkwTm3DBHelperUnlockDeltas_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperUnlockDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
TkwTm3DBHelperUnlockDeltas_ImplUnlockDeltas(aCtx, l_aSelf);
end;//TkwTm3DBHelperUnlockDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperIndexName_ImplIndexName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Il3CString;
begin
Result := aSelf.IndexName;
end;//TkwTm3DBHelperIndexName_ImplIndexName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperIndexName_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperIndexName_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperIndexName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperIndexName_ImplIndexName(aCtx, l_aSelf));
end;//TkwTm3DBHelperIndexName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexForPurgeFiles_ImplGetIndexForPurgeFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetIndexForPurgeFiles;
end;//TkwTm3DBHelperGetIndexForPurgeFiles_ImplGetIndexForPurgeFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexForPurgeFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexForPurgeFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexForPurgeFiles_Documentation: AnsiString;
begin
Result := '"Провисшие" файлы для удаления.';
end;//TkwTm3DBHelperGetIndexForPurgeFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetIndexForPurgeFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetIndexForPurgeFiles_ImplGetIndexForPurgeFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexForPurgeFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexName_ImplNewIndexName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Il3CString;
begin
Result := aSelf.NewIndexName;
end;//TkwTm3DBHelperNewIndexName_ImplNewIndexName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexName_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperNewIndexName_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperNewIndexName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperNewIndexName_ImplNewIndexName(aCtx, l_aSelf));
end;//TkwTm3DBHelperNewIndexName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperDeleteIndex_ImplDeleteIndex(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Boolean;
begin
Result := aSelf.DeleteIndex;
end;//TkwTm3DBHelperDeleteIndex_ImplDeleteIndex
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperDeleteIndex_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperDeleteIndex_ImplDeleteIndex(aCtx, l_aSelf));
end;//TkwTm3DBHelperDeleteIndex_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperPurgeIndexDeltas_ImplPurgeIndexDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper);
begin
aSelf.PurgeIndexDeltas;
end;//TkwTm3DBHelperPurgeIndexDeltas_ImplPurgeIndexDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperPurgeIndexDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
TkwTm3DBHelperPurgeIndexDeltas_ImplPurgeIndexDeltas(aCtx, l_aSelf);
end;//TkwTm3DBHelperPurgeIndexDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperDeleteAllIndexDeltas_ImplDeleteAllIndexDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Boolean;
begin
Result := aSelf.DeleteAllIndexDeltas;
end;//TkwTm3DBHelperDeleteAllIndexDeltas_ImplDeleteAllIndexDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperDeleteAllIndexDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperDeleteAllIndexDeltas_ImplDeleteAllIndexDeltas(aCtx, l_aSelf));
end;//TkwTm3DBHelperDeleteAllIndexDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetAllIndexFiles_ImplGetAllIndexFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetAllIndexFiles;
end;//TkwTm3DBHelperGetAllIndexFiles_ImplGetAllIndexFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetAllIndexFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetAllIndexFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetAllIndexFiles_Documentation: AnsiString;
begin
Result := 'Все файлы индекса для поиска или объединения.';
end;//TkwTm3DBHelperGetAllIndexFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetAllIndexFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetAllIndexFiles_ImplGetAllIndexFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetAllIndexFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexMainFiles_ImplGetIndexMainFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetIndexMainFiles;
end;//TkwTm3DBHelperGetIndexMainFiles_ImplGetIndexMainFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexMainFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexMainFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexMainFiles_Documentation: AnsiString;
begin
Result := 'Файлы основной части индекса (то что раньше было IndexName).';
end;//TkwTm3DBHelperGetIndexMainFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetIndexMainFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetIndexMainFiles_ImplGetIndexMainFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexMainFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperTryLockDeltas_ImplTryLockDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper;
const aFiles: Im3FilesEnumerable): Boolean;
begin
Result := aSelf.TryLockDeltas(aFiles);
end;//TkwTm3DBHelperTryLockDeltas_ImplTryLockDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperTryLockDeltas_Documentation: AnsiString;
begin
Result := 'Пытается захватить индексы. Может это делать в цикле, с таймаутом.';
end;//TkwTm3DBHelperTryLockDeltas_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperTryLockDeltas_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TypeInfo(Tm3DBHelper)), TtfwParamInfo_C('aFiles', TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable)))]);
end;//TkwTm3DBHelperTryLockDeltas_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperTryLockDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
var l_aFiles: Im3FilesEnumerable;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aFiles := Im3FilesEnumerable(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3FilesEnumerable)));
except
on E: Exception do
begin
aCtx.GetParamError('aFiles: Im3FilesEnumerable : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperTryLockDeltas_ImplTryLockDeltas(aCtx, l_aSelf, l_aFiles));
end;//TkwTm3DBHelperTryLockDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Tm3DBHelper));
end;//Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
constructor Tm3DBHelper.Create(const aBaseName: AnsiString);
//#UC START# *5B4782E301CB_5B4782B40258_var*
//#UC END# *5B4782E301CB_5B4782B40258_var*
begin
//#UC START# *5B4782E301CB_5B4782B40258_impl*
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
f_BaseName := aBaseName;
f_BaseName := Tm3SplittedFileStream.NormalizeFileName(f_BaseName);
f_BaseName := ChangeFileExt(f_BaseName, '');
inherited Create;
//#UC END# *5B4782E301CB_5B4782B40258_impl*
end;//Tm3DBHelper.Create
class function Tm3DBHelper.Make(const aBaseName: AnsiString): Im3DBHelper;
var
l_Inst : Tm3DBHelper;
begin
l_Inst := Create(aBaseName);
try
Result := l_Inst;
finally
l_Inst.Free;
end;//try..finally
end;//Tm3DBHelper.Make
procedure Tm3DBHelper.CheckIndexDeltaFiles;
//#UC START# *5B4786110237_5B4782B40258_var*
//var
//l_IndexName : String;
//l_Name : String;
//l_Index : Integer;
//l_T1, l_T2 : TDateTime;
//l_WasDelete : Boolean;
//#UC END# *5B4786110237_5B4782B40258_var*
begin
//#UC START# *5B4786110237_5B4782B40258_impl*
//if (f_IndexDeltaFiles = nil) then
begin
LoadFiles(cIndexDeltasForPurgeExt, f_IndexDeltaFilesForPurge);
//if (f_IndexDeltaFiles = nil) then
// f_IndexDeltaFiles := Tl3StringList.Create;
//if LoadFiles(cIndexDeltasExt, f_IndexDeltaFiles) then
//begin
(* while true do
begin
if (l_Index = 0) then
l_Name := f_BaseName + cIndexDeltaExt
else
l_Name := f_BaseName + cIndexDeltaExt + IntToStr(l_Index);
if not Tm3StorageManager.StorageFileExists(l_Name) then
begin
l_IndexName := l_Name;
break;
end;//not Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
f_NewIndexDeltaName := l_IndexName;
l_WasDelete := false;
if not f_IndexDeltaFiles.Empty then
begin
l_IndexName := IndexName;
if Tm3StorageManager.StorageFileExists(l_IndexName) then
begin
l_T1 := Tm3StorageManager.StorageFileDateTime(l_IndexName);
if not SameValue(l_T1, NullDate) then
begin
l_Index := 0;
while (l_Index < f_IndexDeltaFiles.Count) do
begin
l_IndexName := f_IndexDeltaFiles.Items[l_Index].AsString;
l_T2 := Tm3StorageManager.StorageFileDateTime(l_IndexName);
if not SameValue(l_T2, NullDate) then
begin
if ((DaysBetween(l_T1, l_T2) > 0) AND (CompareValue(l_T1, l_T2) > 0)) then
begin
f_IndexDeltaFiles.Delete(l_Index);
AddToList(f_IndexDeltaFilesForPurge, l_IndexName);
l_WasDelete := true;
continue;
end;//DaysBetween..
end;//not SameValue(l_T2, NullDate)
Inc(l_Index);
end;//while (l_Index < f_IndexDeltaFiles.Count)
end;//not SameValue(l_T1, NullDate)
end;//Tm3StorageManager.StorageFileExists(l_IndexName)
end;//not f_IndexDeltaFiles.Empty
if l_WasDelete then
begin
SaveIndexDeltaFilesForPurge;
SaveIndexDeltaFiles;
end;//l_WasDelete*)
//end//LoadFiles(cIndexDeltasExt, f_IndexDeltaFiles, l_Index)
//else
//begin
// - эту ветку пока НЕЛЬЗЯ убирать т.к. падают TBuildIndexAndSearchTest
(* l_IndexName := f_BaseName + cIndexDeltaExt;
if Tm3StorageManager.StorageFileExists(l_IndexName) then
begin
f_IndexDeltaFiles.Add(l_IndexName);
l_Index := 1;
while true do
begin
l_Name := l_IndexName + IntToStr(l_Index);
if Tm3StorageManager.StorageFileExists(l_Name) then
begin
f_IndexDeltaFiles.Add(l_Name);
end//Tm3StorageManager.StorageFileExists(l_Name)
else
begin
l_IndexName := l_Name;
break;
end;//Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
end;//Tm3StorageManager.StorageFileExists(l_IndexName)
f_NewIndexDeltaName := l_IndexName;
if not FileExists(f_BaseName + cIndexDeltasExt) then
if not f_IndexDeltaFiles.Empty then
SaveIndexDeltaFiles;*)
//end;//LoadFiles(cIndexDeltasExt, f_IndexDeltaFiles, l_Index)
end;//f_IndexDeltaFiles = nil
//#UC END# *5B4786110237_5B4782B40258_impl*
end;//Tm3DBHelper.CheckIndexDeltaFiles
procedure Tm3DBHelper.SaveFiles(const aFileName: AnsiString;
const aFiles: Im3FilesEnumerable;
const anExcludeFiles: Im3FilesEnumerable);
//#UC START# *5B503FBC002F_5B4782B40258_var*
function loc_DeleteFile(const aFileName: String): Boolean;
begin//loc_DeleteFile
try
if not FileExists(aFileName) then
Result := true
else
Result := SysUtils.DeleteFile(aFileName);
Exit;
except
on E: Exception do
begin
l3System.Exception2Log(E);
Result := false;
end;//on E: Exception
end;//try..except
end;//loc_DeleteFile
var
l_Filer : Tl3CustomFiler;
l_It : Im3FilesEnumerator;
l_Name : String;
l_FileName : String;
l_Written : Tl3StringList;
l_Write : Boolean;
l_Index : Integer;
//#UC END# *5B503FBC002F_5B4782B40258_var*
begin
//#UC START# *5B503FBC002F_5B4782B40258_impl*
l_FileName := f_BaseName + aFileName;
if (aFiles = nil) OR aFiles.Empty then
if loc_DeleteFile(l_FileName) then
Exit;
l_Written := nil;
try
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmExclusiveWrite, false, cTimeOut);
try
l_Filer.TryOpen;
try
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
begin
l_Name := l_It.Current.AsString;
if Tm3StorageManager.StorageFileExists(l_Name) then
begin
if (anExcludeFiles = nil)
OR not anExcludeFiles.Has(l_It.Current)
then
begin
l_Write := true;
if (l_Written = nil) then
begin
l_Written := Tl3StringList.Create;
{$IfDef Linux}
l_Written.Sorted := true;
{$Else Linux}
l_Written.SortIndex := l3_siCaseUnSensitive;
{$EndIf Linux}
l_Written.Add(l_It.Current);
end//l_Written = nil
else
if l_Written.FindData(l_It.Current, l_Index, l_Written.SortIndex) then
l_Write := false
else
l_Written.Insert(l_Index, l_It.Current);
if l_Write then
begin
l_Name := ExtractFileName(l_Name);
l_Filer.WriteLn(l_Name);
end;//l_Write
end;//anExcludeFiles = nil
end;//Tm3StorageManager.StorageFileExists(l_Name)
end;//for l_Index
end;//aFiles <> nil
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
finally
FreeAndNil(l_Written);
end;//try..finally
//#UC END# *5B503FBC002F_5B4782B40258_impl*
end;//Tm3DBHelper.SaveFiles
function Tm3DBHelper.LoadFiles(const aFileName: AnsiString;
var aFiles: Tl3StringList): Boolean;
//#UC START# *5B50439003A9_5B4782B40258_var*
var
l_Filer : Tl3CustomFiler;
l_Path : String;
l_Name : String;
l_FileName : String;
//#UC END# *5B50439003A9_5B4782B40258_var*
begin
//#UC START# *5B50439003A9_5B4782B40258_impl*
l_FileName := f_BaseName + aFileName;
Result := false;
if FileExists(l_FileName) then
begin
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmRead, false, cTimeOut);
try
l_Filer.TryOpen;
try
Result := true;
l_Path := ExtractFilePath(f_BaseName);
while not l_Filer.EOF do
begin
l_Name := l3PCharLen2String(l_Filer.ReadLn);
if (l_Name = '') then
continue;
l_Name := ConcatDirName(l_Path, l_Name);
if Tm3StorageManager.StorageFileExists(l_Name) then
begin
{$If not Defined(Linux) OR not Defined(Archi)}
{$If not Defined(Linux) OR not Defined(nsTest)}
{$If not Defined(NanoServer)}
{$If not Defined(m3DBCheck)}
l3System.Msg2Log('Tm3DBHelper.LoadFiles: ' + l_Name);
{$IfEnd}
{$IfEnd}
{$IfEnd}
{$IfEnd}
AddToList(aFiles, l_Name);
end;//Tm3StorageManager.StorageFileExists(l_Name)
end;//while not l_Filer.EOF
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//FileExists(l_FileName)
//#UC END# *5B50439003A9_5B4782B40258_impl*
end;//Tm3DBHelper.LoadFiles
procedure Tm3DBHelper.SaveIndexDeltaFilesForPurge;
//#UC START# *5B50514D0055_5B4782B40258_var*
//#UC END# *5B50514D0055_5B4782B40258_var*
begin
//#UC START# *5B50514D0055_5B4782B40258_impl*
SaveFiles(cIndexDeltasForPurgeExt, f_IndexDeltaFilesForPurge.AsEnumerable, nil);
//#UC END# *5B50514D0055_5B4782B40258_impl*
end;//Tm3DBHelper.SaveIndexDeltaFilesForPurge
class function Tm3DBHelper.SafeDeleteStorageFile(const aFileName: AnsiString;
var aNotDeleted: Tl3StringList): Boolean;
//#UC START# *5B604DE30187_5B4782B40258_var*
var
l_WasIndex : Boolean;
//#UC END# *5B604DE30187_5B4782B40258_var*
begin
//#UC START# *5B604DE30187_5B4782B40258_impl*
Result := false;
l_WasIndex := Tm3StorageManager.StorageFileExists(aFileName);
try
Tm3StorageManager.DeleteStorageFile(aFileName);
except
on E: Exception do
begin
l3System.Exception2Log(E);
end;//on E: Exception
end;//try..except
if Tm3StorageManager.StorageFileExists(aFileName) then
begin
AddToList(aNotDeleted, aFileName);
end//Tm3StorageManager.StorageFileExists(l_Name)
else
begin
Result := true;
{$If not Defined(Linux) OR not Defined(Archi)}
{$If not Defined(Linux) OR not Defined(nsTest)}
{$If not Defined(NanoServer)}
{$If not Defined(m3DBCheck)}
if l_WasIndex then
l3System.Msg2Log('Index component deleted: ' + aFileName);
{$IfEnd}
{$IfEnd}
{$IfEnd}
{$IfEnd}
end;//Tm3StorageManager.StorageFileExists(aFileName)
//#UC END# *5B604DE30187_5B4782B40258_impl*
end;//Tm3DBHelper.SafeDeleteStorageFile
class function Tm3DBHelper.SafeDeleteStorageFiles(const aFiles: Im3FilesEnumerator;
var aNotDeleted: Tl3StringList): Boolean;
//#UC START# *5B6058E90206_5B4782B40258_var*
var
l_Name : String;
//#UC END# *5B6058E90206_5B4782B40258_var*
begin
//#UC START# *5B6058E90206_5B4782B40258_impl*
Result := true;
if (aFiles = nil) then
Exit;
while aFiles.MoveNext do
begin
l_Name := aFiles.Current.AsString;
if not SafeDeleteStorageFile(l_Name, aNotDeleted) then
Result := false;
end;//while aFiles.MoveNext
//#UC END# *5B6058E90206_5B4782B40258_impl*
end;//Tm3DBHelper.SafeDeleteStorageFiles
class function Tm3DBHelper.AddToList(var aList: Tl3StringList;
const aName: AnsiString): Boolean;
{* Добавляет значение в список без дубликатов }
//#UC START# *5B60666103E1_5B4782B40258_var*
var
l_Index : Integer;
//#UC END# *5B60666103E1_5B4782B40258_var*
begin
//#UC START# *5B60666103E1_5B4782B40258_impl*
Result := true;
if (aList = nil) then
aList := Tl3StringList.Create;
if not aList.FindData(aName, l_Index) then
aList.Add(aName)
else
Result := false;
//#UC END# *5B60666103E1_5B4782B40258_impl*
end;//Tm3DBHelper.AddToList
function Tm3DBHelper.DeleteIndexPrim: Boolean;
//#UC START# *5D2DFD27019C_5B4782B40258_var*
var
l_IndexName : String;
//#UC END# *5D2DFD27019C_5B4782B40258_var*
begin
//#UC START# *5D2DFD27019C_5B4782B40258_impl*
Result := false;
l_IndexName := Il3CString_ToFileName(Self.IndexName);
CheckIndexDeltaFiles;
if not SafeDeleteStorageFile(l_IndexName, f_IndexDeltaFilesForPurge) then
begin
SaveIndexDeltaFilesForPurge;
end//not SafeDeleteStorageFile(l_IndexName, f_IndexDeltaFilesForPurge)
else
Result := true;
//#UC END# *5D2DFD27019C_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteIndexPrim
class function Tm3DBHelper.WStrToEnumerable(const aStr: Tl3WString): Im3FilesEnumerable;
{* Преобразует строку к списку }
//#UC START# *5E8CBFF800AA_5B4782B40258_var*
var
l_S : Tl3PrimString;
//#UC END# *5E8CBFF800AA_5B4782B40258_var*
begin
//#UC START# *5E8CBFF800AA_5B4782B40258_impl*
l_S := Tl3SharedConstString.CreateShared(aStr);
try
Result := Tl3StringList.ItemToEnumerable(l_S);
finally
FreeAndNil(l_S);
end;//try..finally
//#UC END# *5E8CBFF800AA_5B4782B40258_impl*
end;//Tm3DBHelper.WStrToEnumerable
function Tm3DBHelper.NewIndexDeltaNamePrim(const aFiles: Im3FilesEnumerable;
const anExt: TFileName): Il3CString;
//#UC START# *67D45BD20240_5B4782B40258_var*
var
l_Exists : Boolean;
{$IfDef m3CheckAttrIndexesNames}
function DoFile(const aFileName: string): Boolean;
begin//DoFile
Result := true;
if FileExists(aFileName) then
begin
if (Pos('.etalon.', ExtractFileName(aFileName)) > 0) then
Exit;
l_Exists := true;
Result := false;
end;//FileExists(aFileName)
end;//DoFile
{$EndIf m3CheckAttrIndexesNames}
var
l_Index : Integer;
l_Name : TFileName;
l_Deltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
l_ForPurge : Im3FilesEnumerable;
l_S : Tl3PrimString;
l_Ext : TFileName;
l_Path : TFileName;
{$IfDef m3CheckAttrIndexesNames}
l_FPStub : Pointer;
{$EndIf m3CheckAttrIndexesNames}
l_Mask : TFileName;
{$IfDef m3CheckAttrIndexesNames}
l_NewMask : TFileName;
{$EndIf m3CheckAttrIndexesNames}
l_IsSubIndex : Boolean;
//#UC END# *67D45BD20240_5B4782B40258_var*
begin
//#UC START# *67D45BD20240_5B4782B40258_impl*
Result := nil;
l_Deltas := aFiles;
l_NewDeltas := Self.GetIndexDeltasFiles;
// - то что могли проиндексировать другие
l_ForPurge := Self.GetIndexForPurgeFiles;
if (l_Deltas = nil) then
// - отсекаем новые дельты
l_Deltas := l_NewDeltas
else
l_Deltas := l_Deltas.Join(l_NewDeltas);
if (l_Deltas = nil) then
// - отсекаем файлы помеченные для удаления
l_Deltas := l_ForPurge
else
l_Deltas := l_Deltas.Join(l_ForPurge);
l_Path := ExtractFilePath(f_BaseName);
l_Mask := ExtractFileName(f_BaseName);
l_IsSubIndex := AnsiEndsStr('#', l_Mask);
//Assert(not l_IsSubIndex);
l_Index := 0;
while true do
begin
if (l_Index = 0) then
l_Ext := anExt
else
l_Ext := anExt + Format('%.3x', [l_Index]);
l_Name := f_BaseName + l_Ext;
if not Tm3StorageManager.StorageFileExists(l_Name) then
begin
l_S := Tl3SharedConstString.CreateShared(l_Name);
try
if (l_Deltas = nil)
OR not l_Deltas.Has(l_S)
then
begin
l_Exists := false;
{$IfDef m3CheckAttrIndexesNames}
if not l_IsSubIndex then
begin
l_FPStub := l3LocalStub(@DoFile);
try
l_NewMask := l_Mask + '#*#' + l_Ext;
ProcessFilesWithMask(l_Path, l_NewMask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
end;//not l_IsSubIndex
{$EndIf m3CheckAttrIndexesNames}
if not l_Exists then
begin
Result := l_S.AsCStr;
break;
end;//not l_Exists
end;//l_Deltas = nil
finally
FreeAndNil(l_S);
end;//try..finally
end;//not Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
Assert(not l3IsNil(Result));
//#UC END# *67D45BD20240_5B4782B40258_impl*
end;//Tm3DBHelper.NewIndexDeltaNamePrim
{$If NOT Defined(l3NoSRT)}
function Tm3DBHelper.SetRefTo(var thePlace: Tm3DBHelper): Boolean;
begin
if (thePlace = Self) then
Result := false
else
begin
Result := true;
thePlace.Free;
thePlace := Self.Use;
end;//thePlace = Self
end;//Tm3DBHelper.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)
function Tm3DBHelper.GetIndexDeltasFiles: Im3FilesEnumerable;
{* Файлы дельты индекса }
//#UC START# *5B4780630310_5B4782B40258_var*
var
l_IndexDeltaFiles : Tl3StringList;
//#UC END# *5B4780630310_5B4782B40258_var*
begin
//#UC START# *5B4780630310_5B4782B40258_impl*
l_IndexDeltaFiles := Tl3StringList.Create;
try
LoadFiles(cIndexDeltasExt, l_IndexDeltaFiles);
Result := l_IndexDeltaFiles.AsEnumerable;
finally
FreeAndNil(l_IndexDeltaFiles);
end;//try..finally
//#UC END# *5B4780630310_5B4782B40258_impl*
end;//Tm3DBHelper.GetIndexDeltasFiles
function Tm3DBHelper.NewIndexDeltaName(const aFiles: Im3FilesEnumerable): Il3CString;
//#UC START# *5B478E6000BE_5B4782B40258_var*
(*var
l_Exists : Boolean;
function DoFile(const aFileName: string): Boolean;
begin//DoFile
Result := true;
if FileExists(aFileName) then
begin
if (Pos('.etalon.', ExtractFileName(aFileName)) > 0) then
Exit;
l_Exists := true;
Result := false;
end;//FileExists(aFileName)
end;//DoFile
var
l_Index : Integer;
l_Name : TFileName;
l_Deltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
l_ForPurge : Im3FilesEnumerable;
l_S : Tl3PrimString;
l_Ext : TFileName;
l_Path : TFileName;
l_FPStub : Pointer;
l_Mask : TFileName;
l_NewMask : TFileName;
l_IsSubIndex : Boolean;*)
//#UC END# *5B478E6000BE_5B4782B40258_var*
begin
//#UC START# *5B478E6000BE_5B4782B40258_impl*
Result := Self.NewIndexDeltaNamePrim(aFiles, cIndexDeltaExt);
(* Result := nil;
l_Deltas := aFiles;
l_NewDeltas := Self.GetIndexDeltasFiles;
// - то что могли проиндексировать другие
l_ForPurge := Self.GetIndexForPurgeFiles;
if (l_Deltas = nil) then
// - отсекаем новые дельты
l_Deltas := l_NewDeltas
else
l_Deltas := l_Deltas.Join(l_NewDeltas);
if (l_Deltas = nil) then
// - отсекаем файлы помеченные для удаления
l_Deltas := l_ForPurge
else
l_Deltas := l_Deltas.Join(l_ForPurge);
l_Path := ExtractFilePath(f_BaseName);
l_Mask := ExtractFileName(f_BaseName);
l_IsSubIndex := AnsiEndsStr('#', l_Mask);
Assert(not l_IsSubIndex);
l_Index := 0;
while true do
begin
if (l_Index = 0) then
l_Ext := cIndexDeltaExt
else
l_Ext := cIndexDeltaExt + Format('%.3x', [l_Index]);
l_Name := f_BaseName + l_Ext;
if not Tm3StorageManager.StorageFileExists(l_Name) then
begin
l_S := Tl3SharedConstString.CreateShared(l_Name);
try
if (l_Deltas = nil)
OR not l_Deltas.Has(l_S)
then
begin
l_Exists := false;
l_FPStub := l3LocalStub(@DoFile);
try
l_NewMask := l_Mask + '#*#' + l_Ext;
ProcessFilesWithMask(l_Path, l_NewMask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
if not l_Exists then
begin
Result := l_S.AsCStr;
break;
end;//not l_Exists
end;//l_Deltas = nil
finally
FreeAndNil(l_S);
end;//try..finally
end;//not Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
Assert(not l3IsNil(Result));*)
//#UC END# *5B478E6000BE_5B4782B40258_impl*
end;//Tm3DBHelper.NewIndexDeltaName
procedure Tm3DBHelper.AddNewIndexDeltaName(var aName: Il3CString;
var aFiles: Im3FilesEnumerable;
aNeedRenameToCanonical: Boolean = True);
//#UC START# *5B487D8C0027_5B4782B40258_var*
var
l_OldDeltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
l_InsDelta : Im3FilesEnumerable;
l_WriteFiles : Im3FilesEnumerable;
l_CanonicalDelta : Im3FilesEnumerable;
l_CanonicalName : String;
l_PurgeFiles : Im3FilesEnumerable;
//#UC END# *5B487D8C0027_5B4782B40258_var*
begin
//#UC START# *5B487D8C0027_5B4782B40258_impl*
if Tm3StorageManager.StorageFileExists(aName) then
begin
l_OldDeltas := aFiles;
l_NewDeltas := Self.GetIndexDeltasFiles;
// - то что могли проиндексировать другие
l_InsDelta := Self.WStrToEnumerable(Tl3WString_C(aName));
// - добавляемые файлы
l_PurgeFiles := Self.GetIndexForPurgeFiles;
if false then
// -- пока выключим, т.к. по-моему это может плохо влиять на индексы атрибутов
if aNeedRenameToCanonical then
begin
l_CanonicalName := f_BaseName + cIndexDeltaExt;
if not Tm3StorageManager.StorageFileExists(l_CanonicalName) then
begin
l_CanonicalDelta := Self.WStrToEnumerable(Tl3WString_C(l_CanonicalName));
if (l_PurgeFiles = nil)
OR not l_PurgeFiles.Contains(l_CanonicalDelta) then
begin
if (l_OldDeltas = nil)
OR not l_OldDeltas.Contains(l_CanonicalDelta) then
begin
if (l_NewDeltas = nil)
OR not l_NewDeltas.Contains(l_CanonicalDelta) then
begin
if Tm3StorageManager.RenameStorageFile(Il3CString_ToFileName(aName), l_CanonicalName) then
begin
l_InsDelta := l_CanonicalDelta;
aName := Il3CString_C(l_CanonicalName);
end;//Tm3StorageManager.RenameStorageFile(Il3CString_ToFileName(aName), l_CanonicalName)
end;//l_NewDeltas = nil
end;//l_OldDeltas = nil
end;//l_PurgeFiles = nil
end;//not Tm3StorageManager.StorageFileExists(l_CanonicalName)
end;//aNeedRenameToCanonical
(* Assert(aFiles.Contains(l_NewDeltas));
SaveFiles(cIndexDeltasExt, aFiles, l_PurgeFiles);*)
l_WriteFiles := l_OldDeltas;
if (l_WriteFiles = nil) then
l_WriteFiles := l_InsDelta
else
l_WriteFiles := l_WriteFiles.Join(l_InsDelta);
if (l_WriteFiles = nil) then
l_WriteFiles := l_NewDeltas
else
if not l_WriteFiles.Contains(l_NewDeltas) then
// - чтобы одинаковые сразу отсечь
l_WriteFiles := l_WriteFiles.Join(l_NewDeltas);
SaveFiles(cIndexDeltasExt, l_WriteFiles, l_PurgeFiles);
if (aFiles = nil) then
aFiles := l_InsDelta
else
if not aFiles.Contains(l_InsDelta) then
aFiles := aFiles.Join(l_InsDelta);
end;//Tm3StorageManager.StorageFileExists(aName)
//#UC END# *5B487D8C0027_5B4782B40258_impl*
end;//Tm3DBHelper.AddNewIndexDeltaName
function Tm3DBHelper.LockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Если они уже захвачены, то возвращает false }
//#UC START# *5B488D6C0297_5B4782B40258_var*
{$IfDef Linux}
// 438 = 666 octal which is rw rw rw
const
DEFAULT_RIGHTS = &666;
//DEFAULT_RIGHTS = 438;
{$EndIf Linux}
var
l_Index : Integer;
l_It : Im3FilesEnumerator;
{$IfDef Never}
l_FileDate : TDateTime;
l_Now : TDateTime;
{$EndIf Never}
{$IfDef Linux}
l_Handle : System.THandle;
l_StrToWrite : AnsiString;
l_NeedWrite : DWORD;
l_Written : DWORD;
{$Else Linux}
l_StrToWrite : AnsiString;
l_NeedWrite : DWORD;
l_Written : DWORD;
{$EndIf Linux}
l_Path : TFileName;
//#UC END# *5B488D6C0297_5B4782B40258_var*
begin
//#UC START# *5B488D6C0297_5B4782B40258_impl*
l_Path := ExtractFilePath(f_BaseName);
if not DirectoryExists(l_Path) then
raise Exception.Create(l3ForceUTF8FPC('Не существует папка: ' + l_Path));
f_FlagName := f_BaseName + '.lockidx';
if FileExists(f_FlagName) then
begin
Sleep(1000);
// -- wait - maybe it will bee freed
// - подождём, может кто-то доделает свои дела и отпустит
end;//FileExists(f_FlagName)
{$IfDef Linux}
Result := false;
if FileExists(f_FlagName) then
begin
Sleep(500);
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
l_Handle := MyfpOpen(f_FlagName, O_RdWr, DEFAULT_RIGHTS, 0{dwShareMode}, OPEN_EXISTING{dwCreationDisposition});
//l_Handle := MyfpOpen(f_FlagName, {O_Creat OR }O_RdWr OR O_Trunc, DEFAULT_RIGHTS, 0{dwShareMode}, OPEN_EXISTING{dwCreationDisposition});
(* f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
0);*)
if (l_Handle < 0) then
begin
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_Handle < 0
if not FileTruncate(l_Handle, 0) then
begin
FileClose(l_Handle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not FileTruncate(l_Handle, 0)
end//FileExists(f_FlagName)
else
begin
l_Handle := MyfpOpen(f_FlagName, O_Creat OR O_RdWr OR O_Trunc, DEFAULT_RIGHTS, 0{dwShareMode}, CREATE_NEW{dwCreationDisposition});
(* f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
CREATE_NEW {OPEN_EXISTING},
FILE_FLAG_SEQUENTIAL_SCAN,
0);*)
end;//FileExists(f_FlagName)
if (l_Handle < 0) then
begin
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_Handle < 0
f_FlagHandle := l_Handle;
if (f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Result := false;
Exit;
end;//f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
{$IfNDef l3EmulateExclusiveWthLock}
if not LockFile(f_FlagHandle, 0, 0, 1, 0) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not LockFile(f_FlagHandle, 0, 0, 1, 0)
{$EndIf l3EmulateExclusiveWthLock}
//l_StrToWrite := ParamStr(0);
l_StrToWrite := '';
for l_Index := 0 to ParamCount do
l_StrToWrite := l_StrToWrite + ParamStr(l_Index) + #32{#13#10};
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
begin
l_StrToWrite := #13#10 + l_It.Current.AsString;
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
end;//l_It.MoveNext
end;//aFiles <> nil
Result := true;
Inc(g_WeAreLocker);
Exit;
{$Else Linux}
Result := false;
if FileExists(f_FlagName) then
begin
Sleep(500);
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
0);
if (f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Result := false;
Exit;
end;//f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
if not SetEndOfFile(f_FlagHandle) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not SetEndOfFile(f_FlagHandle)
end//FileExists(f_FlagName)
else
begin
f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
CREATE_NEW {OPEN_EXISTING},
FILE_FLAG_SEQUENTIAL_SCAN,
0);
end;//FileExists(f_FlagName)
if (f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Result := false;
Exit;
end;//f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
if not LockFile(f_FlagHandle, 0, 0, 1, 0) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not LockFile(f_FlagHandle, 0, 0, 1, 0)
//l_StrToWrite := ParamStr(0);
l_StrToWrite := '';
for l_Index := 0 to ParamCount do
l_StrToWrite := l_StrToWrite + ParamStr(l_Index) + #32{#13#10};
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
begin
l_StrToWrite := #13#10 + l_It.Current.AsString;
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
end;//l_It.MoveNext
end;//aFiles <> nil
Result := true;
Inc(g_WeAreLocker);
Exit;
{$EndIf Linux}
{$IfDef Never}
if FileExists(f_FlagName) then
begin
Sleep(1000);
// -- wait - maybe it will bee freed
if FileExists(f_FlagName) then
begin
l_FileDate := l3FileUtils.FileDateTime(f_FlagName);
l_Now := Now;
if (DaysBetween(l_Now, l_FileDate) <= 0) then
begin
while true do
begin
if (MinutesBetween(l_Now, l_FileDate) > 5) then
break;
if not FileExists(f_FlagName) then
break;
Sleep(500);
l_Now := Now;
end;//while true
end;//DaysBetween(l_T1, l_T2) <= 0
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
{$IfDef Linux}
try
// - before deletion check if file busy
f_FlagFiler := Tl3DOSFiler.Make(f_FlagName, l3_fmExclusiveWrite, false, 0{cTimeOut});
try
f_FlagFiler.Open;
//f_FlagFiler.TryOpen;
except
on E: Exception do
begin
{$IfDef Linux}
//l3System.Exception2Log(E);
{$Else Linux}
l3System.Exception2Log(E);
{$EndIf Linux}
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end//on E: Exception
end;//try..except
if not f_FlagFiler.Opened then
begin
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end;//not f_FlagFiler.Opened
finally
FreeAndNil(f_FlagFiler);
end;//try..finally
{$EndIf Linux}
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
if not SysUtils.DeleteFile(f_FlagName)
// - тут попытались удалить залочку
OR FileExists(f_FlagName) then
begin
Result := false;
Exit;
end;//not DeleteFile(f_FlagName)
end;//FileExists(f_FlagName)
end;//FileExists(f_FlagName)
f_FlagFiler := Tl3DOSFiler.Make(f_FlagName, l3_fmExclusiveWrite, false, cTimeOut);
try
f_FlagFiler.TryOpen({$IfDef Linux}false{$EndIf});
except
on E: Exception do
begin
{$IfDef Linux}
//l3System.Exception2Log(E);
{$Else Linux}
l3System.Exception2Log(E);
{$EndIf Linux}
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end//on E: Exception
end;//try..except
if not f_FlagFiler.Opened then
begin
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end;//not f_FlagFiler.Opened
f_FlagFiler.Write(ParamStr(0));
for l_Index := 1 to ParamCount do
//for l_Index := 0 to ParamCount do
begin
f_FlagFiler.Write(' ');
f_FlagFiler.Write(ParamStr(l_Index));
end;//for l_Index
f_FlagFiler.WriteLn('');
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
f_FlagFiler.WriteLn(l_It.Current.AsString);
end;//aFiles <> nil
f_FlagFiler.Flush;
Result := true;
Inc(g_WeAreLocker);
{$EndIf Never}
//#UC END# *5B488D6C0297_5B4782B40258_impl*
end;//Tm3DBHelper.LockDeltas
procedure Tm3DBHelper.UnlockDeltas;
{* Освобождает захваченные индексы }
//#UC START# *5B488D860314_5B4782B40258_var*
var
l_FlagNameBack : String;
//#UC END# *5B488D860314_5B4782B40258_var*
begin
//#UC START# *5B488D860314_5B4782B40258_impl*
if (f_FlagHandle <> {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Dec(g_WeAreLocker);
{$IfDef Never}
Assert(f_FlagFiler = nil);
{$EndIf Never}
{$IfDef Linux}
if not UnlockFile(f_FlagHandle, 0, 0, 1, 0) then
Assert(false);
FileClose(Integer(f_FlagHandle));
{$Else}
if not UnlockFile(f_FlagHandle, 0, 0, 1, 0) then
Assert(false);
CloseHandle(f_FlagHandle);
{$EndIf}
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
try
l_FlagNameBack := f_FlagName + cBackExt;
SysUtils.DeleteFile(l_FlagNameBack);
if g_NoBackCopy then
SysUtils.DeleteFile(f_FlagName)
else
SysUtils.RenameFile(f_FlagName, l_FlagNameBack);
except
on E: Exception do
begin
l3System.Exception2Log(E);
end//on E: Exception
end;//try..except
SysUtils.DeleteFile(f_FlagName);
Exit;
end;//f_FlagHandle <> {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
{$IfDef Never}
if (f_FlagFiler <> nil) then
begin
FreeAndNil(f_FlagFiler);
try
l_FlagNameBack := f_FlagName + cBackExt;
if g_NoBackCopy then
SysUtils.DeleteFile(f_FlagName)
else
SysUtils.RenameFile(f_FlagName, l_FlagNameBack);
SysUtils.RenameFile(f_FlagName, l_FlagNameBack);
except
on E: Exception do
begin
l3System.Exception2Log(E);
end//on E: Exception
end;//try..except
SysUtils.DeleteFile(f_FlagName);
end;//f_FlagFiler <> nil
{$EndIf Never}
//#UC END# *5B488D860314_5B4782B40258_impl*
end;//Tm3DBHelper.UnlockDeltas
function Tm3DBHelper.DeleteIndexDeltas(var aFiles: Im3FilesEnumerable;
aKeepNewDeltas: Boolean): Boolean;
//#UC START# *5B48A66302F3_5B4782B40258_var*
var
l_NotDeleted : Tl3StringList;
l_OldDeltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
//#UC END# *5B48A66302F3_5B4782B40258_var*
begin
//#UC START# *5B48A66302F3_5B4782B40258_impl*
Result := false;
l_NotDeleted := nil;
try
l_OldDeltas := aFiles;
if (l_OldDeltas = nil) then
l_OldDeltas := Self.GetIndexForPurgeFiles
else
l_OldDeltas := l_OldDeltas.Join(Self.GetIndexForPurgeFiles);
if (l_OldDeltas <> nil) then
begin
Tm3StorageHolderList.DropFiles(l_OldDeltas);
SafeDeleteStorageFiles(l_OldDeltas.GetEnumerator, l_NotDeleted);
end;//l_OldDeltas <> nil
FreeAndNil(f_IndexDeltaFilesForPurge);
if aKeepNewDeltas then
l_NewDeltas := Self.GetIndexDeltasFiles
// - то что могли проиндексировать другие
else
l_NewDeltas := nil;
//DeleteFile(f_BaseName + cIndexDeltasExt);
SysUtils.DeleteFile(f_BaseName + cIndexDeltasForPurgeExt);
if (l_NotDeleted <> nil) AND not l_NotDeleted.Empty then
begin
l_NotDeleted.SetRefTo(f_IndexDeltaFilesForPurge);
SaveIndexDeltaFilesForPurge;
end//l_NotDeleted <> nil
else
Result := true;
if (l_OldDeltas = nil) then
// - тут добавляем новые файлы для удаления
l_OldDeltas := Self.GetIndexForPurgeFiles
else
l_OldDeltas := l_OldDeltas.Join(Self.GetIndexForPurgeFiles);
//if (l_NewDeltas <> nil) AND not l_NewDeltas.Empty then
SaveFiles(cIndexDeltasExt, l_NewDeltas, l_OldDeltas);
aFiles := nil;
// - "наших" дельт нет. Есть дельты, которые записали ПОСЛЕ нас
finally
FreeAndNil(l_NotDeleted);
end;//try..finally
//#UC END# *5B48A66302F3_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteIndexDeltas
function Tm3DBHelper.IndexName: Il3CString;
//#UC START# *5B4DC5B502A5_5B4782B40258_var*
var
l_FileName : String;
l_Filer : Tl3CustomFiler;
l_S : String;
//#UC END# *5B4DC5B502A5_5B4782B40258_var*
begin
//#UC START# *5B4DC5B502A5_5B4782B40258_impl*
Result := nil;
l_FileName := f_BaseName + cIndexRefExt;
if FileExists(l_FileName) then
begin
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmRead, false, cTimeOut);
try
l_Filer.TryOpen;
try
while not l_Filer.EOF do
begin
l_S := l3PCharLen2String(l_Filer.ReadLn);
if (l_S <> '') then
begin
Result := Il3CString_C(ConcatDirName(ExtractFilePath(f_BaseName), l_S));
break;
end;//l_S <> ''
end;//while not l_Filer.EOF
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//FileExists(l_FileName)
if l3IsNil(Result) then
begin
Result := Il3CString_C(f_BaseName + cIndexExt);
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmExclusiveWrite, false, cTimeOut);
try
l_Filer.TryOpen;
try
l_Filer.WriteLn(ExtractFileName(Il3CString_ToFileName(Result)));
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//l3IsNil(Result)
//#UC END# *5B4DC5B502A5_5B4782B40258_impl*
end;//Tm3DBHelper.IndexName
function Tm3DBHelper.GetIndexForPurgeFiles: Im3FilesEnumerable;
{* "Провисшие" файлы для удаления }
//#UC START# *5B50400301C4_5B4782B40258_var*
//#UC END# *5B50400301C4_5B4782B40258_var*
begin
//#UC START# *5B50400301C4_5B4782B40258_impl*
CheckIndexDeltaFiles;
Result := f_IndexDeltaFilesForPurge.AsEnumerable;
//#UC END# *5B50400301C4_5B4782B40258_impl*
end;//Tm3DBHelper.GetIndexForPurgeFiles
function Tm3DBHelper.NewIndexName: Il3CString;
//#UC START# *5B5F0C9203A7_5B4782B40258_var*
(*var
l_Ext : String;
l_Num : Integer;
l_Res : String;*)
//#UC END# *5B5F0C9203A7_5B4782B40258_var*
begin
//#UC START# *5B5F0C9203A7_5B4782B40258_impl*
Result := Self.NewIndexDeltaNamePrim(nil, cIndexExt);
(* l_Res := Il3CString_ToFileName(IndexName);
l_Ext := ExtractFileExt(l_Res);
System.Delete(l_Ext, 1, Length(cIndexExt));
l_Num := 0;
if (l_Ext <> '') then
begin
if not TryStrToInt(l_Ext, l_Num) then
l_Num := 0;
end;//l_Ext <> ''
Inc(l_Num);
Assert(l_Num > 0);
Result := Il3CString_C(ChangeFileExt(l_Res, cIndexExt + Format('%.3x', [l_Num])));
//Result := Il3CString_C(ChangeFileExt(l_Res, cIndexExt + IntToStr(l_Num)));*)
//#UC END# *5B5F0C9203A7_5B4782B40258_impl*
end;//Tm3DBHelper.NewIndexName
procedure Tm3DBHelper.SetNewIndexName(var aName: Il3CString);
//#UC START# *5B5F17AC01D0_5B4782B40258_var*
var
l_IndexName : Il3CString;
l_Filer : Tl3CustomFiler;
l_Ext : TFileName;
//#UC END# *5B5F17AC01D0_5B4782B40258_var*
begin
//#UC START# *5B5F17AC01D0_5B4782B40258_impl*
if Tm3StorageManager.StorageFileExists(aName) then
begin
l_Ext := ExtractFileExt(Il3CString_ToFileName(aName));
l_IndexName := IndexName;
if Il3CString_Equals(l_IndexName, aName) then
begin
aName := l_IndexName;
// - это присвоение - чисто для отладки
Exit;
end;//Il3CString_Equals(l_IndexName, aName)
if (l_Ext = '.idx') then
// https://mdp.garant.ru/pages/viewpage.action?pageId=892633731
begin
DeleteIndexPrim;
// - удаляем ПРЕДЫДУЩИЙ индекс, но новый НЕ переименовываем
end//l_Ext = '.idx'
else
begin
if DeleteIndexPrim then
begin
Tm3StorageManager.RenameStorageFile(aName, l_IndexName);
aName := l_IndexName;
// - возвращаем обратно новое значение
Exit;
end;//DeleteIndexPrim
end;//l_Ext = '.idx'
//else
begin
l_Filer := Tl3DOSFiler.Make(f_BaseName + cIndexRefExt, l3_fmExclusiveWrite, false, cTimeOut);
try
l_Filer.TryOpen;
try
l_Filer.WriteLn(ExtractFileName(Il3CString_ToFileName(aName)));
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//DeleteIndexPrim
end;//Tm3StorageManager.StorageFileExists(aName)
//#UC END# *5B5F17AC01D0_5B4782B40258_impl*
end;//Tm3DBHelper.SetNewIndexName
function Tm3DBHelper.DeleteIndex: Boolean;
//#UC START# *5B615D7F01CC_5B4782B40258_var*
procedure DeleteAttrIndexes;
procedure DoDeleteAttrIndexes;
var
l_NotDeleted: Tl3StringList;
function DoFile1(const aFileName: string): Boolean;
begin//DoFile1
Result := true;
if FileExists(aFileName) then
begin
if (Pos('.etalon.', ExtractFileName(aFileName)) > 0) then
Exit;
Self.SafeDeleteStorageFile(aFileName, l_NotDeleted);
//Tm3StorageManager.DeleteStorageFile(aFileName);
// - !!! тут надо не забыть про SafeDeleteStorageFile
//SysUtils.DeleteFile(aFileName);
end;//FileExists(aFileName)
end;//DoFile1
var
l_FPStub : Pointer;
var
l_Mask : TFileName;
var
l_Folder : String;
begin//DoDeleteAttrIndexes
// !!! тут надо подумать про DeleteAttrIndexes vs. DeleteAllIndexDeltas !!!
l_Folder := ExtractFilePath(f_BaseName);
l_Mask := ExtractFileName(f_BaseName) + '#' + '*' + '#';
l_Mask := l_Mask + '.idx*';
//l_Mask := l_Mask + '.*';
//l_Mask := cMask;
l_NotDeleted := nil;
try
l_FPStub := l3LocalStub(@DoFile1);
try
ProcessFilesWithMask(l_Folder, l_Mask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
l_Mask := ExtractFileName(f_BaseName) + '#' + '*' + '#';
l_Mask := l_Mask + cIndexRefExt;
l_FPStub := l3LocalStub(@DoFile1);
try
ProcessFilesWithMask(l_Folder, l_Mask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
if (l_NotDeleted <> nil) AND not l_NotDeleted.Empty then
begin
l_NotDeleted.SetRefTo(f_IndexDeltaFilesForPurge);
SaveIndexDeltaFilesForPurge;
end;//l_NotDeleted <> nil
finally
FreeAndNil(l_NotDeleted);
end;//try..finally
end;//DoDeleteAttrIndexes
begin//DeleteAttrIndexes
DoDeleteAttrIndexes;
DoDeleteAttrIndexes;
// - twice because of Linux BUG.
end;//DeleteAttrIndexes
var
l_FileName : String;
//#UC END# *5B615D7F01CC_5B4782B40258_var*
begin
//#UC START# *5B615D7F01CC_5B4782B40258_impl*
Result := DeleteIndexPrim;
if Result then
begin
l_FileName := f_BaseName + cIndexRefExt;
if FileExists(l_FileName) then
SysUtils.DeleteFile(l_FileName);
end;//Result
DeleteAttrIndexes;
//#UC END# *5B615D7F01CC_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteIndex
procedure Tm3DBHelper.PurgeIndexDeltas;
//#UC START# *5D47E7D002A1_5B4782B40258_var*
var
l_NotDeleted : Tl3StringList;
l_E : Im3FilesEnumerable;
//#UC END# *5D47E7D002A1_5B4782B40258_var*
begin
//#UC START# *5D47E7D002A1_5B4782B40258_impl*
try
l_NotDeleted := nil;
try
CheckIndexDeltaFiles;
if (f_IndexDeltaFilesForPurge <> nil)
AND (f_IndexDeltaFilesForPurge.Count > 0) then
begin
//SafeDeleteStorageFiles(Self.GetIndexDeltasFiles, l_NotDeleted);
l_E := Self.GetIndexForPurgeFiles;
if (l_E <> nil) then
begin
Tm3StorageHolderList.DropFiles(l_E);
SafeDeleteStorageFiles(l_E.GetEnumerator, l_NotDeleted);
end;//l_E <> nil
l_E := nil;
//DeleteFile(f_BaseName + cIndexDeltasExt);
SysUtils.DeleteFile(f_BaseName + cIndexDeltasForPurgeExt);
FreeAndNil(f_IndexDeltaFilesForPurge);
if (l_NotDeleted <> nil) AND not l_NotDeleted.Empty then
begin
l_NotDeleted.SetRefTo(f_IndexDeltaFilesForPurge);
SaveIndexDeltaFilesForPurge;
end;//l_NotDeleted <> nil
end;//f_IndexDeltaFilesForPurge <> nil
finally
FreeAndNil(l_NotDeleted);
end;//try..finally
except
on E: Exception do
begin
l3System.Exception2Log(E);
end;//on E: Exception
end;//try..except
//#UC END# *5D47E7D002A1_5B4782B40258_impl*
end;//Tm3DBHelper.PurgeIndexDeltas
function Tm3DBHelper.DeleteAllIndexDeltas: Boolean;
//#UC START# *5E85C0CE0249_5B4782B40258_var*
var
l_E : Im3FilesEnumerable;
//#UC END# *5E85C0CE0249_5B4782B40258_var*
begin
//#UC START# *5E85C0CE0249_5B4782B40258_impl*
l_E := Self.GetIndexDeltasFiles;
Result := DeleteIndexDeltas(l_E, false);
//#UC END# *5E85C0CE0249_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteAllIndexDeltas
function Tm3DBHelper.GetAllIndexFiles: Im3FilesEnumerable;
{* Все файлы индекса для поиска или объединения }
//#UC START# *5E8C9C7E0334_5B4782B40258_var*
var
l_Index : Im3FilesEnumerable;
//#UC END# *5E8C9C7E0334_5B4782B40258_var*
begin
//#UC START# *5E8C9C7E0334_5B4782B40258_impl*
Result := Self.GetIndexDeltasFiles;
l_Index := Self.GetIndexMainFiles;
if (l_Index <> nil) then
Result := l_Index.Join(Result);
//#UC END# *5E8C9C7E0334_5B4782B40258_impl*
end;//Tm3DBHelper.GetAllIndexFiles
function Tm3DBHelper.GetIndexMainFiles: Im3FilesEnumerable;
{* Файлы основной части индекса (то что раньше было IndexName) }
//#UC START# *5E95ADFB0091_5B4782B40258_var*
var
l_IndexName : Il3CString;
//#UC END# *5E95ADFB0091_5B4782B40258_var*
begin
//#UC START# *5E95ADFB0091_5B4782B40258_impl*
Result := nil;
l_IndexName := Self.IndexName;
if Tm3StorageManager.StorageFileExists(l_IndexName) then
begin
Result := Self.WStrToEnumerable(Tl3WString_C(l_IndexName));
end;//Tm3StorageManager.StorageFileExists(l_IndexName)
//#UC END# *5E95ADFB0091_5B4782B40258_impl*
end;//Tm3DBHelper.GetIndexMainFiles
function Tm3DBHelper.Get_BaseName: AnsiString;
//#UC START# *671A7F340112_5B4782B40258get_var*
//#UC END# *671A7F340112_5B4782B40258get_var*
begin
//#UC START# *671A7F340112_5B4782B40258get_impl*
Result := Self.f_BaseName;
//#UC END# *671A7F340112_5B4782B40258get_impl*
end;//Tm3DBHelper.Get_BaseName
function Tm3DBHelper.TryLockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Может это делать в цикле, с таймаутом }
//#UC START# *68DA67BA037F_5B4782B40258_var*
const
cMax = 5 * 60 * 1000;
var
l_Now : Cardinal;
//#UC END# *68DA67BA037F_5B4782B40258_var*
begin
//#UC START# *68DA67BA037F_5B4782B40258_impl*
l_Now := GetTickCount;
while true do
begin
Result := Self.LockDeltas(aFiles);
if Result then
break;
if l3IsTimeElapsed(l_Now, cMax) then
break;
end;//while true
//#UC END# *68DA67BA037F_5B4782B40258_impl*
end;//Tm3DBHelper.TryLockDeltas
procedure Tm3DBHelper.Cleanup;
{* Функция очистки полей объекта. }
//#UC START# *479731C50290_5B4782B40258_var*
//#UC END# *479731C50290_5B4782B40258_var*
begin
//#UC START# *479731C50290_5B4782B40258_impl*
//UnlockDeltas;
inherited;
FreeAndNil(f_IndexDeltaFilesForPurge);
{$IfDef Never}
FreeAndNil(f_FlagFiler);
{$EndIf Never}
f_FlagName := '';
f_BaseName := '';
//#UC END# *479731C50290_5B4782B40258_impl*
end;//Tm3DBHelper.Cleanup
procedure Tm3DBHelper.BeforeFree;
{* функция, вызываемая при каждом уменьшении счетчика ссылок на 1. Вернув false может запретить уничтожение объекта. }
//#UC START# *48B2BE560115_5B4782B40258_var*
//#UC END# *48B2BE560115_5B4782B40258_var*
begin
//#UC START# *48B2BE560115_5B4782B40258_impl*
inherited;
//#UC END# *48B2BE560115_5B4782B40258_impl*
end;//Tm3DBHelper.BeforeFree
procedure Tm3DBHelper.BeforeRelease;
//#UC START# *49BFC98902FF_5B4782B40258_var*
//#UC END# *49BFC98902FF_5B4782B40258_var*
begin
//#UC START# *49BFC98902FF_5B4782B40258_impl*
//UnlockDeltas;
inherited;
//#UC END# *49BFC98902FF_5B4782B40258_impl*
end;//Tm3DBHelper.BeforeRelease
//#UC START# *5B4782B40258impl*
//#UC END# *5B4782B40258impl*
{$If NOT Defined(NoScripts)}
class function TTm3DBHelperKeywordsPackResNameGetter.ResName: AnsiString;
begin
Result := 'Tm3DBHelperKeywordsPack';
end;//TTm3DBHelperKeywordsPackResNameGetter.ResName
{$R Tm3DBHelperKeywordsPack.res}
{$IfEnd} // NOT Defined(NoScripts)
initialization
{$If NOT Defined(NoScripts)}
TtfwClassRef_Proxy.TtfwClassRef.Register(TypeInfo(Tm3DBHelper));
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassCreate.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperClassCreate_Tm3DBHelper_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperClassCreate_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperClassCreate_DoIt)
.SetMethodName('Create'), ['m3DBHelperClass:Create', '.Tm3DBHelperClass.Create']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassMake.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperClassMake_Im3DBHelper_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperClassMake_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperClassMake_DoIt)
.SetMethodName('Make'), ['m3DBHelperClass:Make', '.Tm3DBHelperClass.Make', 'pop:m3DBHelperClass:Make']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassWStrToEnumerable.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperClassWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperClassWStrToEnumerable_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperClassWStrToEnumerable_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperClassWStrToEnumerable_DoIt)
.SetMethodName('WStrToEnumerable'), ['m3DBHelperClass:WStrToEnumerable', '.Tm3DBHelperClass.WStrToEnumerable', 'pop:m3DBHelperClass:WStrToEnumerable']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))
, 'Ссылка на класс Tm3DBHelper');
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperBaseName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperBaseName_AnsiString_ResultTypeInfo)
.SetDoItProc(TkwTm3DBHelperBaseName_DoIt)
.SetMethodName('BaseName'), ['m3DBHelper:BaseName', '.Tm3DBHelper.BaseName', 'pop:m3DBHelper:BaseName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperCreate.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperCreate_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperCreate_DoIt)
.SetMethodName('Create'), ['m3DBHelper:Create', '.Tm3DBHelper.Create']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperMake.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperMake_Im3DBHelper_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperMake_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperMake_DoIt)
.SetMethodName('Make'), ['m3DBHelper:Make', '.Tm3DBHelper.Make', 'pop:m3DBHelper:Make']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperWStrToEnumerable.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperWStrToEnumerable_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperWStrToEnumerable_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperWStrToEnumerable_DoIt)
.SetMethodName('WStrToEnumerable'), ['m3DBHelper:WStrToEnumerable', '.Tm3DBHelper.WStrToEnumerable', 'pop:m3DBHelper:WStrToEnumerable']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexDeltasFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetIndexDeltasFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetIndexDeltasFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetIndexDeltasFiles_DoIt)
.SetMethodName('GetIndexDeltasFiles'), ['m3DBHelper:GetIndexDeltasFiles', '.Tm3DBHelper.GetIndexDeltasFiles', 'pop:m3DBHelper:GetIndexDeltasFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexDeltaName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperNewIndexDeltaName_Il3CString_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperNewIndexDeltaName_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperNewIndexDeltaName_DoIt)
.SetMethodName('NewIndexDeltaName'), ['m3DBHelper:NewIndexDeltaName', '.Tm3DBHelper.NewIndexDeltaName', 'pop:m3DBHelper:NewIndexDeltaName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperLockDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperLockDeltas_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperLockDeltas_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperLockDeltas_DoIt)
.SetMethodName('LockDeltas'), ['m3DBHelper:LockDeltas', '.Tm3DBHelper.LockDeltas', 'pop:m3DBHelper:LockDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperUnlockDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperUnlockDeltas_Documentation)
.SetDoItProc(TkwTm3DBHelperUnlockDeltas_DoIt)
.SetMethodName('UnlockDeltas'), ['m3DBHelper:UnlockDeltas', '.Tm3DBHelper.UnlockDeltas', 'pop:m3DBHelper:UnlockDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperIndexName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperIndexName_Il3CString_ResultTypeInfo)
.SetDoItProc(TkwTm3DBHelperIndexName_DoIt)
.SetMethodName('IndexName'), ['m3DBHelper:IndexName', '.Tm3DBHelper.IndexName', 'pop:m3DBHelper:IndexName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexForPurgeFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetIndexForPurgeFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetIndexForPurgeFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetIndexForPurgeFiles_DoIt)
.SetMethodName('GetIndexForPurgeFiles'), ['m3DBHelper:GetIndexForPurgeFiles', '.Tm3DBHelper.GetIndexForPurgeFiles', 'pop:m3DBHelper:GetIndexForPurgeFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperNewIndexName_Il3CString_ResultTypeInfo)
.SetDoItProc(TkwTm3DBHelperNewIndexName_DoIt)
.SetMethodName('NewIndexName'), ['m3DBHelper:NewIndexName', '.Tm3DBHelper.NewIndexName', 'pop:m3DBHelper:NewIndexName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteIndex.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDoItProc(TkwTm3DBHelperDeleteIndex_DoIt)
.SetMethodName('DeleteIndex'), ['m3DBHelper:DeleteIndex', '.Tm3DBHelper.DeleteIndex', 'pop:m3DBHelper:DeleteIndex']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperPurgeIndexDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDoItProc(TkwTm3DBHelperPurgeIndexDeltas_DoIt)
.SetMethodName('PurgeIndexDeltas'), ['m3DBHelper:PurgeIndexDeltas', '.Tm3DBHelper.PurgeIndexDeltas', 'pop:m3DBHelper:PurgeIndexDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteAllIndexDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDoItProc(TkwTm3DBHelperDeleteAllIndexDeltas_DoIt)
.SetMethodName('DeleteAllIndexDeltas'), ['m3DBHelper:DeleteAllIndexDeltas', '.Tm3DBHelper.DeleteAllIndexDeltas', 'pop:m3DBHelper:DeleteAllIndexDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetAllIndexFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetAllIndexFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetAllIndexFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetAllIndexFiles_DoIt)
.SetMethodName('GetAllIndexFiles'), ['m3DBHelper:GetAllIndexFiles', '.Tm3DBHelper.GetAllIndexFiles', 'pop:m3DBHelper:GetAllIndexFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexMainFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetIndexMainFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetIndexMainFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetIndexMainFiles_DoIt)
.SetMethodName('GetIndexMainFiles'), ['m3DBHelper:GetIndexMainFiles', '.Tm3DBHelper.GetIndexMainFiles', 'pop:m3DBHelper:GetIndexMainFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperTryLockDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperTryLockDeltas_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperTryLockDeltas_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperTryLockDeltas_DoIt)
.SetMethodName('TryLockDeltas'), ['m3DBHelper:TryLockDeltas', '.Tm3DBHelper.TryLockDeltas', 'pop:m3DBHelper:TryLockDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TTm3DBHelperKeywordsPackResNameGetter.Register;
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwTypeInfo.MakeString
, 'Стандартный строковый тип Delphi.');
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwTypeInfo.MakeBoolean);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwTypeInfo.MakeString
, 'Строка с кодировкой и с длиной.');
{$IfEnd} // NOT Defined(NoScripts)
//#UC START# *5B4782B40258forDiagramm*
(*
*)
//#UC END# *5B4782B40258forDiagramm*
end.