ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/journaling/fbintf/client/2.5/FB25Transaction.pas
(Generate patch)

Comparing:
ibx/trunk/fbintf/client/2.5/FB25Transaction.pas (file contents), Revision 45 by tony, Tue Dec 6 10:33:46 2016 UTC vs.
ibx/branches/journaling/fbintf/client/2.5/FB25Transaction.pas (file contents), Revision 363 by tony, Tue Dec 7 13:30:05 2021 UTC

# Line 60 | Line 60
60   {                                                                        }
61   {************************************************************************}
62   unit FB25Transaction;
63 + {$IFDEF MSWINDOWS}
64 + {$DEFINE WINDOWS}
65 + {$ENDIF}
66  
67   {$IFDEF FPC}
68 < {$mode objfpc}{$H+}
68 > {$mode delphi}
69   {$interfaces COM}
70   {$ENDIF}
71   {$R-}
# Line 79 | Line 82 | type
82    TFB25Transaction = class(TFBTransaction,ITransaction, IActivityMonitor)
83    private
84      FHandle: TISC_TR_HANDLE;
85 +    FFirebird25ClientAPI: TFB25ClientAPI;
86    protected
87      function GetActivityIntf(att: IAttachment): IActivityMonitor; override;
88 +    function GetTrInfo(ReqBuffer: PByte; ReqBufLen: integer): ITrInformation; override;
89 +    procedure SetInterface(api: TFBClientAPI); override;
90 +    procedure InternalStartSingle(attachment: IAttachment); override;
91 +    procedure InternalStartMultiple; override;
92 +    procedure InternalCommit(Force: boolean); override;
93 +    procedure InternalRollback(Force: boolean); override;
94 +    procedure InternalCommitRetaining; override;
95 +    procedure InternalRollbackRetaining; override;
96    public
97      property Handle: TISC_TR_HANDLE read FHandle;
98  
# Line 88 | Line 100 | type
100      {ITransaction}
101      function GetInTransaction: boolean; override;
102      procedure PrepareForCommit; override;
91    procedure Commit(Force: boolean=false); override;
92    procedure CommitRetaining; override;
93    procedure Start(DefaultCompletion: TTransactionCompletion=taCommit); overload; override;
94    procedure Rollback(Force: boolean=false); override;
95    procedure RollbackRetaining; override;
103   end;
104  
105   implementation
# Line 106 | Line 113 | begin
113    Result := (att as TFB25Attachment);
114   end;
115  
116 < function TFB25Transaction.GetInTransaction: boolean;
116 > function TFB25Transaction.GetTrInfo(ReqBuffer: PByte; ReqBufLen: integer
117 >  ): ITrInformation;
118   begin
119 <  Result := FHandle <> nil;
119 >  Result := TTrInformation.Create(FFirebird25ClientAPI);
120 >  with FFirebird25ClientAPI, Result as TTrInformation do
121 >     if isc_transaction_info(StatusVector, @(FHandle), ReqBufLen, ReqBuffer,
122 >                               getBufSize, Buffer) > 0 then
123 >          IBDataBaseError;
124   end;
125  
126 < procedure TFB25Transaction.PrepareForCommit;
126 > procedure TFB25Transaction.SetInterface(api: TFBClientAPI);
127   begin
128 <  if Length(FAttachments) < 2 then
129 <    IBError(ibxeNotAMultiDatabaseTransaction,[nil]);
130 <  if FHandle = nil then
119 <    Exit;
120 <  with Firebird25ClientAPI do
121 <    Call(isc_prepare_transaction(StatusVector, @FHandle));
128 >  inherited SetInterface(api);
129 >  FFirebird25ClientAPI := api as TFB25ClientAPI;
130 >  OnDatabaseError := FFirebird25ClientAPI.IBDataBaseError;
131   end;
132  
133 < procedure TFB25Transaction.Commit(Force: boolean);
133 > procedure TFB25Transaction.InternalStartSingle(attachment: IAttachment);
134 > var db_handle: TISC_DB_HANDLE;
135   begin
136 <  if FHandle = nil then
127 <    Exit;
128 <  with Firebird25ClientAPI do
129 <    Call(isc_commit_transaction(StatusVector, @FHandle),not Force);
130 <  FHandle := nil;
131 < end;
132 <
133 < procedure TFB25Transaction.CommitRetaining;
134 < begin
135 <  if FHandle = nil then
136 <    Exit;
137 <  with Firebird25ClientAPI do
138 <    Call(isc_commit_retaining(StatusVector, @FHandle));
139 < end;
140 <
141 < procedure TFB25Transaction.Start(DefaultCompletion: TTransactionCompletion);
142 < var pteb: PISC_TEB_ARRAY;
143 <    i: integer;
144 <    db_handle: TISC_DB_HANDLE;
145 < begin
146 <  if FHandle <> nil then
147 <    Exit;
148 <  pteb := nil;
149 <  FDefaultCompletion := DefaultCompletion;
150 <  with Firebird25ClientAPI do
151 <  if (Length(FAttachments) = 1)  then
136 >  with FFirebird25ClientAPI do
137    try
138 <    db_handle := (FAttachments[0] as TFB25Attachment).Handle;
138 >    db_handle := (attachment as TFB25Attachment).Handle;
139      Call(isc_start_transaction(StatusVector, @FHandle,1,
140                @db_handle,(FTPB as TTPB).getDataLength,(FTPB as TTPB).getBuffer));
141    except
142      FHandle := nil;
143      raise;
144    end
145 <  else
145 > end;
146 >
147 > procedure TFB25Transaction.InternalStartMultiple;
148 > var pteb: PISC_TEB_ARRAY;
149 >    i: integer;
150 > begin
151 >  pteb := nil;
152 >  with FFirebird25ClientAPI do
153    begin
154      IBAlloc(pteb, 0, Length(FAttachments) * SizeOf(TISC_TEB));
155       try
# Line 168 | Line 160 | begin
160            pteb^[i].tpb_length := (FTPB as TTPB).getDataLength;
161            pteb^[i].tpb_address := (FTPB as TTPB).getBuffer;
162          end;
163 +
164          try
165            Call(isc_start_multiple(StatusVector, @FHandle,
166                                     Length(FAttachments), PISC_TEB(pteb)));
# Line 179 | Line 172 | begin
172          FreeMem(pteb);
173       end;
174    end;
182  Inc(FSeqNo);
175   end;
176  
177 < procedure TFB25Transaction.Rollback(Force: boolean);
177 > procedure TFB25Transaction.InternalCommit(Force: boolean);
178   begin
179 <  if FHandle = nil then
180 <    Exit;
181 <  with Firebird25ClientAPI do
179 >  with FFirebird25ClientAPI do
180 >    Call(isc_commit_transaction(StatusVector, @FHandle),not Force);
181 >  FHandle := nil;
182 > end;
183 >
184 > procedure TFB25Transaction.InternalRollback(Force: boolean);
185 > begin
186 >  with FFirebird25ClientAPI do
187      Call(isc_rollback_transaction(StatusVector, @FHandle),not Force);
188    FHandle := nil;
189   end;
190  
191 < procedure TFB25Transaction.RollbackRetaining;
191 > procedure TFB25Transaction.InternalCommitRetaining;
192 > begin
193 >  with FFirebird25ClientAPI do
194 >    Call(isc_commit_retaining(StatusVector, @FHandle));
195 > end;
196 >
197 > procedure TFB25Transaction.InternalRollbackRetaining;
198   begin
199 +  with FFirebird25ClientAPI do
200 +    Call(isc_rollback_retaining(StatusVector, @FHandle));
201 + end;
202 +
203 + function TFB25Transaction.GetInTransaction: boolean;
204 + begin
205 +  Result := FHandle <> nil;
206 + end;
207 +
208 + procedure TFB25Transaction.PrepareForCommit;
209 + begin
210 +  if Length(FAttachments) < 2 then
211 +    IBError(ibxeNotAMultiDatabaseTransaction,[nil]);
212    if FHandle = nil then
213      Exit;
214 <  with Firebird25ClientAPI do
215 <    Call(isc_rollback_retaining(StatusVector, @FHandle));
214 >  with FFirebird25ClientAPI do
215 >    Call(isc_prepare_transaction(StatusVector, @FHandle));
216   end;
217  
218   end.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines