git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.SDAC@3 6f543ec7-021b-7e4c-98c9-62eafc7fb9a8
214 lines
6.7 KiB
ObjectPascal
214 lines
6.7 KiB
ObjectPascal
|
|
//////////////////////////////////////////////////
|
|
// SQL Server Data Access Components
|
|
// Copyright © 1998-2007 Core Lab. All right reserved.
|
|
//////////////////////////////////////////////////
|
|
|
|
{$IFNDEF CLR}
|
|
|
|
{$I Sdac.inc}
|
|
|
|
unit MSConnectionPool;
|
|
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF VER6P}
|
|
Variants,
|
|
{$ENDIF}
|
|
Classes, CRConnectionPool, CRAccess, OLEDBAccess;
|
|
|
|
type
|
|
TMSConnectionParameters = class(TCRConnectionParameters)
|
|
protected
|
|
procedure AssignTo(Dest: TPersistent); override;
|
|
|
|
public
|
|
Database: string;
|
|
IsolationLevel: TIsolationLevel;
|
|
Authentication: TMSAuthentication;
|
|
Provider: TOLEDBProvider;
|
|
|
|
QuotedIdentifier: boolean;
|
|
Language: string;
|
|
Encrypt: boolean;
|
|
PersistSecurityInfo: boolean;
|
|
AutoTranslate: boolean;
|
|
NetworkLibrary: string;
|
|
ApplicationName: string;
|
|
WorkstationID: string;
|
|
PacketSize: integer;
|
|
|
|
function Equals(Obj: TCRConnectionParameters): boolean; override;
|
|
end;
|
|
|
|
TMSLocalConnectionPool = class(TCRLocalConnectionPool)
|
|
protected
|
|
function CreateNewConnector: TCRConnection; override;
|
|
end;
|
|
|
|
|
|
TMSConnectionPoolManager = class(TCRConnectionPoolManager)
|
|
protected
|
|
function CreateCRConnectionPool(ConnectionParameters: TCRConnectionParameters): TCRConnectionPool; override;
|
|
public
|
|
class procedure Clear; {$IFDEF CLR}static;{$ENDIF}
|
|
class function GetConnection(ConnectionParameters: TCRConnectionParameters): TCRConnection; {$IFDEF CLR}static;{$ENDIF}
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
{$IFDEF MSWINDOWS}
|
|
Windows,
|
|
{$ENDIF}
|
|
SysUtils, MemData, SyncObjs;
|
|
|
|
var
|
|
ConnectionPoolManager: TMSConnectionPoolManager;
|
|
LockPoolManagerCreate: TCriticalSection;
|
|
|
|
{ TMSConnectionParameters}
|
|
|
|
procedure TMSConnectionParameters.AssignTo(Dest: TPersistent);
|
|
begin
|
|
if Dest is TMSConnectionParameters then begin
|
|
TMSConnectionParameters(Dest).Database := Database;
|
|
TMSConnectionParameters(Dest).IsolationLevel := IsolationLevel;
|
|
TMSConnectionParameters(Dest).Authentication := Authentication;
|
|
TMSConnectionParameters(Dest).Provider := Provider;
|
|
|
|
TMSConnectionParameters(Dest).QuotedIdentifier := QuotedIdentifier;
|
|
TMSConnectionParameters(Dest).Language := Language;
|
|
TMSConnectionParameters(Dest).Encrypt := Encrypt;
|
|
TMSConnectionParameters(Dest).PersistSecurityInfo := PersistSecurityInfo;
|
|
TMSConnectionParameters(Dest).AutoTranslate := AutoTranslate;
|
|
TMSConnectionParameters(Dest).NetworkLibrary := NetworkLibrary;
|
|
TMSConnectionParameters(Dest).ApplicationName := ApplicationName;
|
|
TMSConnectionParameters(Dest).WorkstationID := WorkstationID;
|
|
TMSConnectionParameters(Dest).PacketSize := PacketSize;
|
|
end;
|
|
|
|
inherited;
|
|
end;
|
|
|
|
function TMSConnectionParameters.Equals(Obj: TCRConnectionParameters): boolean;
|
|
var
|
|
O: TMSConnectionParameters;
|
|
begin
|
|
Result := inherited Equals(Obj);
|
|
if Result and (Obj is TMSConnectionParameters) then begin
|
|
O := TMSConnectionParameters(obj);
|
|
Result :=
|
|
(AnsiCompareText(Database, O.Database) = 0) and
|
|
(O.IsolationLevel = IsolationLevel) and
|
|
(O.Authentication = Authentication) and
|
|
(O.Provider = Provider) and
|
|
(O.QuotedIdentifier = QuotedIdentifier) and
|
|
(AnsiCompareText(O.Language, Language) = 0)and
|
|
(O.Encrypt = Encrypt) and
|
|
(O.PersistSecurityInfo = PersistSecurityInfo) and
|
|
(O.AutoTranslate = AutoTranslate) and
|
|
(AnsiCompareText(O.NetworkLibrary, NetworkLibrary) = 0) and
|
|
(AnsiCompareText(O.ApplicationName, ApplicationName) = 0) and
|
|
(AnsiCompareText(O.WorkstationID, WorkstationID) = 0) and
|
|
(O.PacketSize = PacketSize);
|
|
end;
|
|
end;
|
|
|
|
{ TMSLocalConnectionPool }
|
|
|
|
function TMSLocalConnectionPool.CreateNewConnector: TCRConnection;
|
|
begin
|
|
Result := TOLEDBConnection.Create;
|
|
|
|
Result.SetProp(prDatabase, TMSConnectionParameters(ConnectionParameters).Database);
|
|
Result.SetProp(prIsolationLevel, Integer(TMSConnectionParameters(ConnectionParameters).IsolationLevel));
|
|
Result.SetProp(prAuthentication, Integer(TMSConnectionParameters(ConnectionParameters).Authentication));
|
|
Result.SetProp(prProvider, Integer(TMSConnectionParameters(ConnectionParameters).Provider));
|
|
|
|
Result.SetProp(prQuotedIdentifier, TMSConnectionParameters(ConnectionParameters).QuotedIdentifier);
|
|
Result.SetProp(prLanguage, TMSConnectionParameters(ConnectionParameters).Language);
|
|
Result.SetProp(prEncrypt, TMSConnectionParameters(ConnectionParameters).Encrypt);
|
|
Result.SetProp(prPersistSecurityInfo, TMSConnectionParameters(ConnectionParameters).PersistSecurityInfo);
|
|
Result.SetProp(prAutoTranslate, TMSConnectionParameters(ConnectionParameters).AutoTranslate);
|
|
Result.SetProp(prNetworkLibrary, TMSConnectionParameters(ConnectionParameters).NetworkLibrary);
|
|
Result.SetProp(prApplicationName, TMSConnectionParameters(ConnectionParameters).ApplicationName);
|
|
Result.SetProp(prWorkstationID, TMSConnectionParameters(ConnectionParameters).WorkstationID);
|
|
Result.SetProp(prPacketSize, TMSConnectionParameters(ConnectionParameters).PacketSize);
|
|
|
|
StartWait;
|
|
try
|
|
Result.SetUsername(ConnectionParameters.Username);
|
|
Result.SetPassword(ConnectionParameters.Password);
|
|
Result.SetServer(ConnectionParameters.Server);
|
|
|
|
Result.Connect('');
|
|
finally
|
|
StopWait
|
|
end;
|
|
end;
|
|
|
|
{ TMSConnectionPoolManager }
|
|
|
|
function TMSConnectionPoolManager.CreateCRConnectionPool(ConnectionParameters: TCRConnectionParameters): TCRConnectionPool;
|
|
begin
|
|
Result := TMSLocalConnectionPool.Create(Self, ConnectionParameters);
|
|
end;
|
|
|
|
class procedure TMSConnectionPoolManager.Clear;
|
|
begin
|
|
if ConnectionPoolManager <> nil then
|
|
ConnectionPoolManager.InternalClear;
|
|
end;
|
|
|
|
class function TMSConnectionPoolManager.GetConnection(ConnectionParameters: TCRConnectionParameters): TCRConnection;
|
|
begin
|
|
LockPoolManagerCreate.Enter;
|
|
try
|
|
if ConnectionPoolManager = nil then
|
|
ConnectionPoolManager := TMSConnectionPoolManager.Create;
|
|
finally
|
|
LockPoolManagerCreate.Leave;
|
|
end;
|
|
|
|
Result := ConnectionPoolManager.InternalGetConnection(ConnectionParameters);
|
|
end;
|
|
|
|
{$IFDEF WIN32}
|
|
{$IFNDEF VER6P}
|
|
type
|
|
TDLLProc = procedure (Reason: Integer);
|
|
{$ENDIF}
|
|
|
|
var
|
|
OldDLLProc: TDLLProc;
|
|
|
|
procedure LibraryProc(Reason: integer);
|
|
begin
|
|
if Reason = DLL_PROCESS_DETACH then begin
|
|
ConnectionPoolManager.Free;
|
|
ConnectionPoolManager := nil;
|
|
end;
|
|
if Assigned(OldDLLProc) then
|
|
OldDLLProc(Reason);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
initialization
|
|
{$IFDEF WIN32}
|
|
OldDLLProc := DLLProc;
|
|
DLLProc := @LibraryProc;
|
|
{$ENDIF}
|
|
ConnectionPoolManager := nil;
|
|
LockPoolManagerCreate := TCriticalSection.Create;
|
|
|
|
finalization
|
|
ConnectionPoolManager.Free;
|
|
ConnectionPoolManager := nil;
|
|
LockPoolManagerCreate.Free;
|
|
|
|
end.
|