📄 ibdatabase.pas
字号:
i: Integer;
begin
if FIBLoaded then
begin
if InTransaction then
case FDefaultAction of
TACommit, TACommitRetaining :
EndTransaction(TACommit, True);
TARollback, TARollbackRetaining :
EndTransaction(TARollback, True);
end;
for i := 0 to FSQLObjects.Count - 1 do
if FSQLObjects[i] <> nil then
SQLObjects[i].DoTransactionFree;
RemoveSQLObjects;
RemoveDatabases;
FreeMem(FTPB);
FTPB := nil;
FTRParams.Free;
FSQLObjects.Free;
FDatabases.Free;
end;
inherited Destroy;
end;
function TIBTransaction.Call(ErrCode: ISC_STATUS;
RaiseError: Boolean): ISC_STATUS;
var
i: Integer;
begin
result := ErrCode;
for i := 0 to FDatabases.Count - 1 do if FDatabases[i] <> nil then
Databases[i].FCanTimeout := False;
FCanTimeout := False;
if RaiseError and (result > 0) then
IBDataBaseError;
end;
procedure TIBTransaction.CheckDatabasesInList;
begin
if GetDatabaseCount = 0 then
IBError(ibxeNoDatabasesInTransaction, [nil]);
end;
procedure TIBTransaction.CheckInTransaction;
begin
if FStreamedActive and (not InTransaction) then
Loaded;
if (FHandle = nil) then
IBError(ibxeNotInTransaction, [nil]);
end;
procedure TIBTransaction.EnsureNotInTransaction;
begin
if csDesigning in ComponentState then
begin
if FHandle <> nil then
Rollback;
end;
end;
procedure TIBTransaction.CheckNotInTransaction;
begin
if (FHandle <> nil) then
IBError(ibxeInTransaction, [nil]);
end;
procedure TIBTransaction.CheckAutoStop;
var
i: Integer;
AllClosed : Boolean;
begin
if (FAutoStopAction = saNone) or (not InTransaction) then
exit;
AllClosed := true;
i := 0;
while AllClosed and (i < FSQLObjects.Count) do
begin
if FSQLObjects[i] <> nil then
begin
if (TIBBase(FSQLObjects[i]).owner is TIBCustomDataSet) then
AllClosed := not TIBCustomDataSet(TIBBase(FSQLObjects[i]).owner).Active
end;
Inc(i);
end;
if AllClosed then
case FAutoStopAction of
saRollback : EndTransaction(TARollBack, false);
saCommit : EndTransaction(TACommit, false);
saRollbackRetaining : EndTransaction(TARollbackRetaining, false);
saCommitRetaining : EndTransaction(TACommitRetaining, false);
end;
end;
function TIBTransaction.AddDatabase(db: TIBDatabase): Integer;
var
i: Integer;
NilFound: Boolean;
begin
i := FindDatabase(db);
if i <> -1 then
begin
result := i;
exit;
end;
NilFound := False;
i := 0;
while (not NilFound) and (i < FDatabases.Count) do
begin
NilFound := (FDatabases[i] = nil);
if (not NilFound) then
Inc(i);
end;
if (NilFound) then
begin
FDatabases[i] := db;
result := i;
end
else
begin
result := FDatabases.Count;
FDatabases.Add(db);
end;
end;
function TIBTransaction.AddSQLObject(ds: TIBBase): Integer;
begin
result := 0;
while (result < FSQLObjects.Count) and (FSQLObjects[result] <> nil) do
Inc(result);
if (result = FSQLObjects.Count) then
FSQLObjects.Add(ds)
else
FSQLObjects[result] := ds;
end;
procedure TIBTransaction.Commit;
begin
EndTransaction(TACommit, False);
end;
procedure TIBTransaction.CommitRetaining;
begin
EndTransaction(TACommitRetaining, False);
end;
procedure TIBTransaction.EndTransaction(Action: TTransactionAction;
Force: Boolean);
var
status: ISC_STATUS;
i: Integer;
begin
CheckInTransaction;
case Action of
TARollback, TACommit:
begin
if (HandleIsShared) and
(Action <> FDefaultAction) and
(not Force) then
IBError(ibxeCantEndSharedTransaction, [nil]);
for i := 0 to FSQLObjects.Count - 1 do
if FSQLObjects[i] <> nil then
SQLObjects[i].DoBeforeTransactionEnd;
if InTransaction then
begin
if HandleIsShared then
begin
FHandle := nil;
FHandleIsShared := False;
status := 0;
end
else
if (Action = TARollback) then
status := Call(isc_rollback_transaction(StatusVector, @FHandle), False)
else
status := Call(isc_commit_transaction(StatusVector, @FHandle), False);
if ((Force) and (status > 0)) then
status := Call(isc_rollback_transaction(StatusVector, @FHandle), False);
if Force then
FHandle := nil
else
if (status > 0) then
IBDataBaseError;
for i := 0 to FSQLObjects.Count - 1 do if FSQLObjects[i] <> nil then
SQLObjects[i].DoAfterTransactionEnd;
end;
end;
TACommitRetaining:
Call(isc_commit_retaining(StatusVector, @FHandle), True);
TARollbackRetaining:
Call(isc_rollback_retaining(StatusVector, @FHandle), True);
end;
if not (csDesigning in ComponentState) then
begin
case Action of
TACommit:
MonitorHook.TRCommit(Self);
TARollback:
MonitorHook.TRRollback(Self);
TACommitRetaining:
MonitorHook.TRCommitRetaining(Self);
TARollbackRetaining:
MonitorHook.TRRollbackRetaining(Self);
end;
end;
end;
function TIBTransaction.GetDatabase(Index: Integer): TIBDatabase;
begin
result := FDatabases[Index];
end;
function TIBTransaction.GetDatabaseCount: Integer;
var
i, Cnt: Integer;
begin
result := 0;
Cnt := FDatabases.Count - 1;
for i := 0 to Cnt do if FDatabases[i] <> nil then
Inc(result);
end;
function TIBTransaction.GetSQLObject(Index: Integer): TIBBase;
begin
result := FSQLObjects[Index];
end;
function TIBTransaction.GetSQLObjectCount: Integer;
var
i, Cnt: Integer;
begin
result := 0;
Cnt := FSQLObjects.Count - 1;
for i := 0 to Cnt do if FSQLObjects[i] <> nil then
Inc(result);
end;
function TIBTransaction.GetInTransaction: Boolean;
begin
result := (FHandle <> nil);
end;
function TIBTransaction.FindDatabase(db: TIBDatabase): Integer;
var
i: Integer;
begin
result := -1;
for i := 0 to FDatabases.Count - 1 do
if db = TIBDatabase(FDatabases[i]) then
begin
result := i;
break;
end;
end;
function TIBTransaction.FindDefaultDatabase: TIBDatabase;
var
i: Integer;
begin
result := FDefaultDatabase;
if result = nil then
begin
for i := 0 to FDatabases.Count - 1 do
if (TIBDatabase(FDatabases[i]) <> nil) and
(TIBDatabase(FDatabases[i]).DefaultTransaction = self) then
begin
result := TIBDatabase(FDatabases[i]);
break;
end;
end;
end;
function TIBTransaction.GetIdleTimer: Integer;
begin
result := FTimer.Interval;
end;
procedure TIBTransaction.Loaded;
begin
inherited Loaded;
end;
procedure TIBTransaction.BeforeDatabaseDisconnect(DB: TIBDatabase);
begin
if InTransaction then
case FDefaultAction of
TACommit, TACommitRetaining :
EndTransaction(TACommit, True);
TARollback, TARollbackRetaining :
EndTransaction(TARollback, True);
end;
end;
procedure TIBTransaction.RemoveDatabase(Idx: Integer);
var
DB: TIBDatabase;
begin
if ((Idx >= 0) and (FDatabases[Idx] <> nil)) then
begin
DB := Databases[Idx];
FDatabases[Idx] := nil;
DB.RemoveTransaction(DB.FindTransaction(Self));
if DB = FDefaultDatabase then
FDefaultDatabase := nil;
end;
end;
procedure TIBTransaction.RemoveDatabases;
var
i: Integer;
begin
for i := 0 to FDatabases.Count - 1 do if FDatabases[i] <> nil then
RemoveDatabase(i);
end;
procedure TIBTransaction.RemoveSQLObject(Idx: Integer);
var
ds: TIBBase;
begin
if ((Idx >= 0) and (FSQLObjects[Idx] <> nil)) then
begin
ds := SQLObjects[Idx];
FSQLObjects[Idx] := nil;
ds.Transaction := nil;
end;
end;
procedure TIBTransaction.RemoveSQLObjects;
var
i: Integer;
begin
for i := 0 to FSQLObjects.Count - 1 do if FSQLObjects[i] <> nil then
RemoveSQLObject(i);
end;
procedure TIBTransaction.Rollback;
begin
EndTransaction(TARollback, False);
end;
procedure TIBTransaction.RollbackRetaining;
begin
EndTransaction(TARollbackRetaining, False);
end;
procedure TIBTransaction.SetActive(Value: Boolean);
begin
if csReading in ComponentState then
FStreamedActive := Value
else
if Value and not InTransaction then
StartTransaction
else
if not Value and InTransaction then
Rollback;
end;
procedure TIBTransaction.SetDefaultAction(Value: TTransactionAction);
begin
if (Value = taRollbackRetaining) and (GetIBClientVersion < 6) then
IBError(ibxeIB60feature, [nil]);
FDefaultAction := Value;
end;
procedure TIBTransaction.SetDefaultDatabase(Value: TIBDatabase);
var
i: integer;
begin
if (FDefaultDatabase <> nil) and (FDefaultDatabase <> Value) then
begin
i := FDefaultDatabase.FindTransaction(self);
if (i <> -1) then
FDefaultDatabase.RemoveTransaction(i);
end;
if (Value <> nil) and (FDefaultDatabase <> Value) then
begin
Value.AddTransaction(Self);
AddDatabase(Value);
for i := 0 to FSQLObjects.Count - 1 do
if (FSQLObjects[i] <> nil) and
(TIBBase(FSQLObjects[i]).Database = nil) then
SetOrdProp(TIBBase(FSQLObjects[i]).Owner, 'Database', Integer(Value));
end;
FDefaultDatabase := Value;
end;
procedure TIBTransaction.SetHandle(Value: TISC_TR_HANDLE);
begin
if (HandleIsShared) then
case FDefaultAction of
TACommit, TACommitRetaining :
EndTransaction(TACommit, True);
TARollback, TARollbackRetaining :
EndTransaction(TARollback, True);
end
else
CheckNotInTransaction;
FHandle := Value;
FHandleIsShared := (Value <> nil);
end;
procedure TIBTransaction.Notification( AComponent: TComponent;
Operation: TOperation);
var
i: Integer;
begin
inherited Notification( AComponent, Operation);
if (Operation = opRemove) and (AComponent = FDefaultDatabase) then
begin
i := FindDatabase(FDefaultDatabase);
if (i <> -1) then
RemoveDatabase(i);
FDefaultDatabase := nil;
end;
end;
procedure TIBTransaction.SetIdleTimer(Value: Integer);
begin
if Value < 0 then
IBError(ibxeTimeoutNegative, [nil])
else
if (Value = 0) then
begin
FTimer.Enabled := False;
FTimer.Interval := 0;
end
else
if (Value > 0) then
begin
FTimer.Interval := Value;
if not (csDesigning in ComponentState) then
FTimer.Enabled := True;
end;
end;
procedure TIBTransaction.SetTRParams(Value: TStrings);
begin
FTRParams.Assign(Value);
end;
procedure TIBTransaction.StartTransaction;
var
pteb: PISC_TEB_ARRAY;
TPB: String;
i: Integer;
begin
CheckNotInTransaction;
CheckDatabasesInList;
for i := 0 to FDatabases.Count - 1 do
if FDatabases[i] <> nil then
begin
with TIBDatabase(FDatabases[i]) do
if not Connected then
if StreamedConnected then
begin
Open;
StreamedConnected := False;
end
else
IBError(ibxeDatabaseClosed, [nil]);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -