Browse Source

--- Merging r20654 into '.':
U packages/fcl-db/src/sqldb/oracle/oracleconnection.pp
--- Merging r22783 into '.':
U packages/fcl-db/tests/database.ini.txt
--- Merging r22850 into '.':
C packages/fcl-db/tests/testdbbasics.pas
--- Merging r22916 into '.':
G packages/fcl-db/tests/database.ini.txt
--- Merging r22937 into '.':
U packages/fcl-db/tests/testfieldtypes.pas
--- Merging r22938 into '.':
U packages/fcl-db/tests/testbufdatasetstreams.pas
Summary of conflicts:
Text conflicts: 1

# revisions: 20654,22783,22850,22916,22937,22938
r20654 | marco | 2012-03-29 19:39:43 +0200 (Thu, 29 Mar 2012) | 3 lines
Changed paths:
M /trunk/packages/fcl-db/src/sqldb/oracle/oracleconnection.pp

* Patch from Ludo to preinitialize certain (var)parameters that are only
partially inited in some versions. (Endianess?) Mantis #21596
r22783 | reiniero | 2012-10-20 11:39:38 +0200 (Sat, 20 Oct 2012) | 1 line
Changed paths:
M /trunk/packages/fcl-db/tests/database.ini.txt

+ db test framework: add support for mysql 5.1 and 5.5 connectors
r22850 | lacak | 2012-10-26 10:43:48 +0200 (Fri, 26 Oct 2012) | 1 line
Changed paths:
M /trunk/packages/fcl-db/tests/testdbbasics.pas

fcl-db test: rename obsolete test plus comment why it is safe to remove him at all. See also bug #22124
r22916 | reiniero | 2012-11-02 09:29:42 +0100 (Fri, 02 Nov 2012) | 2 lines
Changed paths:
M /trunk/packages/fcl-db/tests/database.ini.txt

* FCL-DB: typo+clarification for MSSQL/Sybase db test framework databse.ini template
r22937 | lacak | 2012-11-06 09:09:32 +0100 (Tue, 06 Nov 2012) | 2 lines
Changed paths:
M /trunk/packages/fcl-db/tests/testfieldtypes.pas

fcl-db test: improve testing of ftAutoInc. After rev.22935
(some databases allows updating of identity columns so test it)
r22938 | lacak | 2012-11-06 09:32:41 +0100 (Tue, 06 Nov 2012) | 1 line
Changed paths:
M /trunk/packages/fcl-db/tests/testbufdatasetstreams.pas

fcl-db tests: unification of file names used (generated) during testing.

git-svn-id: branches/fixes_2_6@24927 -

marco 12 years ago
parent
commit
f5ea192a77

+ 8 - 2
packages/fcl-db/src/sqldb/oracle/oracleconnection.pp

@@ -720,11 +720,11 @@ var Param      : POCIParam;
 
 
     FieldType  : TFieldType;
     FieldType  : TFieldType;
     FieldName  : string;
     FieldName  : string;
-    FieldSize  : integer;
+    FieldSize  : cardinal;
 
 
     OFieldType   : ub2;
     OFieldType   : ub2;
     OFieldName   : Pchar;
     OFieldName   : Pchar;
-    OFieldSize   : sb4;
+    OFieldSize   : ub4;
     OFNameLength : ub4;
     OFNameLength : ub4;
     NumCols      : ub4;
     NumCols      : ub4;
     FOciDefine   : POCIDefine;
     FOciDefine   : POCIDefine;
@@ -743,6 +743,12 @@ begin
 
 
     for tel := 1 to numcols do
     for tel := 1 to numcols do
       begin
       begin
+      // Clear OFieldSize. Oracle 9i, 10g doc says *ub4 but some clients use *ub2 leaving
+      // high 16 bit untouched resulting in huge values and ORA-01062
+      // WARNING: this is not working in big endian systems !!!!
+      // To be tested if BE systems have this *ub2<->*ub4 problem
+      OFieldSize:=0;
+
       if OCIParamGet(FOciStmt,OCI_HTYPE_STMT,FOciError,Param,tel) = OCI_ERROR then
       if OCIParamGet(FOciStmt,OCI_HTYPE_STMT,FOciError,Param,tel) = OCI_ERROR then
         HandleError;
         HandleError;
 
 

+ 27 - 1
packages/fcl-db/tests/database.ini.txt

@@ -59,6 +59,24 @@ user=root
 password=
 password=
 hostname=127.0.0.1
 hostname=127.0.0.1
 
 
+; MySQL 5.1 database:
+[mysql51]
+connector=sql
+connectorparams=mysql51
+name=testdb
+user=root
+password=
+hostname=127.0.0.1
+
+; MySQL 5.5 database:
+[mysql55]
+connector=sql
+connectorparams=mysql55
+name=testdb
+user=root
+password=
+hostname=127.0.0.1
+
 ; Oracle database:
 ; Oracle database:
 [oracle]
 [oracle]
 connector=sql
 connector=sql
@@ -120,6 +138,11 @@ name=pubs
 ; user and password blank
 ; user and password blank
 user=sa
 user=sa
 password=
 password=
+; You can specify the port after a colon, e.g.
+; hostname=mssqlserver:1433
+; You can also specify the instance after a backslash, e.g.
+; hostname=127.0.0.1\SQLEXPRESS
+; See mssqlconn documentation
 hostname=127.0.0.1
 hostname=127.0.0.1
 
 
 ; Sybase ASE database
 ; Sybase ASE database
@@ -127,8 +150,11 @@ hostname=127.0.0.1
 connector=sql
 connector=sql
 connectorparams=sybase
 connectorparams=sybase
 name=testdb
 name=testdb
-usser=sa
+user=sa
 password=
 password=
+; You can specify the port after a colon, e.g.
+; hostname=bigbadserver:5000
+; See mssqlconn documentation
 hostname=127.0.0.1
 hostname=127.0.0.1
 
 
 ; TDBf: DBase/FoxPro database:
 ; TDBf: DBase/FoxPro database:

+ 15 - 12
packages/fcl-db/tests/testbufdatasetstreams.pas

@@ -84,6 +84,9 @@ implementation
 
 
 uses toolsunit, SQLDBToolsUnit, sqldb, XMLDatapacketReader;
 uses toolsunit, SQLDBToolsUnit, sqldb, XMLDatapacketReader;
 
 
+const TestXMLFileName = 'test.xml';
+      TestBINFileName = 'test.dat';
+
 procedure TTestBufDatasetStreams.CompareDatasets(ADataset1,
 procedure TTestBufDatasetStreams.CompareDatasets(ADataset1,
   ADataset2: TDataset);
   ADataset2: TDataset);
 begin
 begin
@@ -461,10 +464,10 @@ var SaveDs: TCustomBufDataset;
 begin
 begin
   SaveDs := DBConnector.GetFieldDataset as TCustomBufDataset;
   SaveDs := DBConnector.GetFieldDataset as TCustomBufDataset;
   SaveDs.Open;
   SaveDs.Open;
-  SaveDs.SaveToFile('FieldsDS.xml',dfXML);
+  SaveDs.SaveToFile(TestXMLFileName,dfXML);
 
 
   LoadDs := TCustomBufDataset.Create(nil);
   LoadDs := TCustomBufDataset.Create(nil);
-  LoadDs.LoadFromFile('FieldsDS.xml');
+  LoadDs.LoadFromFile(TestXMLFileName);
 
 
   LoadDS.First;
   LoadDS.First;
   SaveDS.First;
   SaveDS.First;
@@ -513,12 +516,12 @@ begin
     SaveDs.Post;
     SaveDs.Post;
 
 
     // Save this dataset to file.
     // Save this dataset to file.
-    SaveDs.SaveToFile('FieldsDS.xml',dfXML);
+    SaveDs.SaveToFile(TestXMLFileName,dfXML);
 
 
     // Load this file in another dataset
     // Load this file in another dataset
     LoadDs := TCustomBufDataset.Create(nil);
     LoadDs := TCustomBufDataset.Create(nil);
     try
     try
-      LoadDs.LoadFromFile('FieldsDS.xml');
+      LoadDs.LoadFromFile(TestXMLFileName);
       LoadDS.First;
       LoadDS.First;
 
 
       // Compare the content of the blob-field with the file on disc
       // Compare the content of the blob-field with the file on disc
@@ -564,10 +567,10 @@ begin
   f.dataset := ADataset;
   f.dataset := ADataset;
 
 
   ADataset.Open;
   ADataset.Open;
-  ADataset.SaveToFile('FieldsDS.xml',dfXML);
+  ADataset.SaveToFile(TestXMLFileName,dfXML);
   ADataset.Close;
   ADataset.Close;
 
 
-  ADataset.LoadFromFile('FieldsDS.xml',dfXML);
+  ADataset.LoadFromFile(TestXMLFileName,dfXML);
   AssertEquals(ADataset.FieldByName('ID').AsInteger,1);
   AssertEquals(ADataset.FieldByName('ID').AsInteger,1);
   AssertEquals(ADataset.FieldByName('NAME').AsString,'TestName1');
   AssertEquals(ADataset.FieldByName('NAME').AsString,'TestName1');
   ADataset.Close;
   ADataset.Close;
@@ -585,11 +588,11 @@ begin
   ds := DBConnector.GetNDataset(true,5);
   ds := DBConnector.GetNDataset(true,5);
 
 
   ds.open;
   ds.open;
-  TCustomBufDataset(ds).FileName:='test.dat';
+  TCustomBufDataset(ds).FileName:=TestBINFileName;
   ds.close;
   ds.close;
 
 
   LoadDs := DBConnector.GetNDataset(True,2);
   LoadDs := DBConnector.GetNDataset(True,2);
-  TCustomBufDataset(LoadDs).FileName:='test.dat';
+  TCustomBufDataset(LoadDs).FileName:=TestBINFileName;
   LoadDs.Open;
   LoadDs.Open;
 
 
   ds := DBConnector.GetNDataset(true,4);
   ds := DBConnector.GetNDataset(true,4);
@@ -606,11 +609,11 @@ begin
   ds := DBConnector.GetNDataset(true,5);
   ds := DBConnector.GetNDataset(true,5);
 
 
   ds.open;
   ds.open;
-  TCustomBufDataset(ds).SaveToFile('test.xml',dfXML);
+  TCustomBufDataset(ds).SaveToFile(TestXMLFileName,dfXML);
   ds.close;
   ds.close;
 
 
   LoadDs := DBConnector.GetNDataset(True,2);
   LoadDs := DBConnector.GetNDataset(True,2);
-  TCustomBufDataset(LoadDs).FileName:='test.xml';
+  TCustomBufDataset(LoadDs).FileName:=TestXMLFileName;
   LoadDs.Open;
   LoadDs.Open;
 
 
   ds := DBConnector.GetNDataset(true,4);
   ds := DBConnector.GetNDataset(true,4);
@@ -627,13 +630,13 @@ var SaveDs: TCustomBufDataset;
 begin
 begin
   SaveDs := DBConnector.GetNDataset(true,15) as TSQLQuery;
   SaveDs := DBConnector.GetNDataset(true,15) as TSQLQuery;
   SaveDs.Open;
   SaveDs.Open;
-  SaveDs.SaveToFile('Basics.xml',dfXML);
+  SaveDs.SaveToFile(TestXMLFileName,dfXML);
   SaveDs.Close;
   SaveDs.Close;
 
 
   Conn := TSQLConnectionClass(TSQLDBConnector(DBConnector).Connection.ClassType).Create(nil);
   Conn := TSQLConnectionClass(TSQLDBConnector(DBConnector).Connection.ClassType).Create(nil);
   LoadDs := TSQLQuery.Create(nil);
   LoadDs := TSQLQuery.Create(nil);
   LoadDs.DataBase:=Conn;
   LoadDs.DataBase:=Conn;
-  LoadDs.LoadFromFile('Basics.xml');
+  LoadDs.LoadFromFile(TestXMLFileName);
   LoadDs.Next;
   LoadDs.Next;
   LoadDs.Close;
   LoadDs.Close;
   LoadDs.Free;
   LoadDs.Free;

+ 12 - 3
packages/fcl-db/tests/testdbbasics.pas

@@ -159,9 +159,9 @@ type
     procedure TestBug7007;
     procedure TestBug7007;
     procedure TestBug6893;
     procedure TestBug6893;
     procedure TestRequired;
     procedure TestRequired;
+    procedure TestOldValueObsolete;
     procedure TestOldValue;
     procedure TestOldValue;
     procedure TestModified;
     procedure TestModified;
-    procedure TestOldValue1;
   end;
   end;
 
 
 
 
@@ -618,17 +618,26 @@ begin
   DBConnector.StopTest;
   DBConnector.StopTest;
 end;
 end;
 
 
-procedure TTestCursorDBBasics.TestOldValue;
+procedure TTestCursorDBBasics.TestOldValueObsolete;
 var v : variant;
 var v : variant;
     bufds: TDataset;
     bufds: TDataset;
 begin
 begin
+  // this test was created as reaction to AV bug found in TCustomBufDataset.GetFieldData
+  // when retrieving OldValue (State=dsOldValue) of newly inserted or appended record.
+  // In this case was CurrBuff set to nil (and not checked),
+  // because OldValuesBuffer for just inserted record is nil. See rev.17704
+  // (So purpose of this test isn't test InsertRecord on empty dataset or so)
+  // Later was this test replaced by more complex TestOldValue (superset of old test),
+  // but next to it was restored back also original test.
+  // So now we have two tests which test same thing, where this 'old' one is subset of 'new' one
+  // Ideal solution would be remove this 'old' test as it does not test anything what is not tested elsewhere ...
   bufds := DBConnector.GetNDataset(0) as TDataset;
   bufds := DBConnector.GetNDataset(0) as TDataset;
   bufds.Open;
   bufds.Open;
   bufds.InsertRecord([0,'name']);
   bufds.InsertRecord([0,'name']);
   v := VarToStr(bufds.fields[1].OldValue);
   v := VarToStr(bufds.fields[1].OldValue);
 end;
 end;
 
 
-procedure TTestCursorDBBasics.TestOldValue1;
+procedure TTestCursorDBBasics.TestOldValue;
 begin
 begin
   with DBConnector.GetNDataset(1) as TDataset do
   with DBConnector.GetNDataset(1) as TDataset do
   begin;
   begin;

+ 39 - 6
packages/fcl-db/tests/testfieldtypes.pas

@@ -998,10 +998,12 @@ end;
 procedure TTestFieldTypes.CreateTableWithFieldType(ADatatype: TFieldType;
 procedure TTestFieldTypes.CreateTableWithFieldType(ADatatype: TFieldType;
   ASQLTypeDecl: string);
   ASQLTypeDecl: string);
 begin
 begin
-  TSQLDBConnector(DBConnector).Connection.ExecuteDirect('create table FPDEV2 (FT ' +ASQLTypeDecl+ ')');
-
-// Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
-  TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
+  with TSQLDBConnector(DBConnector) do
+  begin
+    Connection.ExecuteDirect('create table FPDEV2 (FT ' +ASQLTypeDecl+ ')');
+    // Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
+    Transaction.CommitRetaining;
+  end;
 end;
 end;
 
 
 procedure TTestFieldTypes.TestFieldDeclaration(ADatatype: TFieldType;
 procedure TTestFieldTypes.TestFieldDeclaration(ADatatype: TFieldType;
@@ -1011,7 +1013,6 @@ begin
     begin
     begin
     SQL.Clear;
     SQL.Clear;
     SQL.Add('select * from FPDEV2');
     SQL.Add('select * from FPDEV2');
-
     Open;
     Open;
     AssertEquals(1,FieldCount);
     AssertEquals(1,FieldCount);
     AssertTrue(CompareText('FT',fields[0].FieldName)=0);
     AssertTrue(CompareText('FT',fields[0].FieldName)=0);
@@ -1941,24 +1942,35 @@ procedure TTestFieldTypes.TestSQLIdentity;
 var datatype, values: string;
 var datatype, values: string;
     fieldtype: TFieldType;
     fieldtype: TFieldType;
     i: integer;
     i: integer;
+    updatable: boolean;
 begin
 begin
   if sqlDBType in MySQLdbTypes then
   if sqlDBType in MySQLdbTypes then
   begin
   begin
     datatype:='INT AUTO_INCREMENT PRIMARY KEY';
     datatype:='INT AUTO_INCREMENT PRIMARY KEY';
     values:='VALUES(DEFAULT)';
     values:='VALUES(DEFAULT)';
     fieldtype:=ftAutoInc;
     fieldtype:=ftAutoInc;
+    updatable:=true;
   end
   end
   else if sqlDBType = sqlite3 then
   else if sqlDBType = sqlite3 then
   begin
   begin
     datatype:='INTEGER PRIMARY KEY';
     datatype:='INTEGER PRIMARY KEY';
     values:='DEFAULT VALUES';
     values:='DEFAULT VALUES';
     fieldtype:=ftInteger;
     fieldtype:=ftInteger;
+    updatable:=true;
+  end
+  else if sqlDBType = postgresql then
+  begin
+    datatype:='SERIAL';
+    values:='DEFAULT VALUES';
+    fieldtype:=ftInteger;
+    updatable:=true;
   end
   end
   else if sqlDBType = mssql then
   else if sqlDBType = mssql then
   begin
   begin
     datatype:='INTEGER IDENTITY';
     datatype:='INTEGER IDENTITY';
     values:='DEFAULT VALUES';
     values:='DEFAULT VALUES';
     fieldtype:=ftAutoInc;
     fieldtype:=ftAutoInc;
+    updatable:=false;
   end
   end
   else
   else
     Ignore(STestNotApplicable);
     Ignore(STestNotApplicable);
@@ -1975,9 +1987,30 @@ begin
     AssertTrue(Locate('FT',1,[])); // bug 17624
     AssertTrue(Locate('FT',1,[])); // bug 17624
     for i := 1 to 3 do
     for i := 1 to 3 do
     begin
     begin
-      AssertEquals(Fields[0].AsInteger, i);
+      AssertEquals(i, Fields[0].AsInteger);
       Next;
       Next;
     end;
     end;
+    // some databases (like MS SQL Server) do not allow updating identity columns
+    AssertEquals('ReadOnly', Fields[0].ReadOnly, not updatable);
+    // some databases (like PostgreSQL, MySQL) allow inserting explicit values and updating auto incrementing columns
+    if updatable then
+    begin
+      UpdateMode:=upWhereAll; // if there is no PK for FPDEV2 table
+      // updating:
+      Last;
+      while not Bof do
+      begin
+        Edit;
+        Fields[0].AsInteger:=Fields[0].AsInteger+2;
+        Post;
+        Prior;
+      end;
+      // inserting:
+      Append;
+      Fields[0].AsInteger:=6;
+      Post;
+      ApplyUpdates;
+    end;
     Close;
     Close;
   end;
   end;
 end;
 end;