воскресенье, 12 апреля 2026 г.

m3DirectQueryExecutorFactory

{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}

unit m3DirectQueryExecutorFactory;

// --------------------------------------------------------------------------
// Родители: "Queries" <> MUID: (66FB115B029F) :: "m3" <> MUID: (66FB10950007) :: "Shared Delphi For Archi" <> MUID: (4ABA2360025A)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3DirectQueryExecutorFactory.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<>"
// Элемент модели: "Tm3DirectQueryExecutorFactory" MUID: (66FB12220352)
// --------------------------------------------------------------------------

//#UC START# *66FB12220352beforeDefines*
//#UC END# *66FB12220352beforeDefines*
{$Include daDefine.inc}

interface

uses
 l3IntfUses
 , l3ProtoObject
 , daQueryExecutorFactory
 , daQueryInterfaces
 , daQueryParams
;

type
 Tm3DirectQueryExecutorFactory = class(Tl3ProtoObject, IdaQueryExecutorFactory)
  private
   f_BaseName: AnsiString;
  protected
   procedure InitFields; override;
   {$If NOT Defined(DesignTimeLibrary)}
   class function IsCacheable: Boolean; override;
    {* функция класса, определяющая могут ли объекты данного класса попадать в кэш повторного использования. }
   {$IfEnd} // NOT Defined(DesignTimeLibrary)
   procedure InitAfterAlloc; override;
  public
   procedure SetBaseName(const aBaseName: AnsiString);
   {$If NOT Defined(l3NoSRT)}
   function SetRefTo(var thePlace: Tm3DirectQueryExecutorFactory): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
   {$IfEnd} // NOT Defined(l3NoSRT)
   function MakeExecutor(aParams: TdaQueryParams): IdaQueryExecutor;
   constructor Create(aDummy: Integer); reintroduce;
    {* Специальный хак чтобы напрямую не вызывали конструктор Tm3DirectQueryExecutorFactory }
   constructor CreateInstance; reintroduce;
    {* Конструктор экземпляра синглетона Tm3DirectQueryExecutorFactory }
   class function Instance: Tm3DirectQueryExecutorFactory;
    {* Метод получения экземпляра синглетона Tm3DirectQueryExecutorFactory }
   class function Exists: Boolean;
    {* Проверяет создан экземпляр синглетона или нет }
   class function IsSingleton: Boolean; override;
 end;//Tm3DirectQueryExecutorFactory

implementation

uses
 l3ImplUses
 , m3AttrIndexSearcher
 , daAndQueryParams
 , m3AndQueryExecutor
 , daAllDocsQueryParams
 , m3AllDocsQueryExecutor
 , daDocListQueryParams
 , m3DocListQueryExecutor
 , daDictQueryParams
 , m3DictQueryExecutor
 , m3TextQueryExecutor
 , daTextQueryParams
 , daDateNumQueryParams
 , m3DateNumQueryExecutor
 , daLogByActionQueryParams
 , m3LogByActionQueryExecutor
 , m3IDListQueryExecutor
 , daIDListQueryParams
 , m3OrQueryExecutor
 , daOrQueryParams
 , m3NOTQueryExecutor
 , daNOTQueryParams
 , m3ComplexStageQueryParamsExecutor
 , daComplexStageQueryParams
 , m3SimpleLogQueryExecutor
 , daSimpleLogQueryParams
 , SysUtils
 , l3MemUtils
 , l3Base
 , l3Interlocked
 //#UC START# *66FB12220352impl_uses*
 //#UC END# *66FB12220352impl_uses*
;

var g_Tm3DirectQueryExecutorFactory: Tm3DirectQueryExecutorFactory = nil;
 {* Экземпляр синглетона Tm3DirectQueryExecutorFactory }
var g_Tm3DirectQueryExecutorFactoryLock: Integer = 0;
 {* Счётчик для защиты экземпляра синглетона Tm3DirectQueryExecutorFactory }

procedure Tm3DirectQueryExecutorFactoryFree;
 {* Метод освобождения экземпляра синглетона Tm3DirectQueryExecutorFactory }
var l_O: Tm3DirectQueryExecutorFactory;
begin
 l_O := g_Tm3DirectQueryExecutorFactory;
 g_Tm3DirectQueryExecutorFactory := nil;
 l_O.Free;
end;//Tm3DirectQueryExecutorFactoryFree

procedure Tm3DirectQueryExecutorFactory.SetBaseName(const aBaseName: AnsiString);
//#UC START# *66FB16ED0236_66FB12220352_var*
//#UC END# *66FB16ED0236_66FB12220352_var*
begin
//#UC START# *66FB16ED0236_66FB12220352_impl*
 f_BaseName := aBaseName;
//#UC END# *66FB16ED0236_66FB12220352_impl*
end;//Tm3DirectQueryExecutorFactory.SetBaseName

{$If NOT Defined(l3NoSRT)}
function Tm3DirectQueryExecutorFactory.SetRefTo(var thePlace: Tm3DirectQueryExecutorFactory): Boolean;
begin
 if (thePlace = Self) then
  Result := false
 else
 begin
  Result := true;
  thePlace.Free;
  thePlace := Self.Use;
 end;//thePlace = Self
end;//Tm3DirectQueryExecutorFactory.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)

function Tm3DirectQueryExecutorFactory.MakeExecutor(aParams: TdaQueryParams): IdaQueryExecutor;
//#UC START# *5F193DA802B1_66FB12220352_var*
var
 l_Class : TClass;
 l_Name : String;
//#UC END# *5F193DA802B1_66FB12220352_var*
begin
//#UC START# *5F193DA802B1_66FB12220352_impl*
 Result := nil;
 l_Class := aParams.ClassType;
 //l_Name := l_Class.ClassName;
 l_Name := aParams.ClassName;
 if (l_Class = TdaAndQueryParams) then
  Result := Tm3AndQueryExecutor.Make(aParams As TdaAndQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaOrQueryParams) then
  Result := Tm3OrQueryExecutor.Make(aParams As TdaOrQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaAllDocsQueryParams) then
  Result := Tm3AllDocsQueryExecutor.Make(aParams As TdaAllDocsQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaDocListQueryParams) then
  Result := Tm3DocListQueryExecutor.Make(aParams As TdaDocListQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaDictQueryParams) then
  Result := Tm3DictQueryExecutor.Make(aParams As TdaDictQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaTextQueryParams) then
  Result := Tm3TextQueryExecutor.Make(aParams As TdaTextQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaDateNumQueryParams) then
  Result := Tm3DateNumQueryExecutor.Make(aParams As TdaDateNumQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaIDListQueryParams) then
  Result := Tm3IDListQueryExecutor.Make(aParams As TdaIDListQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaLogByActionQueryParams) then
  Result := Tm3LogByActionQueryExecutor.Make(aParams As TdaLogByActionQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaSimpleLogQueryParams) then
  Result := Tm3SimpleLogQueryExecutor.Make(aParams As TdaSimpleLogQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaNOTQueryParams) then
  Result := Tm3NOTQueryExecutor.Make(aParams As TdaNOTQueryParams, Self.f_BaseName)
 else
 if (l_Class = TdaComplexStageQueryParams) then
  Result := Tm3ComplexStageQueryParamsExecutor.Make(aParams As TdaComplexStageQueryParams, Self.f_BaseName)
 else
 begin
  Assert(false, 'Executor for ' + l_Name + ' not defined');
 end;//l_Class =
//#UC END# *5F193DA802B1_66FB12220352_impl*
end;//Tm3DirectQueryExecutorFactory.MakeExecutor

constructor Tm3DirectQueryExecutorFactory.Create(aDummy: Integer);
 {* Специальный хак чтобы напрямую не вызывали конструктор Tm3DirectQueryExecutorFactory }
begin
 Assert(false, 'Нельзя напрямую вызывать конструктор синглетона Tm3DirectQueryExecutorFactory. Пользуйтесь методом Instance');
end;//Tm3DirectQueryExecutorFactory.Create

constructor Tm3DirectQueryExecutorFactory.CreateInstance;
 {* Конструктор экземпляра синглетона Tm3DirectQueryExecutorFactory }
begin
 inherited Create;
end;//Tm3DirectQueryExecutorFactory.CreateInstance

class function Tm3DirectQueryExecutorFactory.Instance: Tm3DirectQueryExecutorFactory;
 {* Метод получения экземпляра синглетона Tm3DirectQueryExecutorFactory }
var l_Lock: Integer;
begin
 if (g_Tm3DirectQueryExecutorFactory = nil) then
 begin
  l_Lock := l3InterlockedIncrement(g_Tm3DirectQueryExecutorFactoryLock);
  try
   if (g_Tm3DirectQueryExecutorFactory = nil) then
   begin
    if (l_Lock = 1) then
    begin
     Tl3MemUtils.AddExitProc(Tm3DirectQueryExecutorFactoryFree);
     CreateInstance;
    end//l_Lock = 1
    else
    begin
     while (g_Tm3DirectQueryExecutorFactory = nil) do 
      Sleep(0);
    end;//l_Lock = 1
   end;
  finally
   l3InterlockedDecrement(g_Tm3DirectQueryExecutorFactoryLock);
  end;
 end;
 Result := g_Tm3DirectQueryExecutorFactory;
 Assert(Result <> nil);
end;//Tm3DirectQueryExecutorFactory.Instance

class function Tm3DirectQueryExecutorFactory.Exists: Boolean;
 {* Проверяет создан экземпляр синглетона или нет }
begin
 Result := g_Tm3DirectQueryExecutorFactory <> nil;
end;//Tm3DirectQueryExecutorFactory.Exists

procedure Tm3DirectQueryExecutorFactory.InitFields;
//#UC START# *47A042E100E2_66FB12220352_var*
//#UC END# *47A042E100E2_66FB12220352_var*
begin
//#UC START# *47A042E100E2_66FB12220352_impl*
 inherited;
 //TdaQueryExecutorFactory.Instance.DirectHelper := Self;
//#UC END# *47A042E100E2_66FB12220352_impl*
end;//Tm3DirectQueryExecutorFactory.InitFields

{$If NOT Defined(DesignTimeLibrary)}
class function Tm3DirectQueryExecutorFactory.IsCacheable: Boolean;
 {* функция класса, определяющая могут ли объекты данного класса попадать в кэш повторного использования. }
begin
 Result := false;
end;//Tm3DirectQueryExecutorFactory.IsCacheable
{$IfEnd} // NOT Defined(DesignTimeLibrary)

procedure Tm3DirectQueryExecutorFactory.InitAfterAlloc;
begin
 inherited;
 Assert(g_Tm3DirectQueryExecutorFactory = nil);
 g_Tm3DirectQueryExecutorFactory := Self;
end;//Tm3DirectQueryExecutorFactory.InitAfterAlloc

class function Tm3DirectQueryExecutorFactory.IsSingleton: Boolean;
begin
 Result := true;
end;//Tm3DirectQueryExecutorFactory.IsSingleton


//#UC START# *66FB12220352forDiagramm*
(*
*)
//#UC END# *66FB12220352forDiagramm*

end.

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

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