interbaseuniprovider.pas

来自「CrLab UniDAC 1.0 include sources」· PAS 代码 · 共 287 行

PAS
287
字号
{$IFNDEF CLR}

{$I IbDac.inc}

unit InterBaseUniProvider;
{$ENDIF}



interface

uses
  SysUtils, Classes, DB, MemData, CRAccess, CRConnectionPool, DBAccess, MemDS,
  UniProvider, DAScript, CRParser;

type
  TInterBaseUniProvider = class(TUniProvider)
  public
    class function GetProviderName: string; override;

    function IsDatabaseSupported: boolean; override;
    function IsDataSetNeedTransaction: boolean; override;
    function IsInOutParamSupported: boolean; override;
    function NeedRecreateProcCall: boolean; override;
    function NeedReparseSQL: boolean; override;

    function GetParserClass: TParserClass; override;
    function GetConnectionParametersClass: TCRConnectionParametersClass; override;
    function GetConnectionPoolingManagerClass: TCRConnectionPoolManagerClass; override;
    function GetConnectionClass: TCRConnectionClass; override;
    function GetServerEnumeratorClass: TCRServerEnumeratorClass; override;
    function GetTransactionClass: TCRTransactionClass; override;
    function GetCommandClass: TCRCommandClass; override;
    function GetRecordSetClass: TCRRecordSetClass; override;
    function GetDataSetServiceClass: TDADataSetServiceClass; override;
    function GetScriptProcessorClass: TDAScriptProcessorClass; override;
    function GetMetaDataClass: TCRMetaDataClass; override;
    function GetConnectDialogServiceClass: TConnectDialogServiceClass; override;
    function GetDataTypesMap: TDataTypesMapClass; override;
    function GetParamObjectClass(Param: TDAParam): TClass; override;
    function CreateParamObject(Param: TDAParam): TSharedObject; override;

    procedure SetObjectProps(Obj: TObject; Options: TStrings; SetAllProps: boolean); override;

    function GetConnectionOptions: TOptionsList; override;
    function GetSQLOptions: TOptionsList; override;
    function GetDataSetOptions: TOptionsList; override;
    function GetScriptOptions: TOptionsList; override;
  end;

  TIBCConnectDialogService = class (TConnectDialogService)
  public
    function UseDatabaseHistory: boolean; override;
  end;

procedure RegisterComponent;

implementation

uses
  DAConsts,
{$IFDEF VER6P}
  Variants,
{$ENDIF}
{$IFNDEF UNIDACPRO}
  IBCServices, IBCClasses, IBCConnectionPool, IBCScriptProcessor, IBCParser;
{$ELSE}
  IBCServicesUni, IBCClassesUni, IBCConnectionPoolUni, IBCScriptProcessorUni, IBCParserUni;
{$ENDIF}

{ TInterBaseUniProvider }

class function TInterBaseUniProvider.GetProviderName: string;
begin
  Result := 'InterBase';
end;

function TInterBaseUniProvider.IsDatabaseSupported: boolean;
begin
  Result := True;
end;

function TInterBaseUniProvider.IsDataSetNeedTransaction: boolean;
begin
  Result := True;
end;

function TInterBaseUniProvider.IsInOutParamSupported: boolean;
begin
  Result := False;
end;

function TInterBaseUniProvider.NeedRecreateProcCall: boolean;
begin
  Result := True;
end;

function TInterBaseUniProvider.NeedReparseSQL: boolean;
begin
  Result := True;
end;

function TInterBaseUniProvider.GetParserClass: TParserClass;
begin
  Result := TIBCParser;
end;

function TInterBaseUniProvider.GetConnectionParametersClass: TCRConnectionParametersClass;
begin
  Result := TIBCConnectionParameters;
end;

function TInterBaseUniProvider.GetConnectionPoolingManagerClass: TCRConnectionPoolManagerClass;
begin
  Result := TIBCConnectionPoolManager;
end;

function TInterBaseUniProvider.GetConnectionClass: TCRConnectionClass;
begin
  Result := TGDSConnection;
end;

function TInterBaseUniProvider.GetServerEnumeratorClass: TCRServerEnumeratorClass;
begin
  Result := TIBCServerEnumerator;
end;

function TInterBaseUniProvider.GetTransactionClass: TCRTransactionClass;
begin
  Result := TGDSTransaction;
end;

function TInterBaseUniProvider.GetCommandClass: TCRCommandClass;
begin
  Result := TGDSCommand;
end;

function TInterBaseUniProvider.GetRecordSetClass: TCRRecordSetClass;
begin
  Result := TGDSRecordSet;
end;

function TInterBaseUniProvider.GetDataSetServiceClass: TDADataSetServiceClass;
begin
  Result := TCustomIBCDataSetService;
end;

function TInterBaseUniProvider.GetScriptProcessorClass: TDAScriptProcessorClass;
begin
  Result := TCustomIBCScriptProcessor;
end;

function TInterBaseUniProvider.GetMetaDataClass: TCRMetaDataClass;
begin
  Result := TGDSMetaData;
end;

function TInterBaseUniProvider.GetConnectDialogServiceClass: TConnectDialogServiceClass;
begin
  Result := TIBCConnectDialogService;
end;

function TInterBaseUniProvider.GetDataTypesMap: TDataTypesMapClass;
begin
  Result := TCustomIBCDataTypesMap;
end;

function TInterBaseUniProvider.GetParamObjectClass(Param: TDAParam): TClass;
begin
  case Param.DataType of
    ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}:
      Result := TIBCBlob;
  else
    raise Exception.Create(SUnknownDataType);
  end;
end;

function TInterBaseUniProvider.CreateParamObject(Param: TDAParam): TSharedObject;
begin
  case Param.DataType of
    ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: begin
      Result := TIBCBlob.Create(nil, nil);
    end
  else
    raise Exception.Create(SUnknownDataType);
  end;
end;

procedure TInterBaseUniProvider.SetObjectProps(Obj: TObject; Options: TStrings; SetAllProps: boolean);
begin
  if Obj.ClassType = TGDSConnection then begin
    TGDSConnection(Obj).SetProp(prSimpleNumericMap, True);
    TGDSConnection(Obj).SetProp(prEnableMemos, True);
    GetConnectionOptions.ImportOptions(Options, Obj, TGDSConnection(Obj).SetProp, SetAllProps);
  end
  else
  if Obj.ClassType = TIBCConnectionParameters then
    GetConnectionOptions.ImportOptions(Options, Obj, TIBCConnectionParameters(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TGDSCommand then
    GetSQLOptions.ImportOptions(Options, Obj, TGDSCommand(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TGDSRecordSet then begin
    GetDataSetOptions.ImportOptions(Options, Obj, TGDSRecordSet(Obj).SetProp, SetAllProps);
    GetDataSetOptions.ImportOptions(Options, TGDSRecordSet(Obj).GetCommand, TGDSRecordSet(Obj).GetCommand.SetProp, SetAllProps);
  end
  else
  if Obj.ClassType = TCustomIBCDataSetService then
    GetDataSetOptions.ImportOptions(Options, Obj, TCustomIBCDataSetService(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TCustomIBCScriptProcessor then
    GetScriptOptions.ImportOptions(Options, Obj, TCustomIBCScriptProcessor(Obj).SetProp, SetAllProps);
end;

function TInterBaseUniProvider.GetConnectionOptions: TOptionsList;
begin
  if FConnectionOptions = nil then begin
    FConnectionOptions := TOptionsList.Create(GetProviderName);
    FConnectionOptions.Add(TIntegerOption.Create('CharLength', prCharLength, [TGDSConnection], 0));
    FConnectionOptions.Add(TStringOption.Create('Charset', prCharset, [TGDSConnection, TIBCConnectionParameters], ''));
    FConnectionOptions.Add(TStringOption.Create('Role', prRole, [TGDSConnection, TIBCConnectionParameters], ''));
    FConnectionOptions.Add(TBooleanOption.Create('UseUnicode', prUseUnicode, [TGDSConnection, TIBCConnectionParameters], False));
    FConnectionOptions.Add(TIntegerOption.Create('SQLDialect', prSQLDialect, [TGDSConnection, TIBCConnectionParameters], 3));
    FConnectionOptions.Add(TStringOption.Create('ClientLibrary', prClientLibrary, [TGDSConnection], ''));
    FConnectionOptions.Add(TEnumeratorOption.Create('Protocol', prProtocol, [TGDSConnection, TIBCConnectionParameters], Variant(_TCP), TypeInfo(_TIBCProtocol)));
  end;
  Result := FConnectionOptions;
end;

function TInterBaseUniProvider.GetSQLOptions: TOptionsList;
begin
  if FSQLOptions = nil then begin
    FSQLOptions := TOptionsList.Create(GetProviderName);
  end;
  Result := FSQLOptions;
end;

function TInterBaseUniProvider.GetDataSetOptions: TOptionsList;
begin
  if FDataSetOptions = nil then begin
    FDataSetOptions := TOptionsList.Create(GetProviderName);
    FDataSetOptions.Add(TBooleanOption.Create('FetchAll', prFetchAll, [TGDSRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('AutoClose', prAutoClose, [TGDSRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('FieldsAsString', prFieldsAsString, [TGDSRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('DeferredBlobRead', prDeferredBlobRead, [TGDSRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('CacheBlobs', prCacheBlobs, [TGDSCommand], True));
    FDataSetOptions.Add(TBooleanOption.Create('StreamedBlobs', prStreamedBlobs, [TGDSCommand], False));
    FDataSetOptions.Add(TBooleanOption.Create('ComplexArrayFields', prComplexArrayFields, [TGDSRecordSet], True));
    FDataSetOptions.Add(TBooleanOption.Create('DeferredArrayRead', prDeferredArrayRead, [TGDSRecordSet], True));
    FDataSetOptions.Add(TBooleanOption.Create('CacheArrays', prCacheArrays, [TGDSCommand], True));
    FDataSetOptions.Add(TStringOption.Create('KeyGenerator', prKeyGenerator, [TCustomIBCDataSetService], ''));
    FDataSetOptions.Add(TEnumeratorOption.Create('GeneratorMode', prGeneratorMode, [TCustomIBCDataSetService], Variant(_gmPost), TypeInfo(_TGeneratorMode)));
    FDataSetOptions.Add(TStringOption.Create('GeneratorStep', prGeneratorStep, [TCustomIBCDataSetService], 1));
  end;
  Result := FDataSetOptions;
end;

function TInterBaseUniProvider.GetScriptOptions: TOptionsList;
begin
  if FScriptOptions = nil then begin
    FScriptOptions := TOptionsList.Create(GetProviderName);
    FScriptOptions.Add(TBooleanOption.Create('AutoDDL', prAutoDDL, [TCustomIBCScriptProcessor], True));
  end;
  Result := FScriptOptions;
end;

{ TIBCConnectDialogService }

function TIBCConnectDialogService.UseDatabaseHistory: boolean;
begin
  Result := True;
end;

procedure RegisterComponent;
begin
  RegisterComponents('UniDAC', [TInterBaseUniProvider]);
end;

initialization
  UniProviders.RegisterProvider(TInterBaseUniProvider);

finalization
  UniProviders.UnRegisterProvider(TInterBaseUniProvider);

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?