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 |
+ |
function InternalCommit(Force: boolean): TTrCompletionState; override; |
93 |
+ |
function InternalRollback(Force: boolean): TTrCompletionState; override; |
94 |
+ |
procedure InternalCommitRetaining; override; |
95 |
+ |
procedure InternalRollbackRetaining; override; |
96 |
|
public |
97 |
|
property Handle: TISC_TR_HANDLE read FHandle; |
98 |
|
|
100 |
|
{ITransaction} |
101 |
|
function GetInTransaction: boolean; override; |
102 |
|
procedure PrepareForCommit; override; |
97 |
– |
procedure Commit(Force: boolean=false); override; |
98 |
– |
procedure CommitRetaining; override; |
99 |
– |
procedure Start(DefaultCompletion: TTransactionCompletion=taCommit); overload; override; |
100 |
– |
procedure Rollback(Force: boolean=false); override; |
101 |
– |
procedure RollbackRetaining; override; |
103 |
|
end; |
104 |
|
|
105 |
|
implementation |
130 |
|
OnDatabaseError := FFirebird25ClientAPI.IBDataBaseError; |
131 |
|
end; |
132 |
|
|
133 |
< |
function TFB25Transaction.GetInTransaction: boolean; |
134 |
< |
begin |
134 |
< |
Result := FHandle <> nil; |
135 |
< |
end; |
136 |
< |
|
137 |
< |
procedure TFB25Transaction.PrepareForCommit; |
138 |
< |
begin |
139 |
< |
if Length(FAttachments) < 2 then |
140 |
< |
IBError(ibxeNotAMultiDatabaseTransaction,[nil]); |
141 |
< |
if FHandle = nil then |
142 |
< |
Exit; |
143 |
< |
with FFirebird25ClientAPI do |
144 |
< |
Call(isc_prepare_transaction(StatusVector, @FHandle)); |
145 |
< |
end; |
146 |
< |
|
147 |
< |
procedure TFB25Transaction.Commit(Force: boolean); |
148 |
< |
begin |
149 |
< |
if FHandle = nil then |
150 |
< |
Exit; |
151 |
< |
with FFirebird25ClientAPI do |
152 |
< |
Call(isc_commit_transaction(StatusVector, @FHandle),not Force); |
153 |
< |
FHandle := nil; |
154 |
< |
end; |
155 |
< |
|
156 |
< |
procedure TFB25Transaction.CommitRetaining; |
133 |
> |
procedure TFB25Transaction.InternalStartSingle(attachment: IAttachment); |
134 |
> |
var db_handle: TISC_DB_HANDLE; |
135 |
|
begin |
158 |
– |
if FHandle = nil then |
159 |
– |
Exit; |
136 |
|
with FFirebird25ClientAPI do |
161 |
– |
Call(isc_commit_retaining(StatusVector, @FHandle)); |
162 |
– |
end; |
163 |
– |
|
164 |
– |
procedure TFB25Transaction.Start(DefaultCompletion: TTransactionCompletion); |
165 |
– |
var pteb: PISC_TEB_ARRAY; |
166 |
– |
i: integer; |
167 |
– |
db_handle: TISC_DB_HANDLE; |
168 |
– |
begin |
169 |
– |
if FHandle <> nil then |
170 |
– |
Exit; |
171 |
– |
pteb := nil; |
172 |
– |
FDefaultCompletion := DefaultCompletion; |
173 |
– |
with FFirebird25ClientAPI do |
174 |
– |
if (Length(FAttachments) = 1) then |
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 |
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))); |
172 |
|
FreeMem(pteb); |
173 |
|
end; |
174 |
|
end; |
205 |
– |
Inc(FSeqNo); |
175 |
|
end; |
176 |
|
|
177 |
< |
procedure TFB25Transaction.Rollback(Force: boolean); |
177 |
> |
function TFB25Transaction.InternalCommit(Force: boolean): TTrCompletionState; |
178 |
|
begin |
179 |
< |
if FHandle = nil then |
211 |
< |
Exit; |
179 |
> |
Result := trCommitted; |
180 |
|
with FFirebird25ClientAPI do |
181 |
< |
Call(isc_rollback_transaction(StatusVector, @FHandle),not Force); |
181 |
> |
if Call(isc_commit_transaction(StatusVector, @FHandle),not Force) > 0 then |
182 |
> |
Result := trCommitFailed; |
183 |
|
FHandle := nil; |
184 |
|
end; |
185 |
|
|
186 |
< |
procedure TFB25Transaction.RollbackRetaining; |
186 |
> |
function TFB25Transaction.InternalRollback(Force: boolean): TTrCompletionState; |
187 |
> |
begin |
188 |
> |
Result := trRolledback; |
189 |
> |
with FFirebird25ClientAPI do |
190 |
> |
if Call(isc_rollback_transaction(StatusVector, @FHandle),not Force) > 0 then |
191 |
> |
Result := trRollbackFailed; |
192 |
> |
FHandle := nil; |
193 |
> |
end; |
194 |
> |
|
195 |
> |
procedure TFB25Transaction.InternalCommitRetaining; |
196 |
> |
begin |
197 |
> |
with FFirebird25ClientAPI do |
198 |
> |
Call(isc_commit_retaining(StatusVector, @FHandle)); |
199 |
> |
end; |
200 |
> |
|
201 |
> |
procedure TFB25Transaction.InternalRollbackRetaining; |
202 |
|
begin |
203 |
+ |
with FFirebird25ClientAPI do |
204 |
+ |
Call(isc_rollback_retaining(StatusVector, @FHandle)); |
205 |
+ |
end; |
206 |
+ |
|
207 |
+ |
function TFB25Transaction.GetInTransaction: boolean; |
208 |
+ |
begin |
209 |
+ |
Result := FHandle <> nil; |
210 |
+ |
end; |
211 |
+ |
|
212 |
+ |
procedure TFB25Transaction.PrepareForCommit; |
213 |
+ |
begin |
214 |
+ |
if Length(FAttachments) < 2 then |
215 |
+ |
IBError(ibxeNotAMultiDatabaseTransaction,[nil]); |
216 |
|
if FHandle = nil then |
217 |
|
Exit; |
218 |
|
with FFirebird25ClientAPI do |
219 |
< |
Call(isc_rollback_retaining(StatusVector, @FHandle)); |
219 |
> |
Call(isc_prepare_transaction(StatusVector, @FHandle)); |
220 |
|
end; |
221 |
|
|
222 |
|
end. |