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 |
|
|
100 |
|
{ITransaction} |
101 |
|
function GetInTransaction: boolean; override; |
102 |
|
procedure PrepareForCommit; override; |
94 |
– |
procedure Commit(Force: boolean=false); override; |
95 |
– |
procedure CommitRetaining; override; |
96 |
– |
procedure Start(DefaultCompletion: TTransactionCompletion=taCommit); overload; override; |
97 |
– |
procedure Rollback(Force: boolean=false); override; |
98 |
– |
procedure RollbackRetaining; override; |
103 |
|
end; |
104 |
|
|
105 |
|
implementation |
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 |
122 |
< |
Exit; |
123 |
< |
with Firebird25ClientAPI do |
124 |
< |
Call(isc_prepare_transaction(StatusVector, @FHandle)); |
125 |
< |
end; |
126 |
< |
|
127 |
< |
procedure TFB25Transaction.Commit(Force: boolean); |
128 |
< |
begin |
129 |
< |
if FHandle = nil then |
130 |
< |
Exit; |
131 |
< |
with Firebird25ClientAPI do |
132 |
< |
Call(isc_commit_transaction(StatusVector, @FHandle),not Force); |
133 |
< |
FHandle := nil; |
128 |
> |
inherited SetInterface(api); |
129 |
> |
FFirebird25ClientAPI := api as TFB25ClientAPI; |
130 |
> |
OnDatabaseError := FFirebird25ClientAPI.IBDataBaseError; |
131 |
|
end; |
132 |
|
|
133 |
< |
procedure TFB25Transaction.CommitRetaining; |
133 |
> |
procedure TFB25Transaction.InternalStartSingle(attachment: IAttachment); |
134 |
> |
var db_handle: TISC_DB_HANDLE; |
135 |
|
begin |
136 |
< |
if FHandle = nil then |
139 |
< |
Exit; |
140 |
< |
with Firebird25ClientAPI do |
141 |
< |
Call(isc_commit_retaining(StatusVector, @FHandle)); |
142 |
< |
end; |
143 |
< |
|
144 |
< |
procedure TFB25Transaction.Start(DefaultCompletion: TTransactionCompletion); |
145 |
< |
var pteb: PISC_TEB_ARRAY; |
146 |
< |
i: integer; |
147 |
< |
db_handle: TISC_DB_HANDLE; |
148 |
< |
begin |
149 |
< |
if FHandle <> nil then |
150 |
< |
Exit; |
151 |
< |
pteb := nil; |
152 |
< |
FDefaultCompletion := DefaultCompletion; |
153 |
< |
with Firebird25ClientAPI do |
154 |
< |
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 |
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; |
185 |
– |
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. |