--- ibx/trunk/runtime/IBDatabase.pas 2014/07/07 13:00:15 19 +++ ibx/trunk/runtime/IBDatabase.pas 2015/02/26 10:33:34 21 @@ -279,6 +279,8 @@ type TIBTransaction = class(TComponent) private + FAfterTransactionEnd: TNotifyEvent; + FBeforeTransactionEnd: TNotifyEvent; FIBLoaded: Boolean; FCanTimeout : Boolean; FDatabases : TList; @@ -295,6 +297,9 @@ type FTRParams : TStrings; FTRParamsChanged : Boolean; FInEndTransaction : boolean; + FEndAction : TTransactionAction; + procedure DoBeforeTransactionEnd; + procedure DoAfterTransactionEnd; procedure EnsureNotInTransaction; procedure EndTransaction(Action: TTransactionAction; Force: Boolean); function GetDatabase(Index: Integer): TIBDatabase; @@ -336,6 +341,7 @@ type function AddDatabase(db: TIBDatabase): Integer; function FindDatabase(db: TIBDatabase): Integer; function FindDefaultDatabase: TIBDatabase; + function GetEndAction: TTransactionAction; procedure RemoveDatabase(Idx: Integer); procedure RemoveDatabases; procedure CheckDatabasesInList; @@ -357,6 +363,10 @@ type property DefaultAction: TTransactionAction read FDefaultAction write SetDefaultAction default taCommit; property Params: TStrings read FTRParams write SetTRParams; property OnIdleTimer: TNotifyEvent read FOnIdleTimer write FOnIdleTimer; + property BeforeTransactionEnd: TNotifyEvent read FBeforeTransactionEnd + write FBeforeTransactionEnd; + property AfterTransactionEnd: TNotifyEvent read FAfterTransactionEnd + write FAfterTransactionEnd; end; { TIBBase } @@ -1384,6 +1394,18 @@ begin IBError(ibxeNotInTransaction, [nil]); end; +procedure TIBTransaction.DoBeforeTransactionEnd; +begin + if Assigned(FBeforeTransactionEnd) then + FBeforeTransactionEnd(self); +end; + +procedure TIBTransaction.DoAfterTransactionEnd; +begin + if Assigned(FAfterTransactionEnd) then + FAfterTransactionEnd(self); +end; + procedure TIBTransaction.EnsureNotInTransaction; begin if csDesigning in ComponentState then @@ -1460,6 +1482,7 @@ begin CheckInTransaction; if FInEndTransaction then Exit; FInEndTransaction := true; + FEndAction := Action; try case Action of TARollback, TACommit: @@ -1468,6 +1491,7 @@ begin (Action <> FDefaultAction) and (not Force) then IBError(ibxeCantEndSharedTransaction, [nil]); + DoBeforeTransactionEnd; for i := 0 to FSQLObjects.Count - 1 do if FSQLObjects[i] <> nil then SQLObjects[i].DoBeforeTransactionEnd; if InTransaction then @@ -1492,6 +1516,7 @@ begin IBDataBaseError; for i := 0 to FSQLObjects.Count - 1 do if FSQLObjects[i] <> nil then SQLObjects[i].DoAfterTransactionEnd; + DoAfterTransactionEnd; end; end; TACommitRetaining: @@ -1582,6 +1607,14 @@ begin end; end; +function TIBTransaction.GetEndAction: TTransactionAction; +begin + if FInEndTransaction then + Result := FEndAction + else + IBError(ibxeIB60feature, [nil]) +end; + function TIBTransaction.GetIdleTimer: Integer; begin