> 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);