Componentes.Terceros.SDAC/internal/4.10.0.10/1/Source/MSConnectionPool.pas
2007-10-05 14:48:18 +00:00

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.