{$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.
Комментариев нет:
Отправить комментарий