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

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.


Комментариев нет:

Отправить комментарий