Răsfoiți Sursa

* Refactor InternalInitFieldDefs to allow retrieve the FieldDefs without opening the dataset (Fix InitFieldDefs)

git-svn-id: trunk@12750 -
blikblum 16 ani în urmă
părinte
comite
d69d875d2a

+ 21 - 14
packages/fcl-db/src/sqlite/customsqliteds.pas

@@ -149,6 +149,7 @@ type
     function GetMasterSource: TDataSource;
     procedure SetFileName(const Value: String);
     function GetRowsAffected: Integer; virtual; abstract;
+    procedure RetrieveFieldDefs; virtual; abstract;
     //TDataSet overrides
     function AllocRecordBuffer: PChar; override;
     function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
@@ -169,6 +170,7 @@ type
     procedure InternalEdit; override;
     procedure InternalFirst; override;
     procedure InternalGotoBookmark(ABookmark: Pointer); override;
+    procedure InternalInitFieldDefs; override;
     procedure InternalInitRecord(Buffer: PChar); override;
     procedure InternalLast; override;
     procedure InternalOpen; override;
@@ -817,6 +819,25 @@ begin
   FCurrentItem := PDataRecord(ABookmark^);
 end;
 
+procedure TCustomSqliteDataset.InternalInitFieldDefs;
+begin
+  //todo: retrieve only necessary fields
+  if FMasterLink.DataSource <> nil then
+    FSQL := 'Select * from ' + FTableName + ';'; //forced to obtain all fields
+
+  if FSQL = '' then
+  begin
+    if FTablename = '' then
+      DatabaseError('Tablename not set', Self);
+    FSQL := 'Select * from ' + FTableName + ';';
+  end;
+
+  if FSqliteHandle = nil then
+    GetSqliteHandle;
+
+  RetrieveFieldDefs;
+end;
+
 procedure TCustomSqliteDataset.InternalInitRecord(Buffer: PChar);
 var
   TempStr: String;
@@ -840,20 +861,6 @@ procedure TCustomSqliteDataset.InternalOpen;
 var
   i: Integer;
 begin
-  //todo: retrieve only necessary fields
-  if FMasterLink.DataSource <> nil then
-    FSQL := 'Select * from ' + FTableName + ';'; //forced to obtain all fields
-
-  if FSQL = '' then
-  begin
-    if FTablename = '' then
-      DatabaseError('Tablename not set',Self);
-    FSQL := 'Select * from '+FTableName+';';
-  end;
-
-  if FSqliteHandle = nil then
-    GetSqliteHandle;
-    
   InternalInitFieldDefs;
   //todo: move this to InitFieldDefs
   FSelectSqlStr := 'SELECT ';

+ 2 - 2
packages/fcl-db/src/sqlite/sqlite3ds.pas

@@ -51,8 +51,8 @@ type
     procedure InternalCloseHandle; override;
     procedure BuildLinkedList; override;
   protected
-    procedure InternalInitFieldDefs; override;
     function GetRowsAffected:Integer; override;
+    procedure RetrieveFieldDefs; override;
   public
     procedure ExecuteDirect(const ASQL: String); override;
     function ReturnString: String; override;
@@ -151,7 +151,7 @@ begin
   sqlite3_finalize(vm);
 end;
 
-procedure TSqlite3Dataset.InternalInitFieldDefs;
+procedure TSqlite3Dataset.RetrieveFieldDefs;
 const
   FieldSizeMap: array[Boolean] of Integer = (0, dsMaxStringSize);
 var

+ 2 - 2
packages/fcl-db/src/sqlite/sqliteds.pas

@@ -52,7 +52,7 @@ type
     procedure InternalCloseHandle; override;
     procedure BuildLinkedList; override;
   protected
-    procedure InternalInitFieldDefs; override;
+    procedure RetrieveFieldDefs; override;
     function GetRowsAffected:Integer; override;
   public
     procedure ExecuteDirect(const ASQL: String); override;
@@ -108,7 +108,7 @@ begin
   end;
 end;
 
-procedure TSqliteDataset.InternalInitFieldDefs;
+procedure TSqliteDataset.RetrieveFieldDefs;
 var
   ColumnCount, i:Integer;
   AType: TFieldType;