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

Reply via email to