{ This file is part of the Free Pascal run time library. Copyright (c) 1999-2000 by Michael Van Canneyt, member of the Free Pascal development team TDatabase and related objects implementation See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} { --------------------------------------------------------------------- TDatabase ---------------------------------------------------------------------} Procedure TDatabase.CheckConnected; begin If Not Connected Then DatabaseError(SNotConnected,Self); end; Procedure TDatabase.CheckDisConnected; begin If Connected Then DatabaseError(SConnected,Self); end; Procedure TDatabase.InternalHandleException; begin if assigned(classes.ApplicationHandleException) then classes.ApplicationHandleException(self) else ShowException(ExceptObject,ExceptAddr); end; procedure TDataBase.Loaded; begin inherited; try if FOpenAfterRead then SetConnected(true); except if csDesigning in Componentstate then InternalHandleException else raise; end; end; procedure TDataBase.SetConnected (Value : boolean); begin If Value<>FConnected then begin If Value then begin if csReading in ComponentState then begin FOpenAfterRead := true; exit; end else // try DoInternalConnect; // except // on e: EDatabaseError do DoInternalDisconnect; // raise; // end; {try} end else begin Closedatasets; Closetransactions; DoInternalDisConnect; if csloading in ComponentState then FOpenAfterRead := false; end; FConnected:=Value; end; end; constructor TDatabase.Create(AOwner: TComponent); begin Inherited Create(AOwner); FParams:=TStringlist.Create; FDatasets:=TList.Create; FTransactions:=TList.Create; end; destructor TDatabase.Destroy; begin Connected:=False; RemoveDatasets; RemoveTransactions; FDatasets.Free; FTransactions.Free; FParams.Free; Inherited Destroy; end; procedure TDatabase.Close; begin Connected:=False; end; procedure TDatabase.CloseDataSets; Var I : longint; begin If Assigned(FDatasets) then begin For I:=FDatasets.Count-1 downto 0 do TDBDataset(FDatasets[i]).Close; end; end; procedure TDatabase.CloseTransactions; Var I : longint; begin If Assigned(FTransactions) then begin For I:=FTransactions.Count-1 downto 0 do TDBTransaction(FTransactions[i]).EndTransaction; end; end; procedure TDatabase.RemoveDataSets; Var I : longint; begin If Assigned(FDatasets) then For I:=FDataSets.Count-1 downto 0 do TDBDataset(FDataSets[i]).Database:=Nil; end; procedure TDatabase.RemoveTransactions; Var I : longint; begin If Assigned(FTransactions) then For I:=FTransactions.Count-1 downto 0 do TDBTransaction(FTransactions[i]).Database:=Nil; end; procedure TDatabase.Open; begin Connected:=True; end; Function TDatabase.GetDataSetCount : Longint; begin If Assigned(FDatasets) Then Result:=FDatasets.Count else Result:=0; end; Function TDatabase.GetTransactionCount : Longint; begin If Assigned(FTransactions) Then Result:=FTransactions.Count else Result:=0; end; Function TDatabase.GetDataset(Index : longint) : TDBDataset; begin If Assigned(FDatasets) then Result:=TDBDataset(FDatasets[Index]) else DatabaseError(SNoDatasets); end; Function TDatabase.GetTransaction(Index : longint) : TDBtransaction; begin If Assigned(FTransactions) then Result:=TDBTransaction(FTransactions[Index]) else DatabaseError(SNoTransactions); end; procedure TDatabase.RegisterDataset (DS : TDBDataset); Var I : longint; begin I:=FDatasets.IndexOf(DS); If I=-1 then FDatasets.Add(DS) else DatabaseErrorFmt(SDatasetRegistered,[DS.Name]); end; procedure TDatabase.RegisterTransaction (TA : TDBTransaction); Var I : longint; begin I:=FTransactions.IndexOf(TA); If I=-1 then FTransactions.Add(TA) else DatabaseErrorFmt(STransactionRegistered,[TA.Name]); end; procedure TDatabase.UnRegisterDataset (DS : TDBDataset); Var I : longint; begin I:=FDatasets.IndexOf(DS); If I<>-1 then FDatasets.Delete(I) else DatabaseErrorFmt(SNoDatasetRegistered,[DS.Name]); end; procedure TDatabase.UnRegisterTransaction (TA : TDBTransaction); Var I : longint; begin I:=FTransactions.IndexOf(TA); If I<>-1 then FTransactions.Delete(I) else DatabaseErrorFmt(SNoTransactionRegistered,[TA.Name]); end; { --------------------------------------------------------------------- TDBdataset ---------------------------------------------------------------------} Procedure TDBDataset.SetDatabase (Value : TDatabase); begin If Value<>FDatabase then begin CheckInactive; If Assigned(FDatabase) then FDatabase.UnregisterDataset(Self); If Value<>Nil Then Value.RegisterDataset(Self); FDatabase:=Value; end; end; Procedure TDBDataset.SetTransaction (Value : TDBTransaction); begin CheckInactive; If Value<>FTransaction then begin If Assigned(FTransaction) then FTransaction.UnregisterDataset(Self); If Value<>Nil Then Value.RegisterDataset(Self); FTransaction:=Value; end; end; Procedure TDBDataset.CheckDatabase; begin If (FDatabase=Nil) then DatabaseError(SErrNoDatabaseAvailable,Self) end; Destructor TDBDataset.Destroy; begin Database:=Nil; Transaction:=Nil; Inherited; end; { --------------------------------------------------------------------- TDBTransaction ---------------------------------------------------------------------} procedure TDBTransaction.SetActive(Value : boolean); begin if FActive and (not Value) then EndTransaction else if (not FActive) and Value then if csLoading in ComponentState then begin FOpenAfterRead := true; exit; end else StartTransaction; end; procedure TDBTransaction.Loaded; begin inherited; try if FOpenAfterRead then SetActive(true); except if csDesigning in Componentstate then InternalHandleException else raise; end; end; Procedure TDBTransaction.InternalHandleException; begin if assigned(classes.ApplicationHandleException) then classes.ApplicationHandleException(self) else ShowException(ExceptObject,ExceptAddr); end; Procedure TDBTransaction.CheckActive; begin If not FActive Then DatabaseError(STransNotActive,Self); end; Procedure TDBTransaction.CheckInActive; begin If FActive Then DatabaseError(STransActive,Self); end; Procedure TDBTransaction.CloseTrans; begin FActive := false; end; Procedure TDBTransaction.OpenTrans; begin FActive := true; end; Procedure TDBTransaction.SetDatabase (Value : TDatabase); begin If Value<>FDatabase then begin CheckInactive; If Assigned(FDatabase) then FDatabase.UnregisterTransaction(Self); If Value<>Nil Then Value.RegisterTransaction(Self); FDatabase:=Value; end; end; constructor TDBTransaction.create(AOwner : TComponent); begin inherited create(AOwner); FDatasets:=TList.Create; end; Procedure TDBTransaction.CheckDatabase; begin If (FDatabase=Nil) then DatabaseError(SErrNoDatabaseAvailable,Self) end; procedure TDBTransaction.CloseDataSets; Var I : longint; begin If Assigned(FDatasets) then begin For I:=FDatasets.Count-1 downto 0 do TDBDataset(FDatasets[i]).Close; end; end; Destructor TDBTransaction.Destroy; begin Database:=Nil; RemoveDatasets; FDatasets.Free; Inherited; end; procedure TDBTransaction.RemoveDataSets; Var I : longint; begin If Assigned(FDatasets) then For I:=FDataSets.Count-1 downto 0 do TDBDataset(FDataSets[i]).Transaction:=Nil; end; Function TDBTransaction.GetDataSetCount : Longint; begin If Assigned(FDatasets) Then Result:=FDatasets.Count else Result:=0; end; procedure TDBTransaction.UnRegisterDataset (DS : TDBDataset); Var I : longint; begin I:=FDatasets.IndexOf(DS); If I<>-1 then FDatasets.Delete(I) else DatabaseErrorFmt(SNoDatasetRegistered,[DS.Name]); end; procedure TDBTransaction.RegisterDataset (DS : TDBDataset); Var I : longint; begin I:=FDatasets.IndexOf(DS); If I=-1 then FDatasets.Add(DS) else DatabaseErrorFmt(SDatasetRegistered,[DS.Name]); end; Function TDBTransaction.GetDataset(Index : longint) : TDBDataset; begin If Assigned(FDatasets) then Result:=TDBDataset(FDatasets[Index]) else DatabaseError(SNoDatasets); end; { --------------------------------------------------------------------- TCustomConnection ---------------------------------------------------------------------} procedure TCustomConnection.SetAfterConnect(const AValue: TNotifyEvent); begin if FAfterConnect=AValue then exit; FAfterConnect:=AValue; end; procedure TCustomConnection.SetAfterDisconnect(const AValue: TNotifyEvent); begin if FAfterDisconnect=AValue then exit; FAfterDisconnect:=AValue; end; procedure TCustomConnection.SetBeforeConnect(const AValue: TNotifyEvent); begin if FBeforeConnect=AValue then exit; FBeforeConnect:=AValue; end; procedure TCustomConnection.SetBeforeDisconnect(const AValue: TNotifyEvent); begin if FBeforeDisconnect=AValue then exit; FBeforeDisconnect:=AValue; end; procedure TCustomConnection.DoInternalConnect; begin if Assigned(BeforeConnect) then BeforeConnect(self); DoConnect; if Assigned(AfterConnect) then AfterConnect(self); end; procedure TCustomConnection.DoInternalDisconnect; begin if Assigned(BeforeDisconnect) then BeforeDisconnect(self); DoDisconnect; if Assigned(AfterDisconnect) then AfterDisconnect(self); end; procedure TCustomConnection.DoConnect; begin // Do nothing yet end; procedure TCustomConnection.DoDisconnect; begin // Do nothing yet end; function TCustomConnection.GetConnected: boolean; begin Result := Connected; end; procedure TCustomConnection.StartTransaction; begin // Do nothing yet end; procedure TCustomConnection.EndTransaction; begin // Do nothing yet end;