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;
 end;
 end;
 
 
-procedure TCustomConnection.Close;
+procedure TCustomConnection.Close(ForceClose : Boolean = False);
 begin
 begin
-  Connected := False;
+  try
+    ForcedClose:=ForceClose;
+    Connected := False;
+  finally
+    ForcedClose:=false;
+  end;
 end;
 end;
 
 
 destructor TCustomConnection.Destroy;
 destructor TCustomConnection.Destroy;

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

@@ -1834,7 +1834,7 @@ begin
   FFieldList.GetFieldNames(List);
   FFieldList.GetFieldNames(List);
 end;
 end;
 
 
-Procedure TDataset.GotoBookmark(ABookmark: TBookmark);
+Procedure TDataset.GotoBookmark(const ABookmark: TBookmark);
 
 
 
 
 begin
 begin
@@ -2296,7 +2296,7 @@ begin
     FieldByName(Fieldname).Value := Value;
     FieldByName(Fieldname).Value := Value;
 end;
 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
 begin
   CheckBiDirectional;
   CheckBiDirectional;

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

@@ -1594,14 +1594,14 @@ type
     function GetCurrentRecord(Buffer: TRecordBuffer): Boolean; virtual;
     function GetCurrentRecord(Buffer: TRecordBuffer): Boolean; virtual;
     procedure GetFieldList(List: TList; const FieldNames: string);
     procedure GetFieldList(List: TList; const FieldNames: string);
     procedure GetFieldNames(List: TStrings);
     procedure GetFieldNames(List: TStrings);
-    procedure GotoBookmark(ABookmark: TBookmark);
+    procedure GotoBookmark(const ABookmark: TBookmark);
     procedure Insert;
     procedure Insert;
     procedure InsertRecord(const Values: array of const);
     procedure InsertRecord(const Values: array of const);
     function IsEmpty: Boolean;
     function IsEmpty: Boolean;
     function IsLinkedTo(ADataSource: TDataSource): Boolean;
     function IsLinkedTo(ADataSource: TDataSource): Boolean;
     function IsSequenced: Boolean; virtual;
     function IsSequenced: Boolean; virtual;
     procedure Last;
     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 Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; virtual;
     function MoveBy(Distance: Longint): Longint;
     function MoveBy(Distance: Longint): Longint;
     procedure Next;
     procedure Next;
@@ -1878,6 +1878,7 @@ type
     FAfterDisconnect: TNotifyEvent;
     FAfterDisconnect: TNotifyEvent;
     FBeforeConnect: TNotifyEvent;
     FBeforeConnect: TNotifyEvent;
     FBeforeDisconnect: TNotifyEvent;
     FBeforeDisconnect: TNotifyEvent;
+    FForcedClose: Boolean;
     FLoginPrompt: Boolean;
     FLoginPrompt: Boolean;
     FOnLogin: TLoginEvent;
     FOnLogin: TLoginEvent;
     FStreamedConnected: Boolean;
     FStreamedConnected: Boolean;
@@ -1894,9 +1895,10 @@ type
     procedure InternalHandleException; virtual;
     procedure InternalHandleException; virtual;
     procedure Loaded; override;
     procedure Loaded; override;
     procedure SetConnected (Value : boolean); virtual;
     procedure SetConnected (Value : boolean); virtual;
+    property ForcedClose : Boolean read FForcedClose write FForcedClose;
     property Streamedconnected: Boolean read FStreamedConnected write FStreamedConnected;
     property Streamedconnected: Boolean read FStreamedConnected write FStreamedConnected;
   public
   public
-    procedure Close;
+    procedure Close(ForceClose: Boolean=False);
     destructor Destroy; override;
     destructor Destroy; override;
     procedure Open;
     procedure Open;
     property DataSetCount: Longint read GetDataSetCount;
     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]);
       C.FStatement := stringsreplace(C.FStatement,ParamNames,ParamValues,[rfReplaceAll]);
       end;
       end;
     if mysql_query(FMySQL,Pchar(C.FStatement))<>0 then
     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
     else
       begin
       begin
       C.RowsAffected := mysql_affected_rows(FMYSQL);
       C.RowsAffected := mysql_affected_rows(FMYSQL);
@@ -581,7 +590,17 @@ begin
       repeat
       repeat
         Res:=mysql_store_result(FMySQL); //returns a null pointer also if the statement didn't return a result set
         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
         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
         if Res<>nil then
           begin
           begin
           mysql_free_result(C.FRes);
           mysql_free_result(C.FRes);
@@ -1145,7 +1164,7 @@ end;
 function TConnectionName.Commit(trans: TSQLHandle): boolean;
 function TConnectionName.Commit(trans: TSQLHandle): boolean;
 begin
 begin
   //mysql_commit(FMySQL);
   //mysql_commit(FMySQL);
-  Result := mysql_query(FMySQL, 'COMMIT') = 0;
+  Result := (mysql_query(FMySQL, 'COMMIT') = 0) or ForcedClose;
   if not Result then
   if not Result then
     MySQLError(FMySQL, SErrExecuting, Self);
     MySQLError(FMySQL, SErrExecuting, Self);
 end;
 end;
@@ -1153,7 +1172,7 @@ end;
 function TConnectionName.RollBack(trans: TSQLHandle): boolean;
 function TConnectionName.RollBack(trans: TSQLHandle): boolean;
 begin
 begin
   //mysql_rollback(FMySQL);
   //mysql_rollback(FMySQL);
-  Result := mysql_query(FMySQL, 'ROLLBACK') = 0;
+  Result := (mysql_query(FMySQL, 'ROLLBACK') = 0) or ForcedClose;
   if not Result then
   if not Result then
     MySQLError(FMySQL, SErrExecuting, Self);
     MySQLError(FMySQL, SErrExecuting, Self);
 end;
 end;

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

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

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

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

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

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

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

@@ -88,21 +88,25 @@ var BufDataset  : TPersistentBufDataSet;
 
 
 begin
 begin
   BufDataset := TPersistentBufDataSet.Create(nil);
   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
     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;
     end;
-  BufDataset.TempFileName:=GetTempFileName;
-  BufDataset.FileName:=BufDataset.TempFileName;
-  BufDataset.Close; // Save data into file
   Result := BufDataset;
   Result := BufDataset;
 end;
 end;
 
 
@@ -121,7 +125,6 @@ begin
   with BufDataset do
   with BufDataset do
     begin
     begin
     Name := 'FieldDataset';
     Name := 'FieldDataset';
-    UniDirectional := FUniDirectional;
     FieldDefs.Add('ID',ftInteger);
     FieldDefs.Add('ID',ftInteger);
     FieldDefs.Add('FSTRING',ftString,10);
     FieldDefs.Add('FSTRING',ftString,10);
     FieldDefs.Add('FSMALLINT',ftSmallint);
     FieldDefs.Add('FSMALLINT',ftSmallint);
@@ -162,9 +165,13 @@ begin
       FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
       FieldByName('FFMTBCD').AsBCD := StrToBCD(testFmtBCDValues[i], Self.FormatSettings);
       Post;
       Post;
     end;
     end;
-    BufDataset.TempFileName:=GetTempFileName;
-    BufDataset.FileName:=BufDataset.TempFileName;
+    MergeChangeLog;
+    TempFileName:=GetTempFileName;
+    FileName:=TempFileName;
     Close; // Save data into file
     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;
     end;
   Result := BufDataset;
   Result := BufDataset;
 end;
 end;

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

@@ -2111,6 +2111,7 @@ procedure TTestBufDatasetDBBasics.TestIndexAppendRecord;
 var i: integer;
 var i: integer;
     LastValue: string;
     LastValue: string;
 begin
 begin
+  // start with empty dataset
   with DBConnector.GetNDataset(true,0) as TCustomBufDataset do
   with DBConnector.GetNDataset(true,0) as TCustomBufDataset do
   begin
   begin
     MaxIndexesCount:=4;
     MaxIndexesCount:=4;
@@ -2125,19 +2126,20 @@ begin
     // append data at end
     // append data at end
     for i:=20 downto 0 do
     for i:=20 downto 0 do
       AppendRecord([i, inttostr(i)]);
       AppendRecord([i, inttostr(i)]);
-    First;
     // insert data at begining
     // insert data at begining
+    IndexName:='';
+    First;
     for i:=21 to 22 do
     for i:=21 to 22 do
       InsertRecord([i, inttostr(i)]);
       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 := '';
     LastValue := '';
     First;
     First;
     for i:=22 downto 0 do
     for i:=22 downto 0 do
     begin
     begin
       CheckEquals(23-i, RecNo, 'testindex.RecNo:');
       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;
       LastValue := Fields[1].AsString;
       Next;
       Next;
     end;
     end;

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

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

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

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

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

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

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

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

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