116 |
|
property TransactionSeqNo: integer read FSeqNo; |
117 |
|
end; |
118 |
|
|
119 |
+ |
{The transaction user interface is used to force an action on the end of the |
120 |
+ |
transaction.} |
121 |
+ |
|
122 |
+ |
ITransactionUser = interface |
123 |
+ |
['{156fcdc9-a326-44b3-a82d-f23c6fb9f97c}'] |
124 |
+ |
procedure TransactionEnding(aTransaction: ITransaction; Force: boolean); |
125 |
+ |
end; |
126 |
+ |
|
127 |
+ |
{ TTPBItem } |
128 |
+ |
|
129 |
+ |
TTPBItem = class(TParamBlockItem,ITPBItem) |
130 |
+ |
public |
131 |
+ |
function getParamTypeName: AnsiString; override; |
132 |
+ |
end; |
133 |
+ |
|
134 |
+ |
{ TTPB } |
135 |
+ |
|
136 |
+ |
TTPB = class (TCustomParamBlock<TTPBItem,ITPBItem>, ITPB) |
137 |
+ |
protected |
138 |
+ |
function LookupItemType(ParamTypeName: AnsiString): byte; override; |
139 |
+ |
public |
140 |
+ |
constructor Create(api: TFBClientAPI); |
141 |
+ |
function GetDPBParamTypeName(ParamType: byte): Ansistring; |
142 |
+ |
end; |
143 |
+ |
|
144 |
|
implementation |
145 |
|
|
146 |
< |
uses FBMessages, FBStatement; |
146 |
> |
uses FBMessages; |
147 |
> |
|
148 |
> |
const |
149 |
> |
isc_tpb_last_tpb_constant = isc_tpb_at_snapshot_number; |
150 |
> |
|
151 |
> |
TPBConstantNames: array[1..isc_tpb_last_tpb_constant] of string = ( |
152 |
> |
'consistency', |
153 |
> |
'concurrency', |
154 |
> |
'shared', |
155 |
> |
'protected', |
156 |
> |
'exclusive', |
157 |
> |
'wait', |
158 |
> |
'nowait', |
159 |
> |
'read', |
160 |
> |
'write', |
161 |
> |
'lock_read', |
162 |
> |
'lock_write', |
163 |
> |
'verb_time', |
164 |
> |
'commit_time', |
165 |
> |
'ignore_limbo', |
166 |
> |
'read_committed', |
167 |
> |
'autocommit', |
168 |
> |
'rec_version', |
169 |
> |
'no_rec_version', |
170 |
> |
'restart_requests', |
171 |
> |
'no_auto_undo', |
172 |
> |
'lock_timeout', |
173 |
> |
'read_consistency', |
174 |
> |
'at_snapshot_number' |
175 |
> |
); |
176 |
|
|
177 |
|
{ TFBTransaction } |
178 |
|
|
247 |
|
|
248 |
|
procedure TFBTransaction.DoDefaultTransactionEnd(Force: boolean); |
249 |
|
var i: integer; |
250 |
< |
intf: TInterfacedObject; |
250 |
> |
intf: IUnknown; |
251 |
> |
user: ITransactionUser; |
252 |
|
begin |
253 |
|
if InTransaction then |
254 |
|
begin |
255 |
|
for i := 0 to InterfaceCount - 1 do |
256 |
|
begin |
257 |
|
intf := GetInterface(i); |
258 |
< |
if (intf <> nil) and (intf is TFBStatement) then |
259 |
< |
TFBStatement(intf).TransactionEnding(self,Force); |
258 |
> |
if (intf <> nil) and (intf.QueryInterface(ITransactionUser,user) = S_OK) then |
259 |
> |
user.TransactionEnding(self,Force); |
260 |
|
end; |
261 |
|
case FDefaultCompletion of |
262 |
|
taRollback: |
292 |
|
Start(DefaultCompletion); |
293 |
|
end; |
294 |
|
|
295 |
+ |
{ TTPBItem } |
296 |
+ |
|
297 |
+ |
function TTPBItem.getParamTypeName: AnsiString; |
298 |
+ |
begin |
299 |
+ |
Result := TPBPrefix + TPBConstantNames[getParamType]; |
300 |
+ |
end; |
301 |
+ |
|
302 |
+ |
|
303 |
+ |
{TTPB} |
304 |
+ |
|
305 |
+ |
constructor TTPB.Create(api: TFBClientAPI); |
306 |
+ |
begin |
307 |
+ |
inherited Create(api); |
308 |
+ |
FDataLength := 1; |
309 |
+ |
FBuffer^ := isc_tpb_version3; |
310 |
+ |
end; |
311 |
+ |
|
312 |
+ |
function TTPB.GetDPBParamTypeName(ParamType: byte): Ansistring; |
313 |
+ |
begin |
314 |
+ |
if ParamType <= isc_tpb_last_tpb_constant then |
315 |
+ |
Result := TPBConstantNames[ParamType] |
316 |
+ |
else |
317 |
+ |
Result := ''; |
318 |
+ |
end; |
319 |
+ |
|
320 |
+ |
function TTPB.LookupItemType(ParamTypeName: AnsiString): byte; |
321 |
+ |
var i: byte; |
322 |
+ |
begin |
323 |
+ |
Result := 0; |
324 |
+ |
ParamTypeName := LowerCase(ParamTypeName); |
325 |
+ |
if (Pos(TPBPrefix, ParamTypeName) = 1) then |
326 |
+ |
Delete(ParamTypeName, 1, Length(TPBPrefix)); |
327 |
+ |
|
328 |
+ |
for i := 1 to isc_tpb_last_tpb_constant do |
329 |
+ |
if (ParamTypeName = TPBConstantNames[i]) then |
330 |
+ |
begin |
331 |
+ |
Result := i; |
332 |
+ |
break; |
333 |
+ |
end; |
334 |
+ |
end; |
335 |
+ |
|
336 |
|
end. |
337 |
|
|