浏览代码

--- Merging r34573 into '.':
U packages/fcl-db/src/sqldb/sqldb.pp
--- Recording mergeinfo for merge of r34573 into '.':
U .
--- Merging r34605 into '.':
U packages/fcl-db/src/sqldb/odbc/odbcconn.pas
--- Recording mergeinfo for merge of r34605 into '.':
G .
--- Merging r34900 into '.':
U packages/fcl-db/src/base/fields.inc
--- Recording mergeinfo for merge of r34900 into '.':
G .
--- Merging r34564 into '.':
U packages/fcl-db/src/base/dsparams.inc
--- Recording mergeinfo for merge of r34564 into '.':
G .
--- Merging r34216 into '.':
U packages/dblib/src/dblib.pp
--- Recording mergeinfo for merge of r34216 into '.':
G .
--- Merging r34094 into '.':
U packages/mysql/src/mysql.inc
--- Recording mergeinfo for merge of r34094 into '.':
G .
--- Merging r34093 into '.':
U packages/fcl-db/tests/sqldbtoolsunit.pas
U packages/fcl-db/tests/toolsunit.pas
--- Recording mergeinfo for merge of r34093 into '.':
G .
--- Merging r34101 into '.':
U packages/fcl-db/tests/testfieldtypes.pas
--- Recording mergeinfo for merge of r34101 into '.':
G .

# revisions: 34573,34605,34900,34564,34216,34094,34093,34101

git-svn-id: branches/fixes_3_0@35345 -

marco 8 年之前
父节点
当前提交
7189e23535

+ 30 - 4
packages/dblib/src/dblib.pp

@@ -22,6 +22,7 @@
                     7.1 - MS SQL Server 2000 (*default*)
                     7.1 - MS SQL Server 2000 (*default*)
                     7.2 - MS SQL Server 2005
                     7.2 - MS SQL Server 2005
                     7.3 - MS SQL Server 2008
                     7.3 - MS SQL Server 2008
+                    7.4 - MS SQL Server 2012/2014
       tds version can be set using env.var. TDSVER or in freetds.conf or .freetds.conf
       tds version can be set using env.var. TDSVER or in freetds.conf or .freetds.conf
 }
 }
 unit dblib;
 unit dblib;
@@ -59,6 +60,7 @@ const
   DBVERSION_71 = 5;
   DBVERSION_71 = 5;
   DBVERSION_72 = 6;
   DBVERSION_72 = 6;
   DBVERSION_73 = 7;
   DBVERSION_73 = 7;
+  DBVERSION_74 = 8;
 
 
   //DBTDS_xxx are returned by DBTDS()
   //DBTDS_xxx are returned by DBTDS()
   DBTDS_UNKNOWN= 0;
   DBTDS_UNKNOWN= 0;
@@ -68,6 +70,7 @@ const
   DBTDS_71     = 9;  // Microsoft SQL Server 2000
   DBTDS_71     = 9;  // Microsoft SQL Server 2000
   DBTDS_72     = 10; // Microsoft SQL Server 2005
   DBTDS_72     = 10; // Microsoft SQL Server 2005
   DBTDS_73     = 11; // Microsoft SQL Server 2008
   DBTDS_73     = 11; // Microsoft SQL Server 2008
+  DBTDS_74     = 12; // Microsoft SQL Server 2012/2014
 
 
   //from sqlfront.h , sybdb.h for FreeTDS
   //from sqlfront.h , sybdb.h for FreeTDS
   DBSETHOST=1;
   DBSETHOST=1;
@@ -102,6 +105,9 @@ const
   DBANSItoOEM  = 14;
   DBANSItoOEM  = 14;
   DBOEMtoANSI  = 15;
   DBOEMtoANSI  = 15;
   DBQUOTEDIDENT= {$IFDEF freetds}35{$ELSE}18{$ENDIF};
   DBQUOTEDIDENT= {$IFDEF freetds}35{$ELSE}18{$ENDIF};
+  // settings from here are purely FreeTDS extensions:
+  DBSETUTF16   = 1001;
+  DBSETNTLMV2  = 1002;
 
 
   TIMEOUT_IGNORE=-1;
   TIMEOUT_IGNORE=-1;
   TIMEOUT_INFINITE=0;
   TIMEOUT_INFINITE=0;
@@ -195,6 +201,9 @@ type
   DBSMALLINT=smallint;   // 16-bit int (short)
   DBSMALLINT=smallint;   // 16-bit int (short)
   DBUSMALLINT=word;      // 16-bit unsigned int (unsigned short)
   DBUSMALLINT=word;      // 16-bit unsigned int (unsigned short)
   DBINT=longint;         // 32-bit int (int)
   DBINT=longint;         // 32-bit int (int)
+  DBUINT=longword;       // 32-bit unsigned int
+  DBBIGINT=int64;        // 64-bit integer
+  DBUBIGINT=qword;       // 64-bit unsigned
   DBFLT8=double;         // 64-bit real (double)
   DBFLT8=double;         // 64-bit real (double)
   DBBINARY=byte;
   DBBINARY=byte;
 
 
@@ -206,9 +215,9 @@ type
   PDBDATETIME=^DBDATETIME;
   PDBDATETIME=^DBDATETIME;
 
 
   DBDATETIMEALL=record
   DBDATETIMEALL=record
-    time: qword;         // time, 7 digit precision (64-bit unsigned)
-    date: longint;       // date, 0 = 1900-01-01 (32-bit int)
-    offset: smallint;    // time offset (16-bit int)
+    time: DBUBIGINT;     // time, 7 digit precision (64-bit unsigned)
+    date: DBINT;         // date, 0 = 1900-01-01 (32-bit int)
+    offset: DBSMALLINT;  // time offset (16-bit int)
     info: word;          // unsigned short time_prec:3;
     info: word;          // unsigned short time_prec:3;
                          // unsigned short _res:10;
                          // unsigned short _res:10;
                          // unsigned short has_time:1;
                          // unsigned short has_time:1;
@@ -249,11 +258,27 @@ type
       minute: INT;      // 0 - 59
       minute: INT;      // 0 - 59
       second: INT;      // 0 - 59
       second: INT;      // 0 - 59
       millisecond: INT; // 0 - 999
       millisecond: INT; // 0 - 999
-      tzone: INT;       // 0 - 127 (Sybase only!)
+      tzone: INT;       // -840 - 840
     );
     );
   end;
   end;
   PDBDATEREC=^DBDATEREC;
   PDBDATEREC=^DBDATEREC;
 
 
+  DBDATEREC2 = record
+    year: DBINT;        // 1753 - 9999
+    quarter: DBINT;     // 1 - 4
+    month: DBINT;       // 1 - 12
+    day: DBINT;         // 1 - 31
+    dayofyear: DBINT;   // 1 - 366
+    week: DBINT;        // 1 - 54 (for leap years)
+    weekday: DBINT;     // 1 - 7 (Mon. - Sun.)
+    hour: DBINT;        // 0 - 23
+    minute: DBINT;      // 0 - 59
+    second: DBINT;      // 0 - 59
+    nanosecond: DBINT;  // 0 - 999999999
+    tzone: DBINT;       // 0 - 127  (Sybase only)
+  end;
+  PDBDATEREC2=^DBDATEREC2;
+
   DBMONEY=record
   DBMONEY=record
     mnyhigh: DBINT;
     mnyhigh: DBINT;
     mnylow: ULONG;
     mnylow: ULONG;
@@ -396,6 +421,7 @@ var
   {$ENDIF}
   {$ENDIF}
   {$IFDEF freetds}
   {$IFDEF freetds}
   tdsdbopen: function(login:PLOGINREC; servername:PAnsiChar; msdblib:INT):PDBPROCESS; cdecl;
   tdsdbopen: function(login:PLOGINREC; servername:PAnsiChar; msdblib:INT):PDBPROCESS; cdecl;
+  dbanydatecrack: function(dbproc:PDBPROCESS; di: PDBDATEREC2; typ: INT; data: pointer):RETCODE; cdecl;
   dbtablecolinfo: function(dbproc:PDBPROCESS; column:DBINT; dbcol:PDBCOL):RETCODE; cdecl;
   dbtablecolinfo: function(dbproc:PDBPROCESS; column:DBINT; dbcol:PDBCOL):RETCODE; cdecl;
   dbtds: function(dbproc:PDBPROCESS):INT; cdecl;
   dbtds: function(dbproc:PDBPROCESS):INT; cdecl;
   dbsetlversion: function(login:PLOGINREC; version:BYTE):RETCODE; cdecl;
   dbsetlversion: function(login:PLOGINREC; version:BYTE):RETCODE; cdecl;

+ 1 - 1
packages/fcl-db/src/base/dsparams.inc

@@ -1096,8 +1096,8 @@ begin
     Position:=0;
     Position:=0;
     SetLength(Temp,Size);
     SetLength(Temp,Size);
     ReadBuffer(Pointer(Temp)^,Size);
     ReadBuffer(Pointer(Temp)^,Size);
-    FValue:=Temp;
     end;
     end;
+  Value:=Temp;
 end;
 end;
 
 
 Procedure TParam.SetBlobData(Buffer: Pointer; ASize: Integer);
 Procedure TParam.SetBlobData(Buffer: Pointer; ASize: Integer);

+ 4 - 3
packages/fcl-db/src/base/fields.inc

@@ -1481,12 +1481,13 @@ var L : Longint;
     P : PLongint;
     P : PLongint;
 
 
 begin
 begin
+  L:=0;
   P:=@L;
   P:=@L;
   Result:=GetData(P);
   Result:=GetData(P);
   If Result then
   If Result then
-    Case Datatype of
-      ftInteger,ftAutoinc  : AValue:=Plongint(P)^;
-      ftWord               : AValue:=Pword(P)^;
+    Case DataType of
+      ftInteger,ftAutoInc  : AValue:=PLongint(P)^;
+      ftWord               : AValue:=PWord(P)^;
       ftSmallint           : AValue:=PSmallint(P)^;
       ftSmallint           : AValue:=PSmallint(P)^;
     end;
     end;
 end;
 end;

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

@@ -298,7 +298,7 @@ end;
 constructor TODBCConnection.Create(AOwner: TComponent);
 constructor TODBCConnection.Create(AOwner: TComponent);
 begin
 begin
   inherited Create(AOwner);
   inherited Create(AOwner);
-  FConnOptions := FConnOptions + [sqEscapeRepeat] + [sqEscapeSlash];
+  FConnOptions := FConnOptions + [sqSupportEmptyDatabaseName, sqEscapeRepeat, sqEscapeSlash];
 end;
 end;
 
 
 function TODBCConnection.StrToStatementType(s : string) : TStatementType;
 function TODBCConnection.StrToStatementType(s : string) : TStatementType;

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

@@ -1670,7 +1670,7 @@ Var
   P : TParam;
   P : TParam;
 
 
 begin
 begin
-  if not LogEvent(detParamValue) then
+  if not LogEvent(detParamValue) or not Assigned(AParams) then
     Exit;
     Exit;
   For P in AParams do
   For P in AParams do
     begin
     begin

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

@@ -196,6 +196,7 @@ begin
     UserName := dbuser;
     UserName := dbuser;
     Password := dbpassword;
     Password := dbpassword;
     HostName := dbhostname;
     HostName := dbhostname;
+    CharSet := dbcharset;
     if dblogfilename<>'' then
     if dblogfilename<>'' then
     begin
     begin
       LogEvents:=[detCustom,detCommit,detExecute,detRollBack];
       LogEvents:=[detCustom,detCommit,detExecute,detRollBack];

+ 3 - 3
packages/fcl-db/tests/testfieldtypes.pas

@@ -2181,12 +2181,12 @@ end;
 
 
 procedure TTestFieldTypes.TestTableNames;
 procedure TTestFieldTypes.TestTableNames;
 var TableList : TStringList;
 var TableList : TStringList;
-    i         : integer;
+
 begin
 begin
   TableList := TStringList.Create;
   TableList := TStringList.Create;
   try
   try
     TSQLDBConnector(DBConnector).Connection.GetTableNames(TableList);
     TSQLDBConnector(DBConnector).Connection.GetTableNames(TableList);
-    AssertTrue(TableList.Find('fpdev',i));
+    AssertTrue(TableList.IndexOf('fpdev')<>-1);
   finally
   finally
     TableList.Free;
     TableList.Free;
   end;
   end;
@@ -2216,7 +2216,7 @@ begin
   FieldList := TStringList.Create;
   FieldList := TStringList.Create;
   try
   try
     TSQLDBConnector(DBConnector).Connection.GetFieldNames('fpdev',FieldList);
     TSQLDBConnector(DBConnector).Connection.GetFieldNames('fpdev',FieldList);
-    AssertTrue(FieldList.Find('id',i));
+    AssertTrue(FieldList.IndexOf('id')<>-1);
   finally
   finally
     FieldList.Free;
     FieldList.Free;
   end;
   end;

+ 5 - 3
packages/fcl-db/tests/toolsunit.pas

@@ -224,6 +224,7 @@ var dbtype,
     dbuser,
     dbuser,
     dbhostname,
     dbhostname,
     dbpassword,
     dbpassword,
+    dbcharset,
     dblogfilename,
     dblogfilename,
     dbQuoteChars   : string;
     dbQuoteChars   : string;
     dblogfile      : TextFile;
     dblogfile      : TextFile;
@@ -476,17 +477,18 @@ procedure ReadIniFile;
 var IniFile : TIniFile;
 var IniFile : TIniFile;
 
 
 begin
 begin
-  IniFile := TIniFile.Create(getcurrentdir + PathDelim + 'database.ini');
+  IniFile := TIniFile.Create(GetCurrentDir + PathDelim + 'database.ini');
   dbtype:='';
   dbtype:='';
-  if Paramcount>0 then
+  if ParamCount>0 then
     dbtype := ParamStr(1);
     dbtype := ParamStr(1);
-  if (dbtype='') or not inifile.SectionExists(dbtype) then
+  if (dbtype='') or not IniFile.SectionExists(dbtype) then
     dbtype := IniFile.ReadString('Database','Type','');
     dbtype := IniFile.ReadString('Database','Type','');
   dbconnectorname := IniFile.ReadString(dbtype,'Connector','');
   dbconnectorname := IniFile.ReadString(dbtype,'Connector','');
   dbname := IniFile.ReadString(dbtype,'Name','');
   dbname := IniFile.ReadString(dbtype,'Name','');
   dbuser := IniFile.ReadString(dbtype,'User','');
   dbuser := IniFile.ReadString(dbtype,'User','');
   dbhostname := IniFile.ReadString(dbtype,'Hostname','');
   dbhostname := IniFile.ReadString(dbtype,'Hostname','');
   dbpassword := IniFile.ReadString(dbtype,'Password','');
   dbpassword := IniFile.ReadString(dbtype,'Password','');
+  dbcharset := IniFile.ReadString(dbtype,'CharSet','');
   dbconnectorparams := IniFile.ReadString(dbtype,'ConnectorParams','');
   dbconnectorparams := IniFile.ReadString(dbtype,'ConnectorParams','');
   dblogfilename := IniFile.ReadString(dbtype,'LogFile','');
   dblogfilename := IniFile.ReadString(dbtype,'LogFile','');
   dbquotechars := IniFile.ReadString(dbtype,'QuoteChars','"');
   dbquotechars := IniFile.ReadString(dbtype,'QuoteChars','"');

+ 10 - 4
packages/mysql/src/mysql.inc

@@ -1871,6 +1871,7 @@ begin
     pointer(mysql_affected_rows) := GetProcedureAddress(MysqlLibraryHandle,'mysql_affected_rows');
     pointer(mysql_affected_rows) := GetProcedureAddress(MysqlLibraryHandle,'mysql_affected_rows');
     pointer(mysql_autocommit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_autocommit');
     pointer(mysql_autocommit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_autocommit');
     pointer(mysql_change_user) := GetProcedureAddress(MysqlLibraryHandle,'mysql_change_user');
     pointer(mysql_change_user) := GetProcedureAddress(MysqlLibraryHandle,'mysql_change_user');
+    pointer(mysql_character_set_name) := GetProcedureAddress(MysqlLibraryHandle,'mysql_character_set_name');
     pointer(mysql_close) := GetProcedureAddress(MysqlLibraryHandle,'mysql_close');
     pointer(mysql_close) := GetProcedureAddress(MysqlLibraryHandle,'mysql_close');
     pointer(mysql_commit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_commit');
     pointer(mysql_commit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_commit');
     pointer(mysql_data_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_data_seek');
     pointer(mysql_data_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_data_seek');
@@ -1889,6 +1890,9 @@ begin
     pointer(mysql_field_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_field_count');
     pointer(mysql_field_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_field_count');
     pointer(mysql_field_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_field_tell');
     pointer(mysql_field_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_field_tell');
     pointer(mysql_free_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_free_result');
     pointer(mysql_free_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_free_result');
+{$IFDEF mysql50}
+    pointer(mysql_get_character_set_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_character_set_info');
+{$ENDIF}
     pointer(mysql_get_client_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_client_info');
     pointer(mysql_get_client_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_client_info');
     pointer(mysql_get_client_version) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_client_version');
     pointer(mysql_get_client_version) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_client_version');
     pointer(mysql_get_host_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_host_info');
     pointer(mysql_get_host_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_get_host_info');
@@ -1914,8 +1918,14 @@ begin
     pointer(mysql_query) := GetProcedureAddress(MysqlLibraryHandle,'mysql_query');
     pointer(mysql_query) := GetProcedureAddress(MysqlLibraryHandle,'mysql_query');
     pointer(mysql_real_connect) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_connect');
     pointer(mysql_real_connect) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_connect');
     pointer(mysql_real_escape_string) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_escape_string');
     pointer(mysql_real_escape_string) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_escape_string');
+{$IFDEF mysql57}
+    pointer(mysql_real_escape_string_quote) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_escape_string_quote');
+{$ENDIF}
     pointer(mysql_real_query) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_query');
     pointer(mysql_real_query) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_query');
     pointer(mysql_refresh) := GetProcedureAddress(MysqlLibraryHandle,'mysql_refresh');
     pointer(mysql_refresh) := GetProcedureAddress(MysqlLibraryHandle,'mysql_refresh');
+{$IFDEF mysql57}
+    pointer(mysql_reset_connection) := GetProcedureAddress(MysqlLibraryHandle,'mysql_reset_connection');
+{$ENDIF}
     pointer(mysql_rollback) := GetProcedureAddress(MysqlLibraryHandle,'mysql_rollback');
     pointer(mysql_rollback) := GetProcedureAddress(MysqlLibraryHandle,'mysql_rollback');
     pointer(mysql_row_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_seek');
     pointer(mysql_row_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_seek');
     pointer(mysql_row_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_tell');
     pointer(mysql_row_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_tell');
@@ -1959,10 +1969,6 @@ begin
     pointer(mysql_stmt_insert_id) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_insert_id');
     pointer(mysql_stmt_insert_id) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_insert_id');
     pointer(mysql_stmt_field_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_field_count');
     pointer(mysql_stmt_field_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_field_count');
     pointer(mysql_stmt_next_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_next_result');
     pointer(mysql_stmt_next_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_next_result');
-{$IFDEF mysql57}
-    pointer(mysql_real_escape_string_quote) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_escape_string_quote');
-    pointer(mysql_reset_connection) := GetProcedureAddress(MysqlLibraryHandle,'mysql_reset_connection');
-{$ENDIF}
 
 
     if mysql_library_init(argc, argv, groups) <> 0 then
     if mysql_library_init(argc, argv, groups) <> 0 then
       Exit;
       Exit;