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)
# Line 87 | Line 87
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 94 | Line 100
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
# Line 129 | Line 130
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);
133 > procedure TFB25Transaction.InternalStartSingle(attachment: IAttachment);
134 > var db_handle: TISC_DB_HANDLE;
135   begin
149  if FHandle = nil then
150    Exit;
136    with FFirebird25ClientAPI do
152    Call(isc_commit_transaction(StatusVector, @FHandle),not Force);
153  FHandle := nil;
154 end;
155
156 procedure TFB25Transaction.CommitRetaining;
157 begin
158  if FHandle = nil then
159    Exit;
160  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
# Line 191 | Line 160
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 202 | Line 172
172          FreeMem(pteb);
173       end;
174    end;
205  Inc(FSeqNo);
175   end;
176  
177 < procedure TFB25Transaction.Rollback(Force: boolean);
177 > procedure TFB25Transaction.InternalCommit(Force: boolean);
178 > begin
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
210  if FHandle = nil then
211    Exit;
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 FFirebird25ClientAPI do
215 <    Call(isc_rollback_retaining(StatusVector, @FHandle));
215 >    Call(isc_prepare_transaction(StatusVector, @FHandle));
216   end;
217  
218   end.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines