Browse Source

--- Merging r23498 into '.':
U packages/fcl-db/src/sqldb/sqldb.pp
--- Merging r23530 into '.':
U packages/fcl-db/src/base/bufdataset.pas
--- Merging r23570 into '.':
G packages/fcl-db/src/base/bufdataset.pas
--- Merging r23592 into '.':
U packages/fcl-db/tests/testdbbasics.pas
G packages/fcl-db/src/base/bufdataset.pas
--- Merging r23595 into '.':
U packages/fcl-db/src/base/dataset.inc
G packages/fcl-db/src/base/bufdataset.pas
U packages/fcl-db/src/base/db.pas
--- Merging r23598 into '.':
G packages/fcl-db/src/base/bufdataset.pas
--- Merging r23599 into '.':
G packages/fcl-db/src/base/bufdataset.pas
--- Merging r23618 into '.':
U tests/test/packages/fcl-db/tdb3.pp
U tests/test/packages/fcl-db/tdb1.pp
U tests/test/packages/fcl-db/tdb2.pp
--- Merging r23630 into '.':
U packages/fcl-db/tests/bufdatasettoolsunit.pas
--- Merging r23640 into '.':
G packages/fcl-db/tests/bufdatasettoolsunit.pas
--- Merging r23665 into '.':
G packages/fcl-db/src/base/db.pas
G packages/fcl-db/src/base/dataset.inc
--- Merging r23702 into '.':
U packages/odbc/src/odbcsql.inc
--- Merging r23703 into '.':
U packages/fcl-db/src/sqldb/odbc/odbcconn.pas
--- Merging r23708 into '.':
U packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp
--- Merging r23723 into '.':
G packages/fcl-db/src/base/bufdataset.pas
--- Merging r23728 into '.':
U packages/fcl-db/src/sqldb/mysql/mysqlconn.inc
G packages/fcl-db/src/base/db.pas
U packages/fcl-db/src/base/database.inc

# revisions: 23498,23530,23570,23592,23595,23598,23599,23618,23630,23640,23665,23702,23703,23708,23723,23728
r23498 | michael | 2013-01-22 21:36:05 +0100 (Tue, 22 Jan 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/sqldb/sqldb.pp

* Make statementtype public in TSQLQuery
r23530 | reiniero | 2013-01-28 16:49:05 +0100 (Mon, 28 Jan 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas

* fcl-db: cosmetic: bufdataset comments: typos, grammar, uniform indentation
r23570 | reiniero | 2013-02-04 13:18:09 +0100 (Mon, 04 Feb 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas

* sqldb: bufdataset: no longer swallow filter parsing exceptions
r23592 | lacak | 2013-02-11 08:44:20 +0100 (Mon, 11 Feb 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas
M /trunk/packages/fcl-db/tests/testdbbasics.pas

fcl-db: bufdataset: when new record is inserted or existing edited and some sorted index is presented record is moved to proper position in index. (introduces OrderCurrentRecord method). Small drawback is than in case of inserting record new record is first inserted before current current record and then moved to proper position.(but it takes only few memory operations in current implementation)
r23595 | lacak | 2013-02-11 13:14:36 +0100 (Mon, 11 Feb 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas
M /trunk/packages/fcl-db/src/base/dataset.inc
M /trunk/packages/fcl-db/src/base/db.pas

fcl-db: formatting (charcase, method ordering)
r23598 | lacak | 2013-02-12 13:24:47 +0100 (Tue, 12 Feb 2013) | 3 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas

fcl-db: bufdataset: small reprocessing
- adapt method ProcessFieldsToCompareStruct - initialise DBCompareStruct in one place all fields. Used by BuildIndex and Locate.
- add new method BufferOffset - returns offset of buffer data from begining of memory record = ( sizeof(TBufRecLinkItem) * FMaxIndexesCount )
r23599 | lacak | 2013-02-12 13:30:04 +0100 (Tue, 12 Feb 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas

fcl-db: bufdataset: rename local variable (to avoid confusion between FFilterBufer and FilterBuffer and Buffer vs. Record)
r23618 | yury | 2013-02-14 15:05:01 +0100 (Thu, 14 Feb 2013) | 1 line
Changed paths:
M /trunk/tests/test/packages/fcl-db/tdb1.pp
M /trunk/tests/test/packages/fcl-db/tdb2.pp
M /trunk/tests/test/packages/fcl-db/tdb3.pp

* Cleanup on exit.
r23630 | lacak | 2013-02-19 10:47:25 +0100 (Tue, 19 Feb 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/tests/bufdatasettoolsunit.pas

fcl-db: tests: when testing bufdataset use MergeChangeLog before saving test data into file to delete undo log. Tests which tests f.e. CancelUpdates are failed and they should not.
r23640 | lacak | 2013-02-21 09:54:27 +0100 (Thu, 21 Feb 2013) | 3 lines
Changed paths:
M /trunk/packages/fcl-db/tests/bufdatasettoolsunit.pas

fcl-db: test: when testing unidirectional bufdataset set UniDirectional after (not before) test data are populated and saved to file (before any test), because setting unidirectional before prevents inserting test data at all.
Of course this change does not help very much, because when data are loaded from file bidirectional is checked and exception is raised.
So IMO we should comment: //UniDirectional := TestUniDirectional, because in concept of save/load file we can not test unidirectional bufdataset.
r23665 | lacak | 2013-02-28 10:26:25 +0100 (Thu, 28 Feb 2013) | 4 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/dataset.inc
M /trunk/packages/fcl-db/src/base/db.pas

fcl-db: base: mark ABookmark parameter of TDataset.GotoBookmark method as const.
In trunk TBookmark is of type array of bytes (TBytes), prior this it was Pointer (to memory block of BookmarkSize where is stored "bookmark data").
BufDatset uses GotoBookmark and passes address of bookmark, which is okay when TBookmark was pointer, but when it is dynamic array then on entry into method FPC_DYNARRAY_INCR_REF is called, where is accessed "array header" in unallocated memory, which leads to invalid pointer operation.
Making parameter as const will avoid invoking reference counting mechanism. Bug #23381. Discussed also in DB-Core ML.
r23702 | michael | 2013-03-07 09:57:18 +0100 (Thu, 07 Mar 2013) | 1 line
Changed paths:
M /trunk/packages/odbc/src/odbcsql.inc

* Windows 64-bit patches from Laco
r23703 | lacak | 2013-03-07 10:17:52 +0100 (Thu, 07 Mar 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/sqldb/odbc/odbcconn.pas

fcl-db: odbc: enable 64bit support (use SQLLEN, SQLULEN instead of SQLINTEGER, SQLUINTEGER) after ODBC header file was updated for 64 bit support in rev.23702
r23708 | svenbarth | 2013-03-07 22:11:40 +0100 (Thu, 07 Mar 2013) | 6 lines
Changed paths:
M /trunk/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp

Up to now TSQLite3Connection used the variable SQLiteLibraryName to control the name of the SQLite library to use. The sqlite3dyn unit also contains a variable to control the library to use: SQLiteDefaultLibrary. To avoid potential confusion the variable from sqlite3dyn will be used from now on.

packages/fcl-db/src/sqldb/sqlite3/sqlite3conn.pp:
* Declare SQLiteLibraryName as an absolute alias for SQLiteDefaultLibrary and deprecate it with an approbiate hint
* TSQLite3Connection.DoInternalConnect & GetConnectionInfo: use SQLiteDefaultLibrary instead of SQLiteLibraryName
r23723 | lacak | 2013-03-08 08:34:23 +0100 (Fri, 08 Mar 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas

fcl-db: bufdataset: when index is added set IndexDefs.Updated to false to signal, that FIndexDefs and FIndexes are not synchronized. This allow next call to IndexDefs.Update (which tests Updated) do synchronization.
r23728 | ludob | 2013-03-08 14:15:53 +0100 (Fri, 08 Mar 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/database.inc
M /trunk/packages/fcl-db/src/base/db.pas
M /trunk/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc

sqldb: implemented TCustomConnection.Close(ForceClose : Boolean = False);

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

marco 12 years ago
parent
commit
44a71c47dc

File diff suppressed because it is too large
+ 282 - 274
packages/fcl-db/src/base/bufdataset.pas


+ 7 - 2
packages/fcl-db/src/base/database.inc

@@ -541,9 +541,14 @@ begin
   end;
 end;
 
-procedure TCustomConnection.Close;
+procedure TCustomConnection.Close(ForceClose : Boolean = False);
 begin
-  Connected := False;
+  try
+    ForcedClose:=ForceClose;
+    Connected := False;
+  finally
+    ForcedClose:=false;
+  end;
 end;
 
 destructor TCustomConnection.Destroy;

+ 2 - 2
packages/fcl-db/src/base/dataset.inc

@@ -1834,7 +1834,7 @@ begin
   FFieldList.GetFieldNames(List);
 end;
 
-Procedure TDataset.GotoBookmark(ABookmark: TBookmark);
+Procedure TDataset.GotoBookmark(const ABookmark: TBookmark);
 
 
 begin
@@ -2296,7 +2296,7 @@ begin
     FieldByName(Fieldname).Value := Value;
 end;
 
-Function TDataset.Locate(const keyfields: string; const keyvalues: Variant; options: TLocateOptions) : boolean;
+Function TDataset.Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions) : boolean;
 
 begin
   CheckBiDirectional;

+ 5 - 3
packages/fcl-db/src/base/db.pas

@@ -1594,14 +1594,14 @@ type
     function GetCurrentRecord(Buffer: TRecordBuffer): Boolean; virtual;
     procedure GetFieldList(List: TList; const FieldNames: string);
     procedure GetFieldNames(List: TStrings);
-    procedure GotoBookmark(ABookmark: TBookmark);
+    procedure GotoBookmark(const ABookmark: TBookmark);
     procedure Insert;
     procedure InsertRecord(const Values: array of const);
     function IsEmpty: Boolean;
     function IsLinkedTo(ADataSource: TDataSource): Boolean;
     function IsSequenced: Boolean; virtual;
     procedure Last;
-    function Locate(const keyfields: string; const keyvalues: Variant; options: TLocateOptions) : boolean; virtual;
+    function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions) : boolean; virtual;
     function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; virtual;
     function MoveBy(Distance: Longint): Longint;
     procedure Next;
@@ -1878,6 +1878,7 @@ type
     FAfterDisconnect: TNotifyEvent;
     FBeforeConnect: TNotifyEvent;
     FBeforeDisconnect: TNotifyEvent;
+    FForcedClose: Boolean;
     FLoginPrompt: Boolean;
     FOnLogin: TLoginEvent;
     FStreamedConnected: Boolean;
@@ -1894,9 +1895,10 @@ type
     procedure InternalHandleException; virtual;
     procedure Loaded; override;
     procedure SetConnected (Value : boolean); virtual;
+    property ForcedClose : Boolean read FForcedClose write FForcedClose;
     property Streamedconnected: Boolean read FStreamedConnected write FStreamedConnected;
   public
-    procedure Close;
+    procedure Close(ForceClose: Boolean=False);
     destructor Destroy; override;
     procedure Open;
     property DataSetCount: Longint read GetDataSetCount;

+ 23 - 4
packages/fcl-db/src/sqldb/mysql/mysqlconn.inc

@@ -572,7 +572,16 @@ begin
       C.FStatement := stringsreplace(C.FStatement,ParamNames,ParamValues,[rfReplaceAll]);
       end;
     if mysql_query(FMySQL,Pchar(C.FStatement))<>0 then
-      MySQLError(FMYSQL,SErrExecuting,Self)
+      begin
+      if not ForcedClose then
+        MySQLError(FMYSQL,SErrExecuting,Self)
+      else //don't return a resulset. We are shutting down, not opening.
+        begin
+        C.RowsAffected:=0;
+        C.FSelectable:= False;
+        C.FRes:=nil;
+        end;
+      end
     else
       begin
       C.RowsAffected := mysql_affected_rows(FMYSQL);
@@ -581,7 +590,17 @@ begin
       repeat
         Res:=mysql_store_result(FMySQL); //returns a null pointer also if the statement didn't return a result set
         if mysql_errno(FMySQL)<>0 then
-          MySQLError(FMySQL, SErrGettingResult, Self);
+          begin
+          if not ForcedClose then
+            MySQLError(FMySQL, SErrGettingResult, Self)
+          else
+            begin
+            C.RowsAffected:=0;
+            C.FSelectable:= False;
+            C.FRes:=nil;
+            break;
+            end;
+          end;
         if Res<>nil then
           begin
           mysql_free_result(C.FRes);
@@ -1145,7 +1164,7 @@ end;
 function TConnectionName.Commit(trans: TSQLHandle): boolean;
 begin
   //mysql_commit(FMySQL);
-  Result := mysql_query(FMySQL, 'COMMIT') = 0;
+  Result := (mysql_query(FMySQL, 'COMMIT') = 0) or ForcedClose;
   if not Result then
     MySQLError(FMySQL, SErrExecuting, Self);
 end;
@@ -1153,7 +1172,7 @@ end;
 function TConnectionName.RollBack(trans: TSQLHandle): boolean;
 begin
   //mysql_rollback(FMySQL);
-  Result := mysql_query(FMySQL, 'ROLLBACK') = 0;
+  Result := (mysql_query(FMySQL, 'ROLLBACK') = 0) or ForcedClose;
   if not Result then
     MySQLError(FMySQL, SErrExecuting, Self);
 end;

+ 21 - 20
packages/fcl-db/src/sqldb/odbc/odbcconn.pas

@@ -328,7 +328,8 @@ var
   TimeStampVal: SQL_TIMESTAMP_STRUCT;
   BoolVal: byte;
   NumericVal: SQL_NUMERIC_STRUCT;
-  ColumnSize, BufferLength, StrLenOrInd: SQLINTEGER;
+  ColumnSize: SQLULEN;
+  BufferLength, StrLenOrInd: SQLLEN;
   CType, SqlType, DecimalDigits:SQLSMALLINT;
   APD: SQLHDESC;
 begin
@@ -489,12 +490,12 @@ begin
     if AParams[ParamIndex].IsNull then
        StrLenOrInd:=SQL_NULL_DATA;
 
-    Buf:=GetMem(Size+SizeOf(SQLINTEGER));
+    Buf:=GetMem(Size+SizeOf(StrLenOrInd));
     Move(PVal^, Buf^, Size);
     if StrLenOrInd<>0 then
        begin
        PStrLenOrInd:=Buf + Size;
-       Move(StrLenOrInd, PStrLenOrInd^, SizeOf(SQLINTEGER));
+       Move(StrLenOrInd, PStrLenOrInd^, SizeOf(StrLenOrInd));
        end
     else
        PStrLenOrInd:=nil;
@@ -779,7 +780,7 @@ end;
 
 function TODBCConnection.RowsAffected(cursor: TSQLCursor): TRowsCount;
 var
-  RowCount: SQLINTEGER;
+  RowCount: SQLLEN;
 begin
   if assigned(cursor) then
     if ODBCSucces( SQLRowCount((cursor as TODBCCursor).FSTMTHandle, RowCount) ) then
@@ -816,7 +817,7 @@ function TODBCConnection.LoadField(cursor: TSQLCursor; FieldDef: TFieldDef; buff
 {$ENDIF}
 var
   ODBCCursor:TODBCCursor;
-  StrLenOrInd:SQLINTEGER;
+  StrLenOrInd:SQLLEN;
   ODBCDateStruct:SQL_DATE_STRUCT;
   ODBCTimeStruct:SQL_TIME_STRUCT;
   ODBCTimeStampStruct:SQL_TIMESTAMP_STRUCT;
@@ -962,7 +963,7 @@ procedure TODBCConnection.LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBuf
 var
   ODBCCursor: TODBCCursor;
   Res: SQLRETURN;
-  StrLenOrInd:SQLINTEGER;
+  StrLenOrInd:SQLLEN;
   BlobBuffer:pointer;
   BlobBufferSize,BytesRead:SQLINTEGER;
   BlobMemoryStream:TMemoryStream;
@@ -1084,11 +1085,11 @@ var
   ColumnCount:SQLSMALLINT;
   i:integer;
   ColNameLength,TypeNameLength,DataType,DecimalDigits,Nullable:SQLSMALLINT;
-  ColumnSize:SQLUINTEGER;
+  ColumnSize:SQLULEN;
   ColName,TypeName:string;
   FieldType:TFieldType;
   FieldSize:word;
-  AutoIncAttr, Updatable, FixedPrecScale: SQLINTEGER;
+  AutoIncAttr, Updatable, FixedPrecScale: SQLLEN;
 begin
   ODBCCursor:=cursor as TODBCCursor;
 
@@ -1276,7 +1277,7 @@ begin
     // add FieldDef
     with TFieldDef.Create(FieldDefs, FieldDefs.MakeNameUnique(ColName), FieldType, FieldSize, (Nullable=SQL_NO_NULLS) and (AutoIncAttr=SQL_FALSE), i) do
     begin
-      if Updatable = 0{SQL_ATTR_READONLY} then Attributes := Attributes + [faReadonly];
+      if Updatable = SQL_ATTR_READONLY then Attributes := Attributes + [faReadonly];
     end;
   end;
 end;
@@ -1288,13 +1289,13 @@ var
   IndexDef: TIndexDef;
   KeyName: String;
   // variables for binding
-  NonUnique :SQLSMALLINT; NonUniqueIndOrLen :SQLINTEGER;
-  IndexName :string;      IndexNameIndOrLen :SQLINTEGER;
-  _Type     :SQLSMALLINT; _TypeIndOrLen     :SQLINTEGER;
-  OrdinalPos:SQLSMALLINT; OrdinalPosIndOrLen:SQLINTEGER;
-  ColName   :string;      ColNameIndOrLen   :SQLINTEGER;
-  AscOrDesc :char;        AscOrDescIndOrLen :SQLINTEGER;
-  PKName    :string;      PKNameIndOrLen    :SQLINTEGER;
+  NonUnique :SQLSMALLINT; NonUniqueIndOrLen :SQLLEN;
+  IndexName :string;      IndexNameIndOrLen :SQLLEN;
+  _Type     :SQLSMALLINT; _TypeIndOrLen     :SQLLEN;
+  OrdinalPos:SQLSMALLINT; OrdinalPosIndOrLen:SQLLEN;
+  ColName   :string;      ColNameIndOrLen   :SQLLEN;
+  AscOrDesc :char;        AscOrDescIndOrLen :SQLLEN;
+  PKName    :string;      PKNameIndOrLen    :SQLLEN;
 const
   DEFAULT_NAME_LEN = 255;
 begin
@@ -1463,14 +1464,14 @@ var i,l: SQLSMALLINT;
 begin
   case InfoType of
     citServerType:
-      i:=17{SQL_DBMS_NAME};
+      i:=SQL_DBMS_NAME;
     citServerVersion,
     citServerVersionString:
-      i:=18{SQL_DBMS_VER};
+      i:=SQL_DBMS_VER;
     citClientName:
-      i:=6{SQL_DRIVER_NAME};
+      i:=SQL_DRIVER_NAME;
     citClientVersion:
-      i:=7{SQL_DRIVER_VER};
+      i:=SQL_DRIVER_VER;
   else
     Result:=inherited GetConnectionInfo(InfoType);
     Exit;

+ 1 - 0
packages/fcl-db/src/sqldb/sqldb.pp

@@ -342,6 +342,7 @@ type
   TSQLQuery = Class(TCustomSQLQuery)
   public
     property SchemaType;
+    Property StatementType;
   Published
     property MaxIndexesCount;
    // TDataset stuff

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

@@ -115,7 +115,7 @@ type
   end;
   
 Var
-  SQLiteLibraryName : String = sqlite3lib; 
+  SQLiteLibraryName : String absolute sqlite3dyn.SQLiteDefaultLibrary deprecated 'use sqlite3dyn.SQLiteDefaultLibrary instead';
    
 implementation
 
@@ -732,7 +732,7 @@ var
 begin
   if Length(databasename)=0 then
     DatabaseError(SErrNoDatabaseName,self);
-  InitializeSqlite(SQLiteLibraryName);
+  InitializeSqlite(SQLiteDefaultLibrary);
   str1:= databasename;
   checkerror(sqlite3_open(pchar(str1),@fhandle));
   if (Length(Password)>0) and assigned(sqlite3_key) then
@@ -933,7 +933,7 @@ function TSQLite3Connection.GetConnectionInfo(InfoType: TConnInfoType): string;
 begin
   Result:='';
   try
-    InitializeSqlite(SQLiteLibraryName);
+    InitializeSqlite(SQLiteDefaultLibrary);
     case InfoType of
       citServerType:
         Result:=TSQLite3ConnectionDef.TypeName;

+ 23 - 16
packages/fcl-db/tests/bufdatasettoolsunit.pas

@@ -88,21 +88,25 @@ var BufDataset  : TPersistentBufDataSet;
 
 begin
   BufDataset := TPersistentBufDataSet.Create(nil);
-  BufDataset.Name := 'NDataset';
-  BufDataset.FieldDefs.Add('ID',ftInteger);
-  BufDataset.FieldDefs.Add('NAME',ftString,50);
-  BufDataset.CreateDataset;
-  BufDataset.Open;
-  for i := 1 to n do
+  with BufDataset do
     begin
-    BufDataset.Append;
-    BufDataset.FieldByName('ID').AsInteger := i;
-    BufDataset.FieldByName('NAME').AsString := 'TestName' + inttostr(i);
-    BufDataset.Post;
+    Name := 'NDataset';
+    FieldDefs.Add('ID',ftInteger);
+    FieldDefs.Add('NAME',ftString,50);
+    CreateDataset;
+    Open;
+    for i := 1 to n do
+      begin
+      Append;
+      FieldByName('ID').AsInteger := i;
+      FieldByName('NAME').AsString := 'TestName' + inttostr(i);
+      Post;
+      end;
+    MergeChangeLog;
+    TempFileName:=GetTempFileName;
+    FileName:=TempFileName;
+    Close; // Save data into file
     end;
-  BufDataset.TempFileName:=GetTempFileName;
-  BufDataset.FileName:=BufDataset.TempFileName;
-  BufDataset.Close; // Save data into file
   Result := BufDataset;
 end;
 
@@ -121,7 +125,6 @@ begin
   with BufDataset do
     begin
     Name := 'FieldDataset';
-    UniDirectional := FUniDirectional;
     FieldDefs.Add('ID',ftInteger);
     FieldDefs.Add('FSTRING',ftString,10);
     FieldDefs.Add('FSMALLINT',ftSmallint);
@@ -162,9 +165,13 @@ begin
       FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
       Post;
     end;
-    BufDataset.TempFileName:=GetTempFileName;
-    BufDataset.FileName:=BufDataset.TempFileName;
+    MergeChangeLog;
+    TempFileName:=GetTempFileName;
+    FileName:=TempFileName;
     Close; // Save data into file
+    // When data are loaded from file, bidirectional is checked
+    // so unidirectional bufdataset can't be tested here
+    UniDirectional := TestUniDirectional;
     end;
   Result := BufDataset;
 end;

+ 6 - 4
packages/fcl-db/tests/testdbbasics.pas

@@ -2111,6 +2111,7 @@ procedure TTestBufDatasetDBBasics.TestIndexAppendRecord;
 var i: integer;
     LastValue: string;
 begin
+  // start with empty dataset
   with DBConnector.GetNDataset(true,0) as TCustomBufDataset do
   begin
     MaxIndexesCount:=4;
@@ -2125,19 +2126,20 @@ begin
     // append data at end
     for i:=20 downto 0 do
       AppendRecord([i, inttostr(i)]);
-    First;
     // insert data at begining
+    IndexName:='';
+    First;
     for i:=21 to 22 do
       InsertRecord([i, inttostr(i)]);
 
-    // ATM new records are not ordered as they are added ?
+    // swith to index and check if records are ordered
+    IndexName := 'testindex';
     LastValue := '';
     First;
     for i:=22 downto 0 do
     begin
       CheckEquals(23-i, RecNo, 'testindex.RecNo:');
-      CheckEquals(inttostr(i), Fields[1].AsString, 'testindex.Fields[1].Value:');
-      //CheckTrue(AnsiCompareStr(LastValue,Fields[1].AsString) < 0, 'testindex.LastValue>CurrValue');
+      CheckTrue(AnsiCompareStr(LastValue,Fields[1].AsString) < 0, 'testindex.LastValue>=CurrValue');
       LastValue := Fields[1].AsString;
       Next;
     end;

+ 103 - 91
packages/odbc/src/odbcsql.inc

@@ -1,30 +1,36 @@
 {$ifdef fpc}
-{$mode objfpc}
-{$macro on}
+ {$mode objfpc}
+ {$macro on}
 {$endif}
 
 {$h+}
 
 {$ifdef fpc}
- // define ODBC version 3.51 by default
-{$define ODBCVER:=$0351}
+ // define ODBC version 3.52 by default for Windows and MAC and 3.51 for Linux/Unix
+ {$if defined(WINDOWS) or defined(DARWIN)}
+  {$define ODBCVER:=$0352}
+ {$else}
+  {$define ODBCVER:=$0351}
+ {$endif}
+{$else fpc}
+ {$define ODBCVER:=$0352}
+{$endif fpc}
 {$if ODBCVER >= $0300}
   {$define ODBCVER3}
 {$endif}
 {$if ODBCVER >= $0350}
   {$define ODBCVER35}
 {$endif}
-{$else fpc}
-  {$define ODBCVER3}
-  {$define ODBCVER35}
-{$endif fpc}
+{$if ODBCVER >= $0352}
+  {$define ODBCVER352}
+{$endif}
 
 {$ifndef DYNLOADINGODBC}
-{$IFDEF WINDOWS}
+ {$IFDEF WINDOWS}
   { $linklib odbc32}
-{$ELSE}
+ {$ELSE}
   {$linklib odbc}
-{$endif}
+ {$ENDIF}
 {$endif}
 
 interface
@@ -65,24 +71,29 @@ type
   SQLSCHAR     = cschar;
   SQLSMALLINT  = csshort;
   SQLUSMALLINT = cushort;
+  SQLINTEGER   = clong;
+  SQLUINTEGER  = culong;
+  SQLLEN       = {$IFDEF ODBCVER352}PtrInt{$ELSE}SQLINTEGER{$ENDIF};
+  SQLULEN      = {$IFDEF ODBCVER352}PtrUInt{$ELSE}SQLUINTEGER{$ENDIF};
+  SQLREAL      = cfloat;
+  SQLDOUBLE    = cdouble;
+  SQLFLOAT     = cdouble;
   SQLRETURN    = SQLSMALLINT;
+  SQLPOINTER   = pointer;
   SQLHANDLE    = pointer;
   SQLHENV      = SQLHANDLE;
   SQLHDBC      = SQLHANDLE;
   SQLHSTMT     = SQLHANDLE;
   SQLHDESC     = SQLHANDLE;
-  SQLINTEGER   = clong;
-  SQLUINTEGER  = culong;
-  SQLPOINTER   = pointer;
-  SQLREAL      = cfloat;
-  SQLDOUBLE    = cdouble;
-  SQLFLOAT     = cdouble;
   SQLHWND      = pointer;
+  SQLSETPOSIROW= {$IF DEFINED(CPU64) AND DEFINED(ODBCVER352)}cuint64{$ELSE}SQLUSMALLINT{$ENDIF};
   PSQLCHAR      = PChar;
-  PSQLINTEGER   = ^SQLINTEGER;
-  PSQLUINTEGER  = ^SQLUINTEGER;
   PSQLSMALLINT  = ^SQLSMALLINT;
   PSQLUSMALLINT = ^SQLUSMALLINT;
+  PSQLINTEGER   = ^SQLINTEGER;
+  PSQLUINTEGER  = ^SQLUINTEGER;
+  PSQLLEN       = ^SQLLEN;
+  PSQLULEN      = ^SQLULEN;
   PSQLREAL      = ^SQLREAL;
   PSQLDOUBLE    = ^SQLDOUBLE;
   PSQLFLOAT     = ^SQLFLOAT;
@@ -240,7 +251,7 @@ const
   SQL_C_ULONG    =  SQL_C_LONG +SQL_UNSIGNED_OFFSET; // UNSIGNED INTEGER
   SQL_C_USHORT   =  SQL_C_SHORT+SQL_UNSIGNED_OFFSET; // UNSIGNED SMALLINT
   SQL_C_UTINYINT =  SQL_TINYINT+SQL_UNSIGNED_OFFSET; // UNSIGNED TINYINT
-  SQL_C_BOOKMARK = SQL_C_ULONG; // BOOKMARK
+  SQL_C_BOOKMARK = {$if defined(CPU64) and defined(ODBCVER352)}SQL_C_UBIGINT{$else}SQL_C_ULONG{$endif}; // BOOKMARK
 
 {$ifdef ODBCVER35}
   SQL_C_GUID    = SQL_GUID;
@@ -445,8 +456,6 @@ const
 
   SQL_MAX_OPTION_STRING_LENGTH = 256;
 
-  SQL_ODBC_CURSORS      = 110;
-  SQL_ATTR_ODBC_CURSORS = SQL_ODBC_CURSORS;
   { SQL_ODBC_CURSORS options }
   SQL_CUR_USE_IF_NEEDED = 0;
   SQL_CUR_USE_ODBC      = 1;
@@ -521,55 +530,51 @@ const
   SQL_RETRIEVE_DATA           =11;
   SQL_USE_BOOKMARKS           =12;
   SQL_GET_BOOKMARK            =13;      //      GetStmtOption Only */
-  SQL_ROW_NUMBER              = 14;     //      GetStmtOption Only */
+  SQL_ROW_NUMBER              =14 ;     //      GetStmtOption Only */
 
   SQL_ATTR_CURSOR_TYPE        = SQL_CURSOR_TYPE;
   SQL_ATTR_CONCURRENCY        = SQL_CONCURRENCY;
   SQL_ATTR_FETCH_BOOKMARK_PTR = 16;
   SQL_ATTR_ROW_STATUS_PTR     = 25;
   SQL_ATTR_ROWS_FETCHED_PTR   = 26;
-  SQL_AUTOCOMMIT              = 102;
-  SQL_ATTR_AUTOCOMMIT         = SQL_AUTOCOMMIT;
 
   SQL_ATTR_ROW_NUMBER         = SQL_ROW_NUMBER;
-  SQL_TXN_ISOLATION           = 108;
-  SQL_ATTR_TXN_ISOLATION      = SQL_TXN_ISOLATION;
   SQL_ATTR_MAX_ROWS           = SQL_MAX_ROWS;
   SQL_ATTR_USE_BOOKMARKS      = SQL_USE_BOOKMARKS;
 
 //* connection attributes */
   SQL_ACCESS_MODE             =101;
-//  SQL_AUTOCOMMIT              =102;
+  SQL_AUTOCOMMIT              =102;
   SQL_LOGIN_TIMEOUT           =103;
   SQL_OPT_TRACE               =104;
   SQL_OPT_TRACEFILE           =105;
   SQL_TRANSLATE_DLL           =106;
   SQL_TRANSLATE_OPTION        =107;
-//  SQL_TXN_ISOLATION           =108;
+  SQL_TXN_ISOLATION           =108;
   SQL_CURRENT_QUALIFIER       =109;
-//  SQL_ODBC_CURSORS            =110;
+  SQL_ODBC_CURSORS            =110;
   SQL_QUIET_MODE              =111;
   SQL_PACKET_SIZE             =112;
 
 
 //* connection attributes with new names */
-  SQL_ATTR_ACCESS_MODE              =SQL_ACCESS_MODE;
-//  SQL_ATTR_AUTOCOMMIT                       =SQL_AUTOCOMMIT;
-  SQL_ATTR_CONNECTION_DEAD        =1209;        //* GetConnectAttr only */
-  SQL_ATTR_CONNECTION_TIMEOUT   =113;
-  SQL_ATTR_CURRENT_CATALOG        =SQL_CURRENT_QUALIFIER;
+  SQL_ATTR_ACCESS_MODE        =SQL_ACCESS_MODE;
+  SQL_ATTR_AUTOCOMMIT         =SQL_AUTOCOMMIT;
+  SQL_ATTR_CONNECTION_DEAD    =1209;        //* GetConnectAttr only */
+  SQL_ATTR_CONNECTION_TIMEOUT =113;
+  SQL_ATTR_CURRENT_CATALOG    =SQL_CURRENT_QUALIFIER;
   SQL_ATTR_DISCONNECT_BEHAVIOR=114;
-  SQL_ATTR_ENLIST_IN_DTC                  =1207;
-  SQL_ATTR_ENLIST_IN_XA             =1208;
-  SQL_ATTR_LOGIN_TIMEOUT                  =SQL_LOGIN_TIMEOUT;
-//  SQL_ATTR_ODBC_CURSORS             =SQL_ODBC_CURSORS;
-  SQL_ATTR_PACKET_SIZE              =SQL_PACKET_SIZE;
-  SQL_ATTR_QUIET_MODE                       =SQL_QUIET_MODE;
-  SQL_ATTR_TRACE                                      =SQL_OPT_TRACE;
-  SQL_ATTR_TRACEFILE                        =SQL_OPT_TRACEFILE;
-  SQL_ATTR_TRANSLATE_LIB                  =SQL_TRANSLATE_DLL;
-  SQL_ATTR_TRANSLATE_OPTION       =SQL_TRANSLATE_OPTION;
-//  SQL_ATTR_TXN_ISOLATION                  =SQL_TXN_ISOLATION;
+  SQL_ATTR_ENLIST_IN_DTC      =1207;
+  SQL_ATTR_ENLIST_IN_XA       =1208;
+  SQL_ATTR_LOGIN_TIMEOUT      =SQL_LOGIN_TIMEOUT;
+  SQL_ATTR_ODBC_CURSORS       =SQL_ODBC_CURSORS;
+  SQL_ATTR_PACKET_SIZE        =SQL_PACKET_SIZE;
+  SQL_ATTR_QUIET_MODE         =SQL_QUIET_MODE;
+  SQL_ATTR_TRACE              =SQL_OPT_TRACE;
+  SQL_ATTR_TRACEFILE          =SQL_OPT_TRACEFILE;
+  SQL_ATTR_TRANSLATE_LIB      =SQL_TRANSLATE_DLL;
+  SQL_ATTR_TRANSLATE_OPTION   =SQL_TRANSLATE_OPTION;
+  SQL_ATTR_TXN_ISOLATION      =SQL_TXN_ISOLATION;
 
 //* SQL_ACCESS_MODE options */
   SQL_MODE_READ_WRITE         =0;
@@ -797,19 +802,14 @@ const
 #define SQL_MAX_CONCURRENT_ACTIVITIES        1
 #define SQL_MAXIMUM_CONCURRENT_ACTIVITIES       SQL_MAX_CONCURRENT_ACTIVITIES
 #endif
-#define SQL_DATA_SOURCE_NAME                 2
 #define SQL_FETCH_DIRECTION                  8
-#define SQL_SERVER_NAME                     13
 #define SQL_SEARCH_PATTERN_ESCAPE           14
-#define SQL_DBMS_NAME                       17
-#define SQL_DBMS_VER                        18
 #define SQL_ACCESSIBLE_TABLES               19
-#define SQL_ACCESSIBLE_PROCEDURES               20
+#define SQL_ACCESSIBLE_PROCEDURES           20
 #define SQL_CURSOR_COMMIT_BEHAVIOR          23
 #define SQL_DATA_SOURCE_READ_ONLY           25
 #define SQL_DEFAULT_TXN_ISOLATION           26
 #define SQL_IDENTIFIER_CASE                 28
-#define SQL_IDENTIFIER_QUOTE_CHAR           29
 #define SQL_MAX_COLUMN_NAME_LEN             30
 #define SQL_MAXIMUM_COLUMN_NAME_LENGTH          SQL_MAX_COLUMN_NAME_LEN
 #define SQL_MAX_CURSOR_NAME_LEN             31
@@ -820,9 +820,16 @@ const
 #define SQL_MAXIMUM_CATALOG_NAME_LENGTH         SQL_MAX_CATALOG_NAME_LEN
 #define SQL_MAX_TABLE_NAME_LEN              35
 }
+  SQL_DATA_SOURCE_NAME                = 2;
+  SQL_DRIVER_NAME                     = 6;
+  SQL_DRIVER_VER                      = 7;
+  SQL_SERVER_NAME                     = 13;
+  SQL_DBMS_NAME                       = 17;
+  SQL_DBMS_VER                        = 18;
+  SQL_IDENTIFIER_QUOTE_CHAR           = 29;
   SQL_SCROLL_CONCURRENCY              = 43;
   SQL_TXN_CAPABLE                     = 46;
-  SQL_TRANSACTION_CAPABLE              = SQL_TXN_CAPABLE;
+  SQL_TRANSACTION_CAPABLE             = SQL_TXN_CAPABLE;
   SQL_USER_NAME                       = 47;
   SQL_TXN_ISOLATION_OPTION            = 72;
   SQL_TRANSACTION_ISOLATION_OPTION    = SQL_TXN_ISOLATION_OPTION;
@@ -1000,7 +1007,7 @@ const
   SQL_COLUMN_DRIVER_START        = 1000;
 {$endif} { ODBCVER >= 0x0300 }
 
- { SQLColAttribute defines }
+{ SQLColAttribute defines }
 {$ifdef ODBCVER3}
   SQL_DESC_ARRAY_SIZE	     = 20;
   SQL_DESC_ARRAY_STATUS_PTR  = 21;
@@ -1032,6 +1039,11 @@ const
   SQL_DESC_UPDATABLE         = SQL_COLUMN_UPDATABLE;
 {$endif}
 
+{ SQLColAttributes subdefines for SQL_COLUMN_UPDATABLE }
+  SQL_ATTR_READONLY          = 0;
+  SQL_ATTR_WRITE             = 1;
+  SQL_ATTR_READWRITE_UNKNOWN = 2;
+
 //* SQLEndTran() options */
   SQL_COMMIT    = 0;
   SQL_ROLLBACK  = 1;
@@ -1100,20 +1112,20 @@ type   TSQLNumResultCols=function (StatementHandle:SQLHSTMT;
 type   TSQLDescribeCol=function (StatementHandle:SQLHSTMT;
            ColumnNumber:SQLUSMALLINT;ColumnName:PSQLCHAR;
            BufferLength:SQLSMALLINT;var NameLength:SQLSMALLINT;
-           var DataType:SQLSMALLINT;var ColumnSize:SQLUINTEGER;
+           var DataType:SQLSMALLINT;var ColumnSize:SQLULEN;
            var DecimalDigits:SQLSMALLINT;var Nullable:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLFetchScroll=function (StatementHandle:SQLHSTMT;
-           FetchOrientation:SQLSMALLINT;FetchOffset:SQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           FetchOrientation:SQLSMALLINT;FetchOffset:SQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLExtendedFetch=function (hstmt:SQLHSTMT;
-           fFetchType:SQLUSMALLINT;irow:SQLINTEGER;
-           pcrow:PSQLUINTEGER;rgfRowStatus:PSQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           fFetchType:SQLUSMALLINT;irow:SQLLEN;
+           pcrow:PSQLULEN;rgfRowStatus:PSQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLGetData=function (StatementHandle:SQLHSTMT;
            ColumnNumber:SQLUSMALLINT;TargetType:SQLSMALLINT;
-           TargetValue:SQLPOINTER;BufferLength:SQLINTEGER;
-           StrLen_or_Ind:PSQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           TargetValue:SQLPOINTER;BufferLength:SQLLEN;
+           StrLen_or_Ind:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLSetStmtAttr=function (StatementHandle:SQLHSTMT;
            Attribute:SQLINTEGER;Value:SQLPOINTER;
@@ -1129,8 +1141,8 @@ type   TSQLSetDescField=function (DescriptorHandle:SQLHDESC;
 
 type   TSQLSetDescRec=function (DescriptorHandle:SQLHDESC;
            RecNumber:SQLSMALLINT; DescType, SubType:SQLSMALLINT;
-           Length:SQLINTEGER; Precision, Scale: SQLSMALLINT;
-           DataPtr:SQLPOINTER; StringLengthPtr,IndicatorPtr:PSQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           Length:SQLLEN; Precision, Scale: SQLSMALLINT;
+           DataPtr:SQLPOINTER; StringLengthPtr,IndicatorPtr:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   tSQLGetInfo=function (ConnectionHandle:SQLHDBC;
            InfoType:SQLUSMALLINT;InfoValue:SQLPOINTER;
@@ -1140,16 +1152,16 @@ type   TSQLBulkOperations=function (StatementHandle: SQLHSTMT;
            Operation:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLPutData=function (StatementHandle:SQLHSTMT;
-           Data:SQLPOINTER;StrLen_or_Ind:SQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           Data:SQLPOINTER;StrLen_or_Ind:SQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLBindCol=function (StatementHandle:SQLHSTMT;
            ColumnNumber:SQLUSMALLINT;TargetType:SQLSMALLINT;
-           TargetValue:SQLPOINTER;BufferLength:SQLINTEGER;
-           StrLen_or_Ind:PSQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           TargetValue:SQLPOINTER;BufferLength:SQLLEN;
+           StrLen_or_Ind:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
-type   TSQLSetPos=function (hstmt:SQLHSTMT;
-           irow:SQLUSMALLINT;fOption:SQLUSMALLINT;
-           fLock:SQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+type   TSQLSetPos=function (StatementHandle:SQLHSTMT;
+           RowNumber:SQLSETPOSIROW; Operation:SQLUSMALLINT;
+           LockType:SQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLDataSources=function (EnvironmentHandle:SQLHENV;
            Direction:SQLUSMALLINT;ServerName:PSQLCHAR;
@@ -1175,14 +1187,14 @@ type   TSQLSetCursorName=function (StatementHandle:SQLHSTMT;
            CursorName:PSQLCHAR; NameLength:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLRowCount=function (StatementHandle:SQLHSTMT;
-           Var RowCount:SQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           var RowCount:SQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLBindParameter=function (hstmt:SQLHSTMT;
            ipar:SQLUSMALLINT;fParamType:SQLSMALLINT;
            fCType:SQLSMALLINT;fSqlType:SQLSMALLINT;
-           cbColDef:SQLUINTEGER;ibScale:SQLSMALLINT;
-           rgbValue:SQLPOINTER;cbValueMax:SQLINTEGER;
-           pcbValue:PSQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           cbColDef:SQLULEN;ibScale:SQLSMALLINT;
+           rgbValue:SQLPOINTER;cbValueMax:SQLLEN;
+           pcbValue:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLFreeStmt=function (StatementHandle:SQLHSTMT;
            Option:SQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
@@ -1190,7 +1202,7 @@ type   TSQLFreeStmt=function (StatementHandle:SQLHSTMT;
 type   TSQLColAttribute=function (StatementHandle:SQLHSTMT;
            ColumnNumber:SQLUSMALLINT;FieldIdentifier:SQLUSMALLINT;
            CharacterAttribute:PSQLCHAR;BufferLength:SQLSMALLINT;
-           StringLength:PSQLSMALLINT;NumericAttribute:SQLPOINTER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+           StringLength:PSQLSMALLINT;NumericAttribute:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 type   TSQLEndTran=function (HandleType:SQLSMALLINT;
            Handle:SQLHANDLE;CompletionType:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
@@ -1366,26 +1378,26 @@ var    odbcversion:word;
                BufferLength:SQLSMALLINT;
                var NameLength:SQLSMALLINT;
                var DataType:SQLSMALLINT;
-               var ColumnSize:SQLUINTEGER;
+               var ColumnSize:SQLULEN;
                var DecimalDigits:SQLSMALLINT;
                var Nullable:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLFetchScroll(
                StatementHandle:SQLHSTMT;
                FetchOrientation:SQLSMALLINT;
-               FetchOffset:SQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               FetchOffset:SQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLExtendedFetch(
                hstmt:SQLHSTMT;
                fFetchType:SQLUSMALLINT;
-               irow:SQLINTEGER;
-               pcrow:PSQLUINTEGER;
+               irow:SQLLEN;
+               pcrow:PSQLULEN;
                rgfRowStatus:PSQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLGetData(
                StatementHandle:SQLHSTMT;
                ColumnNumber:SQLUSMALLINT;
                TargetType:SQLSMALLINT;
                TargetValue:SQLPOINTER;
-               BufferLength:SQLINTEGER;
-               StrLen_or_Ind:PSQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               BufferLength:SQLLEN;
+               StrLen_or_Ind:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLSetStmtAttr(
                StatementHandle:SQLHSTMT;
                Attribute:SQLINTEGER;
@@ -1409,19 +1421,19 @@ var    odbcversion:word;
    function SQLPutData(
                StatementHandle:SQLHSTMT;
                Data:SQLPOINTER;
-               StrLen_or_Ind:SQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               StrLen_or_Ind:SQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLBindCol(
                StatementHandle:SQLHSTMT;
                ColumnNumber:SQLUSMALLINT;
                TargetType:SQLSMALLINT;
                TargetValue:SQLPOINTER;
-               BufferLength:SQLINTEGER;
-               StrLen_or_Ind:PSQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               BufferLength:SQLLEN;
+               StrLen_or_Ind:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLSetPos(
-               hstmt:SQLHSTMT;
-               irow:SQLUSMALLINT;
-               fOption:SQLUSMALLINT;
-               fLock:SQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               StatementHandle:SQLHSTMT;
+               RowNumber:SQLSETPOSIROW;
+               Operation:SQLUSMALLINT;
+               LockType:SQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLDataSources(
                EnvironmentHandle:SQLHENV;
                Direction:SQLUSMALLINT;
@@ -1454,18 +1466,18 @@ var    odbcversion:word;
                ):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLRowCount(
                StatementHandle:SQLHSTMT;
-               Var RowCount:SQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               var RowCount:SQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLBindParameter(
                hstmt:SQLHSTMT;
                ipar:SQLUSMALLINT;
                fParamType:SQLSMALLINT;
                fCType:SQLSMALLINT;
                fSqlType:SQLSMALLINT;
-               cbColDef:SQLUINTEGER;
+               cbColDef:SQLULEN;
                ibScale:SQLSMALLINT;
                rgbValue:SQLPOINTER;
-               cbValueMax:SQLINTEGER;
-               pcbValue:PSQLINTEGER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               cbValueMax:SQLLEN;
+               pcbValue:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLFreeStmt(
                StatementHandle:SQLHSTMT;
                Option:SQLUSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
@@ -1476,7 +1488,7 @@ var    odbcversion:word;
                CharacterAttribute:PSQLCHAR;
                BufferLength:SQLSMALLINT;
                StringLength:PSQLSMALLINT;
-               NumericAttribute:SQLPOINTER):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+               NumericAttribute:PSQLLEN):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
 {$ifdef ODBCVER3}
    function SQLEndTran(
                HandleType:SQLSMALLINT;

+ 1 - 0
tests/test/packages/fcl-db/tdb1.pp

@@ -41,5 +41,6 @@ begin
     AssertTrue(PassException);
 
     end;
+  FreeDBConnector;
 end.
 

+ 1 - 0
tests/test/packages/fcl-db/tdb2.pp

@@ -45,4 +45,5 @@ begin
     post;
     AssertTrue(PassException);
     end;
+  FreeDBConnector;
 end.

+ 1 - 0
tests/test/packages/fcl-db/tdb3.pp

@@ -45,6 +45,7 @@ begin
   if DateFloat<>0 then Halt(1);
 
   Db1.Free;
+  DeleteFile('testdatestr.dbf');
 end.
 
 

Some files were not shown because too many files changed in this diff