> i have some fixes for the database implementation in FCL. Ok, since my development-machine had no internet-connection i've made the patch files myself, but the database.diff wasn't correct. Here are the right ones.
-- Joost van der Sluis <[EMAIL PROTECTED]> CNOC
Index: database.inc =================================================================== RCS file: /FPC/CVS/fpc/fcl/db/database.inc,v retrieving revision 1.4 diff -u -r1.4 database.inc --- database.inc 16 Aug 2003 16:42:21 -0000 1.4 +++ database.inc 24 Jul 2004 16:11:14 -0000 @@ -36,7 +36,8 @@ procedure TDataBase.Loaded; begin - //!! To be implemented. + inherited; + if FOpenAfterRead then SetConnected(true); end; procedure TDataBase.SetConnected (Value : boolean); @@ -45,11 +46,21 @@ If Value<>FConnected then begin If Value then - DoInternalConnect + begin + if csLoading in ComponentState then + begin + FOpenAfterRead := true; + exit; + end + else + DoInternalConnect; + end else begin Closedatasets; DoInternalDisConnect; + if csloading in ComponentState then + FOpenAfterRead := false; end; FConnected:=Value; end;
Index: db.pp =================================================================== RCS file: /FPC/CVS/fpc/fcl/db/db.pp,v retrieving revision 1.18 diff -u -r1.18 db.pp --- db.pp 19 Jul 2004 20:27:28 -0000 1.18 +++ db.pp 24 Jul 2004 16:15:13 -0000 @@ -1207,6 +1207,7 @@ FOnLogin : TLoginEvent; FParams : TStrings; FSQLBased : Boolean; + FOpenAfterRead : boolean; Function GetDataSetCount : Longint; Function GetDataset(Index : longint) : TDBDataset; procedure SetConnected (Value : boolean);
Index: dataset.inc =================================================================== RCS file: /FPC/CVS/fpc/fcl/db/dataset.inc,v retrieving revision 1.14 diff -u -r1.14 dataset.inc --- dataset.inc 16 Jul 2004 19:37:40 -0000 1.14 +++ dataset.inc 24 Jul 2004 16:14:23 -0000 @@ -323,9 +323,8 @@ InternalOpen; FBOF:=True; {$ifdef dsdebug} - Writeln ('Setting state to browse'); + Writeln ('Setting buffer size'); {$endif} - SetState(dsBrowse); {$ifdef dsdebug} Writeln ('Setting buffer size'); {$endif} @@ -338,6 +337,10 @@ *) RecalcBufListSize; //SetBufferCount(DefaultBufferCount); +{$ifdef dsdebug} + Writeln ('Setting state to browse'); +{$endif} + SetState(dsBrowse); DoAfterOpen; DoAfterScroll; except
Index: interbase.pp =================================================================== RCS file: /FPC/CVS/fpc/fcl/db/interbase/interbase.pp,v retrieving revision 1.12 diff -u -r1.12 interbase.pp --- interbase.pp 1 May 2004 23:56:59 -0000 1.12 +++ interbase.pp 24 Jul 2004 16:14:52 -0000 @@ -204,7 +204,6 @@ FRecordSize : word; FCurrentRecord : integer; FSQL : TStrings; - FPrepared : boolean; FIsEOF : boolean; FStatementType : TStatementType; FLoadingFieldDefs : boolean; @@ -416,7 +415,7 @@ DPB := DPB + Chr(isc_dpb_lc_ctype) + Chr(Length(CharSet)) + CharSet; if (DatabaseName = '') then - raise EInterBaseError.Create('TIBDatabase.Open: Database connect string not filled in!'); + raise EInterBaseError.Create('TIBDatabase.Open: Database connect string (DatabaseName) not filled in!'); FIBDatabaseHandle := nil; if isc_attach_database(@FStatus, Length(DatabaseName), @DatabaseName[1], @FIBDatabaseHandle, Length(DPB), @DPB[1]) <> 0 then @@ -635,6 +634,11 @@ x : integer; tr : pointer; begin + if FTransaction = nil then + raise EDatabaseError.Create('TIBQuery.Execute: Transaction not set'); + if not FTransaction.Active then + FTransaction.StartTransaction; + tr := FTransaction.GetHandle; for x := 0 to FSQL.Count - 1 do @@ -861,6 +865,10 @@ var tr : pointer; begin + if FTransaction = nil then + raise EDatabaseError.Create('TIBQuery.Execute: Transaction not set'); + if not FTransaction.Active then + FTransaction.StartTransaction; tr := FTransaction.GetHandle; if isc_dsql_execute(@FStatus, @tr, @FStatement, 1, nil) <> 0 then CheckError('TIBQuery.Execute', FStatus);