|
From: <na...@us...> - 2009-08-16 17:39:04
|
Revision: 831
http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=831&view=rev
Author: nandod
Date: 2009-08-16 17:38:57 +0000 (Sun, 16 Aug 2009)
Log Message:
-----------
* Fixed some "deprecated" warning in the DBX broker under D2007+.
Modified Paths:
--------------
trunk/Source/Brokers/DBX/InstantDBX.pas
Modified: trunk/Source/Brokers/DBX/InstantDBX.pas
===================================================================
--- trunk/Source/Brokers/DBX/InstantDBX.pas 2009-08-16 16:59:53 UTC (rev 830)
+++ trunk/Source/Brokers/DBX/InstantDBX.pas 2009-08-16 17:38:57 UTC (rev 831)
@@ -46,7 +46,7 @@
QControls,
{$ENDIF}
Classes, DB,
- {$IFNDEF D11+}DBXpress,{$ENDIF}
+ {$IFNDEF D11+}DBXpress,{$ELSE}DBXCommon,{$ENDIF}
SqlExpr, InstantPersistence, InstantCommand,
InstantBrokers, InstantMetadata, InstantTypes;
@@ -74,17 +74,21 @@
property VendorLib: string read FVendorLib write FVendorLib;
end;
+ TInstantDBXTransaction = class;
+
TInstantDBXConnector = class(TInstantConnectionBasedConnector)
private
- FTransactionDesc: TTransactionDesc;
+ FTransaction: TInstantDBXTransaction;
FOnLogin: TSQLConnectionLoginEvent;
function GetConnection: TSQLConnection;
procedure SetConnection(Value: TSQLConnection);
function GetCanTransaction: Boolean;
+ function GetTransaction: TInstantDBXTransaction;
+ function CreateTransaction: TInstantDBXTransaction;
+ property Transaction: TInstantDBXTransaction read GetTransaction;
protected
- procedure AssignLoginOptions; override;//CB
+ procedure AssignLoginOptions; override;
function CreateBroker: TInstantBroker; override;
- procedure InitTransactionDesc(var ATransactionDesc: TTransactionDesc); virtual;
procedure InternalCommitTransaction; override;
procedure InternalRollbackTransaction; override;
procedure InternalStartTransaction; override;
@@ -92,6 +96,7 @@
procedure InternalBuildDatabase(Scheme: TInstantScheme); override;
public
class function ConnectionDefClass: TInstantConnectionDefClass; override;
+ destructor Destroy; override;
property CanTransaction: Boolean read GetCanTransaction;
published
property Connection: TSQLConnection read GetConnection write SetConnection;
@@ -221,6 +226,50 @@
function DataTypeToColumnType(DataType: TInstantDataType; Size: Integer): string; override;
end;
+ {
+ Base class for handling transactions. Concrete descendants handle
+ transactions differently in different versions of DBX.
+ }
+ TInstantDBXTransaction = class
+ private
+ FConnector: TInstantDBXConnector;
+ protected
+ property Connector: TInstantDBXConnector read FConnector;
+ public
+ constructor Create(const AConnector: TInstantDBXConnector); virtual;
+ procedure Start; virtual; abstract;
+ procedure Commit; virtual; abstract;
+ procedure Rollback; virtual; abstract;
+ end;
+
+ {
+ Handles transactions in DBX3.
+ }
+ {$IFNDEF D11+}
+ TInstantDBX3Transaction = class(TInstantDBXTransaction)
+ private
+ FTransactionDesc: TTransactionDesc;
+ public
+ procedure Start; override;
+ procedure Commit; override;
+ procedure Rollback; override;
+ end;
+ {$ENDIF}
+
+ {
+ Handles transactions in DBX4.
+ }
+ {$IFDEF D11+}
+ TInstantDBX4Transaction = class(TInstantDBXTransaction)
+ private
+ FTransaction: TDBXTransaction;
+ public
+ procedure Start; override;
+ procedure Commit; override;
+ procedure Rollback; override;
+ end;
+ {$ENDIF}
+
implementation
uses
@@ -279,13 +328,28 @@
Result := inherited Connection as TSQLConnection;
end;
-procedure TInstantDBXConnector.InitTransactionDesc(
- var ATransactionDesc: TTransactionDesc);
+function TInstantDBXConnector.GetTransaction: TInstantDBXTransaction;
begin
- ATransactionDesc.TransactionID := 1;
- ATransactionDesc.GlobalID := 0;
+ if not Assigned(FTransaction) then
+ FTransaction := CreateTransaction;
+ Result := FTransaction;
end;
+function TInstantDBXConnector.CreateTransaction: TInstantDBXTransaction;
+begin
+ {$IFDEF D11+}
+ Result := TInstantDBX4Transaction.Create(Self);
+ {$ELSE}
+ Result := TInstantDBX3Transaction.Create(Self);
+ {$ENDIF}
+end;
+
+destructor TInstantDBXConnector.Destroy;
+begin
+ FreeAndNil(FTransaction);
+ inherited;
+end;
+
procedure TInstantDBXConnector.InternalBuildDatabase(Scheme: TInstantScheme);
begin
StartTransaction;
@@ -301,22 +365,19 @@
procedure TInstantDBXConnector.InternalCommitTransaction;
begin
if CanTransaction then
- Connection.Commit(FTransactionDesc);
+ Transaction.Commit;
end;
procedure TInstantDBXConnector.InternalRollbackTransaction;
begin
if CanTransaction then
- Connection.Rollback(FTransactionDesc);
+ Transaction.Rollback;
end;
procedure TInstantDBXConnector.InternalStartTransaction;
begin
if CanTransaction then
- begin
- InitTransactionDesc(FTransactionDesc);
- Connection.StartTransaction(FTransactionDesc);
- end;
+ Transaction.Start;
end;
function TInstantDBXConnector.ParamByName(const AName: string): string;
@@ -807,6 +868,60 @@
Result := 'Firebird';
end;
+{ TInstantDBXTransaction }
+
+constructor TInstantDBXTransaction.Create(const AConnector: TInstantDBXConnector);
+begin
+ Assert(Assigned(AConnector));
+
+ inherited Create;
+ FConnector := AConnector;
+end;
+
+{ TInstantDBX3Transaction }
+
+{$IFNDEF D11+}
+procedure TInstantDBX3Transaction.Commit;
+begin
+ Connector.Connection.Commit(FTransactionDesc);
+end;
+
+procedure TInstantDBX3Transaction.Rollback;
+begin
+ Connector.Connection.Rollback(FTransactionDesc);
+end;
+
+procedure TInstantDBX3Transaction.Start;
+begin
+ if FTransactionDesc.TransactionID = MAXLONG then
+ FTransactionDesc.TransactionID := 1
+ else
+ FTransactionDesc.TransactionID := FTransactionDesc.TransactionID + 1;
+ FTransactionDesc.IsolationLevel :=
+ TransIsolationLevelMap[Database.TransIsolation];
+ Connector.Connection.StartTransaction(FTransactionDesc);
+end;
+{$ENDIF}
+
+{ TInstantDBX4Transaction }
+
+{$IFDEF D11+}
+procedure TInstantDBX4Transaction.Commit;
+begin
+ Connector.Connection.CommitFreeAndNil(FTransaction);
+end;
+
+procedure TInstantDBX4Transaction.Rollback;
+begin
+ Connector.Connection.RollbackFreeAndNil(FTransaction);
+end;
+
+procedure TInstantDBX4Transaction.Start;
+begin
+ FTransaction := Connector.Connection.BeginTransaction;
+end;
+{$ENDIF}
+
initialization
RegisterClass(TInstantDBXConnectionDef);
TInstantDBXConnector.RegisterClass;
|