понедельник, 27 апреля 2026 г.

Undo/Redo

 





среда, 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://chat.deepseek.com/share/39rqxpf4qgwx8124py

Как я исправляю ошибки

 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 я уже не читаю книги. :-( Их заменили соцсети. А теперь уже и ИИ. Честно скажу - "ушла привычка читать большие тексты".

https://chat.deepseek.com/share/t3o5rjatwe2el7jh5l

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.