فهرست منبع

Merged revisions 9085-9086,9088-9093 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r9085 | joost | 2007-11-03 00:23:12 +0100 (Sat, 03 Nov 2007) | 2 lines

* Fixed TField.Size handling
* Fixed crash on string-parameters
........
r9091 | joost | 2007-11-03 00:53:38 +0100 (Sat, 03 Nov 2007) | 2 lines

* Fixed parameters if a query is executed for the second time
* Truncate stringfields at dsMaxStringSize
........
r9092 | joost | 2007-11-03 01:14:39 +0100 (Sat, 03 Nov 2007) | 1 line

* Added recognition of FLOAT, CHAR and DECIMAL fields/records
........
r9093 | joost | 2007-11-03 01:15:37 +0100 (Sat, 03 Nov 2007) | 1 line

* Enabled currency-fields test for sqlite3
........

git-svn-id: branches/fixes_2_2@9753 -

joost 17 سال پیش
والد
کامیت
cc978724e4

+ 42 - 32
packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp

@@ -115,7 +115,7 @@ type
 
 procedure freebindstring(astring: pointer); cdecl;
 begin
-  FreeMem(AString);
+  StrDispose(AString);
 end;
 
 procedure TSQLite3Cursor.checkerror(const aerror: integer);
@@ -304,29 +304,31 @@ Type
   TFieldMap = Record
     N : String;
     T : TFieldType;
-    S : Integer;
-  end;  
+  end;
   
 Const
-  FieldMapCount = 15;
+  FieldMapCount = 18;
   FieldMap : Array [1..FieldMapCount] of TFieldMap = (
-   (n:'INT'; t: ftInteger; S: SizeOf(Integer)),
-   (n:'LARGEINT'; t:ftlargeInt; S: SizeOf(Int64)),
-   (n:'WORD'; t: ftWord; S: SizeOf(Word)),
-   (n:'SMALLINT'; t: ftSmallint; S: SizeOf(SmallInt)),
-   (n:'BOOLEAN'; t: ftBoolean; S: SizeOf(WordBool)),
-   (n:'REAL'; t: ftFloat; S: SizeOf(Double)),
-   (n:'DOUBLE'; t: ftFloat; S: SizeOf(Double)),
-   (n:'DATETIME'; t: ftDateTime; S: SizeOf(TDateTime)), // MUST be before date
-   (n:'DATE'; t: ftDate; S: SizeOf(TDateTime)),
-   (n:'TIME'; t: ftTime; S: SizeOf(TDateTime)),
-   (n:'CURRENCY'; t: ftCurrency; S: SizeOf(double)),
-   (n:'VARCHAR'; t: ftString; S: 255),
-   (n:'NUMERIC'; t: ftBCD; S: SizeOf(Currency)),
-   (n:'TEXT'; t: ftmemo; S: 0),
-   (n:'BLOB'; t: ftBlob; S: 0)
+   (n:'INT'; t: ftInteger),
+   (n:'LARGEINT'; t:ftlargeInt),
+   (n:'WORD'; t: ftWord),
+   (n:'SMALLINT'; t: ftSmallint),
+   (n:'BOOLEAN'; t: ftBoolean),
+   (n:'REAL'; t: ftFloat),
+   (n:'FLOAT'; t: ftFloat),
+   (n:'DOUBLE'; t: ftFloat),
+   (n:'DATETIME'; t: ftDateTime), // MUST be before date
+   (n:'DATE'; t: ftDate),
+   (n:'TIME'; t: ftTime),
+   (n:'CURRENCY'; t: ftCurrency),
+   (n:'VARCHAR'; t: ftString),
+   (n:'CHAR'; t: ftString),
+   (n:'NUMERIC'; t: ftBCD),
+   (n:'DECIMAL'; t: ftBCD),
+   (n:'TEXT'; t: ftmemo),
+   (n:'BLOB'; t: ftBlob)
 { Template:   
-  (n:''; t: ft; S: SizeOf())
+  (n:''; t: ft)
 }
   );
 
@@ -349,18 +351,14 @@ begin
     FD:=uppercase(sqlite3_column_decltype(st,i));
     ft1:= ftUnknown;
     size1:= 0;
-    fi:=1;
-    While (ft1=ftUnknown) and (fi<=FieldMapCount) do
+    for fi := 1 to FieldMapCount do if pos(FieldMap[fi].N,FD)=1 then
       begin
-      if pos(FieldMap[fi].N,FD)=1 then
-        begin
-        ft1:=FieldMap[fi].t;
-        size1:=FieldMap[fi].S;
-        end;
-      Inc(fi);
+      ft1:=FieldMap[fi].t;
+      break;
       end;
-    // handle some specials.  
-    case ft1 of  
+    // handle some specials.
+    size1:=0;
+    case ft1 of
       ftString: begin
                 fi:=pos('(',FD);
                 if (fi>0) then
@@ -368,7 +366,19 @@ begin
                   System.Delete(FD,1,fi);
                   fi:=pos(')',FD);
                   size1:=StrToIntDef(trim(copy(FD,1,fi-1)),255);
-                  end;
+                  if size1 > dsMaxStringSize then size1 := dsMaxStringSize;
+                  end
+                else size1 := 255;
+                end;
+      ftBCD:    begin
+                fi:=pos(',',FD);
+                if (fi>0) then
+                  begin
+                  System.Delete(FD,1,fi);
+                  fi:=pos(')',FD);
+                  size1:=StrToIntDef(trim(copy(FD,1,fi-1)),255);
+                  end
+                else size1 := 4;
                 end;
       ftUnknown : DatabaseError('Unknown record type: '+FN);
     end; // Case
@@ -382,7 +392,7 @@ var
             
 begin
   SC:=TSQLite3Cursor(cursor);
-  If (AParams<>Nil) then
+  If (AParams<>Nil) and (AParams.count > 0) then
     SC.BindParams(AParams);
   SC.Execute;    
 end;

+ 1 - 1
packages/fcl-db/tests/sqldbtoolsunit.pas

@@ -106,7 +106,7 @@ begin
   if SQLDbType = sqlite3 then
     begin
     Fconnection := TSQLite3Connection.Create(nil);
-    FieldtypeDefinitions[ftCurrency] := '';
+    FieldtypeDefinitions[ftCurrency] := 'CURRENCY';
     FieldtypeDefinitions[ftFixedChar] := '';
     end;
   if SQLDbType = POSTGRESQL then

+ 1 - 1
packages/fcl-db/tests/testsqlfieldtypes.pas

@@ -27,10 +27,10 @@ type
     procedure RunTest; override;
   published
     procedure TestInsertLargeStrFields; // bug 9600
+    procedure Test11Params;
     procedure TestRowsAffected; // bug 9758
     procedure TestStringsReplace;
     procedure TestCircularParams;
-    procedure Test11Params;
     procedure TestBug9744;
     procedure TestCrossStringDateParam;
     procedure TestGetFieldNames;