⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oracleuniprovider.pas

📁 CrLab UniDAC 1.0 include sources
💻 PAS
字号:
{$IFNDEF CLR}
{$I Odac.inc}
unit OracleUniProvider;
{$ENDIF}

interface

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

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

    function NeedRecreateProcCall: 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;

  TOraConnectDialogService = class (TConnectDialogService)
  private
    FDirect: boolean;
  public
    function SetProp(Prop: integer; const Value: variant): boolean; override;
    function GetConnectMode: integer; override;
  end;

procedure RegisterComponent;

implementation

uses
  TypInfo, DAConsts,
{$IFNDEF UNIDACPRO}
  OraParser, OraConnectionPool, OraClasses, OraServices, OraScriptProcessor;
{$ELSE}
  OraParserUni, OraConnectionPoolUni, OraClassesUni, OraServicesUni, OraScriptProcessorUni;
{$ENDIF}

{ TOracleUniProvider }

class function TOracleUniProvider.GetProviderName: string;
begin
  Result := 'Oracle';
end;

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

function TOracleUniProvider.GetParserClass: TParserClass;
begin
  Result := TOraParser;
end;

function TOracleUniProvider.GetConnectionParametersClass: TCRConnectionParametersClass;
begin
  Result := TOraConnectionParameters;
end;

function TOracleUniProvider.GetConnectionPoolingManagerClass: TCRConnectionPoolManagerClass;
begin
  Result := TOraConnectionPoolManager;
end;

function TOracleUniProvider.GetConnectionClass: TCRConnectionClass;
begin
  Result := TOCIConnection;
end;

function TOracleUniProvider.GetServerEnumeratorClass: TCRServerEnumeratorClass;
begin
  Result := TOraServerEnumerator;
end;

function TOracleUniProvider.GetTransactionClass: TCRTransactionClass;
begin
  Result := TOCITransaction;
end;

function TOracleUniProvider.GetCommandClass: TCRCommandClass;
begin
  Result := TOCICommand;
end;

function TOracleUniProvider.GetRecordSetClass: TCRRecordSetClass;
begin
  Result := TOCIRecordSet;
end;

function TOracleUniProvider.GetDataSetServiceClass: TDADataSetServiceClass;
begin
  Result := TCustomOraDataSetService;
end;

function TOracleUniProvider.GetScriptProcessorClass: TDAScriptProcessorClass;
begin
  Result := TOraScriptProcessor;
end;

function TOracleUniProvider.GetDataTypesMap: TDataTypesMapClass;
begin
  Result := TCustomOraDataTypesMap;
end;

function TOracleUniProvider.GetMetaDataClass: TCRMetaDataClass;
begin
  Result := TOCIMetaData;
end;

function TOracleUniProvider.GetConnectDialogServiceClass: TConnectDialogServiceClass;
begin
  Result := TOraConnectDialogService;
end;

function TOracleUniProvider.GetParamObjectClass(Param: TDAParam): TClass;
begin
  case Param.DataType of
    ftOraClob, ftOraBlob:
      Result := TOraLob;
    ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}:
      Result := TCompressedBlob;
    ftCursor:
      Result := TOraCursor;
  else
    raise Exception.Create(SUnknownDataType);
  end;
end;

function TOracleUniProvider.CreateParamObject(Param: TDAParam): TSharedObject;
begin
  case Param.DataType of
    ftOraClob, ftOraBlob: begin
      Result := TOraLob.Create(nil);
      if Param.DataType = ftOraClob then begin
        if TDBAccessUtils.GetNational(Param) then
          TOraLob(Result).LobType := ltNClob
        else
          TOraLob(Result).LobType := ltClob;
      end
      else
        TOraLob(Result).LobType := ltBlob;
    end;
    ftBlob, ftMemo{$IFDEF VER10P}, ftWideMemo{$ENDIF}: begin
      Result := TCompressedBlob.Create;
    {$IFDEF VER10P}
      if Param.DataType = ftWideMemo then
        TBlob(Result).IsUnicode := True;
    {$ENDIF}
    end;
    ftCursor:
      Result := TOraCursor.Create;
  else
    raise Exception.Create(SUnknownDataType);
  end;
end;

procedure TOracleUniProvider.SetObjectProps(Obj: TObject; Options: TStrings; SetAllProps: boolean);
begin
  if Obj.ClassType = TOCIConnection then begin
  {$IFDEF VER6P}
    TOCIConnection(Obj).SetProp(prEnableSQLTimeStamp, True);
  {$ENDIF}
    TOCIConnection(Obj).SetProp(prIntervalAsString, True);
    GetConnectionOptions.ImportOptions(Options, Obj, TOCIConnection(Obj).SetProp, SetAllProps);
  end
  else
  if Obj.ClassType = TOraConnectionParameters then
    GetConnectionOptions.ImportOptions(Options, Obj, TOraConnectionParameters(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TOraServerEnumerator then
    GetConnectionOptions.ImportOptions(Options, Obj, TOraServerEnumerator(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TOraConnectDialogService then
    GetConnectionOptions.ImportOptions(Options, Obj, TOraConnectDialogService(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TOCICommand then begin
    TOCICommand(Obj).SetProp(prCheckParamHasDefault, False);
    TOCICommand(Obj).SetProp(prUseResultParams, True);
    GetSQLOptions.ImportOptions(Options, Obj, TOCICommand(Obj).SetProp, SetAllProps);
  end
  else
  if Obj.ClassType = TOCIRecordSet then begin
    GetDataSetOptions.ImportOptions(Options, Obj, TOCIRecordSet(Obj).SetProp, SetAllProps);
    GetDataSetOptions.ImportOptions(Options, TOCIRecordSet(Obj).GetCommand, TOCIRecordSet(Obj).GetCommand.SetProp, SetAllProps);
  end
  else
  if Obj.ClassType = TCustomOraDataSetService then
    GetDataSetOptions.ImportOptions(Options, Obj, TCustomOraDataSetService(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TOraScriptProcessor then
    GetScriptOptions.ImportOptions(Options, Obj, TOraScriptProcessor(Obj).SetProp, SetAllProps);
end;

function TOracleUniProvider.GetConnectionOptions: TOptionsList;
begin
  if FConnectionOptions = nil then begin
    FConnectionOptions := TOptionsList.Create(GetProviderName);
    FConnectionOptions.Add(TIntegerOption.Create('CharLength', prCharLength, [TOCIConnection], 1));
    FConnectionOptions.Add(TStringOption.Create('Charset', prCharset, [TOCIConnection], ''));
    FConnectionOptions.Add(TBooleanOption.Create('UseUnicode', prUseUnicode, [TOCIConnection], False));
    FConnectionOptions.Add(TStringOption.Create('DateFormat', prDateFormat, [TOCIConnection], ''));
    FConnectionOptions.Add(TStringOption.Create('DateLanguage', prDateLanguage, [TOCIConnection], ''));
    FConnectionOptions.Add(TBooleanOption.Create('UseOCI7', prUseOCI7, [TOCIConnection, TOraConnectionParameters], False));
    FConnectionOptions.Add(TEnumeratorOption.Create('OptimizerMode', prOptimizerMode, [TOCIConnection], Variant(omDefault), TypeInfo(TOptimizerMode)));
    FConnectionOptions.Add(TIntegerOption.Create('ConnectionTimeout', prConnectionTimeOut, [TOCIConnection, TOraConnectionParameters], 0));
    FConnectionOptions.Add(TBooleanOption.Create('StatementCache', prStatementCache, [TOCIConnection, TOraConnectionParameters], False));
    FConnectionOptions.Add(TIntegerOption.Create('StatementCacheSize', prStatementCacheSize, [TOCIConnection, TOraConnectionParameters], 20));
    FConnectionOptions.Add(TStringOption.Create('ClientIdentifier', prClientIdentifier, [TOCIConnection], ''));
    FConnectionOptions.Add(TBooleanOption.Create('Direct', prDirect, [TOCIConnection, TOraConnectionParameters, TOraServerEnumerator, TOraConnectDialogService], False));
    FConnectionOptions.Add(TEnumeratorOption.Create('ConnectMode', prConnectMode, [TOCIConnection, TOraConnectionParameters], Variant(cmNormal), TypeInfo(TConnectMode)));
    FConnectionOptions.Add(TBooleanOption.Create('ThreadSafety', prThreadSafety, [TOCIConnection], True));
    FConnectionOptions.Add(TStringOption.Create('HomeName', prHomeName, [TOCIConnection, TOraConnectionParameters, TOraServerEnumerator], ''));
    FConnectionOptions.Add(TStringOption.Create('Schema', prSchema, [TOCIConnection], ''));
    FConnectionOptions.Add(TEnumeratorOption.Create('PoolingType', prPoolingType, [TOraConnectionParameters], Variant(optLocal), TypeInfo(TOraPoolingType)));
    FConnectionOptions.Add(TIntegerOption.Create('PrecisionSmallint', prSmallintPrecision, [TOCIConnection], 4));
    FConnectionOptions.Add(TIntegerOption.Create('PrecisionInteger', prIntegerPrecision, [TOCIConnection], 9));
    FConnectionOptions.Add(TIntegerOption.Create('PrecisionLargeint', prLargeintPrecision, [TOCIConnection], 18));
    FConnectionOptions.Add(TIntegerOption.Create('PrecisionFloat', prFloatPrecision, [TOCIConnection], 0));
    FConnectionOptions.Add(TStringOption.Create('PrecisionBCD', prBCDPrecision, [TOCIConnection], '14,4'));
    FConnectionOptions.Add(TStringOption.Create('PrecisionFMTBCD', prFMTBCDPrecision, [TOCIConnection], '38,38'));
  end;
  Result := FConnectionOptions;
end;

function TOracleUniProvider.GetSQLOptions: TOptionsList;
begin
  if FSQLOptions = nil then begin
    FSQLOptions := ToptionsList.Create(GetProviderName);
    FSQLOptions.Add(TBooleanOption.Create('StatementCache', prStatementCache, [TOCICommand], False));
    FSQLOptions.Add(TBooleanOption.Create('TemporaryLobUpdate', prTemporaryLobUpdate, [TOCICommand], True));
  end;
  Result := FSQLOptions;
end;

function TOracleUniProvider.GetDataSetOptions: TOptionsList;
begin
  if FDataSetOptions = nil then begin
    FDataSetOptions := TOptionsList.Create(GetProviderName);
    FDataSetOptions.Add(TBooleanOption.Create('FetchAll', prFetchAll, [TOCIRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('AutoClose', prAutoClose, [TOCIRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('FieldsAsString', prFieldsAsString, [TOCICommand], False));
    FDataSetOptions.Add(TBooleanOption.Create('DeferredLobRead', prDeferredLobRead, [TOCIRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('CacheLobs', prCacheLobs, [TOCICommand], True));
    FDataSetOptions.Add(TBooleanOption.Create('ScrollableCursor', prScrollableCursor, [TOCICommand], False));
    FDataSetOptions.Add(TBooleanOption.Create('RawAsString', prRawAsString, [TOCICommand], False));
    FDataSetOptions.Add(TBooleanOption.Create('TemporaryLobUpdate', prTemporaryLobUpdate, [TOCICommand], True));
    FDataSetOptions.Add(TBooleanOption.Create('StatementCache', prStatementCache, [TOCICommand], False));
    FDataSetOptions.Add(TBooleanOption.Create('ExtendedFieldsInfo', prExtendedFieldsInfo, [TCustomOraDataSetService], False));
    FDataSetOptions.Add(TStringOption.Create('KeySequence', prKeySequence, [TCustomOraDataSetService], ''));
    FDataSetOptions.Add(TEnumeratorOption.Create('SequenceMode', prSequenceMode, [TCustomOraDataSetService], Variant(_smPost), TypeInfo(_TSequenceMode)));
  end;
  Result := FDataSetOptions;
end;

function TOracleUniProvider.GetScriptOptions: TOptionsList;
begin
  if FScriptOptions = nil then begin
    FScriptOptions := TOptionsList.Create(GetProviderName);
  end;
  Result := FScriptOptions;
end;

{ TOraConnectDialogService }

function TOraConnectDialogService.SetProp(Prop: integer; const Value: variant): boolean;
begin
  Result := True;
  case Prop of
    prDirect:
      FDirect := Value;
  else
    Result := inherited SetProp(Prop, Value);
  end;
end;

function TOraConnectDialogService.GetConnectMode: integer;
begin
  if FDirect then
    Result := 2
  else
    Result := 1;
end;

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

initialization
  UniProviders.RegisterProvider(TOracleUniProvider);

finalization
  UniProviders.UnRegisterProvider(TOracleUniProvider);  

end.

⌨️ 快捷键说明

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