понедельник, 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.