Browse Source

* Added MySQL 5.7 header translation from Laco (bug ID 28417)

git-svn-id: trunk@31218 -
michael 10 years ago
parent
commit
4442ecc863
4 changed files with 107 additions and 39 deletions
  1. 1 0
      .gitattributes
  2. 7 0
      packages/mysql/fpmake.pp
  3. 87 39
      packages/mysql/src/mysql.inc
  4. 12 0
      packages/mysql/src/mysql57dyn.pp

+ 1 - 0
.gitattributes

@@ -5819,6 +5819,7 @@ packages/mysql/src/mysql51emb.pp svneol=native#text/plain
 packages/mysql/src/mysql55.pp svneol=native#text/plain
 packages/mysql/src/mysql55dyn.pp svneol=native#text/plain
 packages/mysql/src/mysql56dyn.pp svneol=native#text/plain
+packages/mysql/src/mysql57dyn.pp svneol=native#text/plain
 packages/ncurses/Makefile svneol=native#text/plain
 packages/ncurses/Makefile.fpc svneol=native#text/plain
 packages/ncurses/Makefile.fpc.fpcmake svneol=native#text/plain

+ 7 - 0
packages/mysql/fpmake.pp

@@ -141,6 +141,13 @@ begin
         end;
     T.ResourceStrings := True;
 
+    T:=P.Targets.AddUnit('mysql57dyn.pp');
+      with T.Dependencies do
+        begin
+          AddInclude('mysql.inc');
+        end;
+    T.ResourceStrings := True;
+
     P.ExamplePath.Add('examples');
     P.Targets.AddExampleProgram('testdb3.pp');
     P.Targets.AddExampleProgram('testdb4.pp');

+ 87 - 39
packages/mysql/src/mysql.inc

@@ -23,15 +23,17 @@ interface
 {$ifdef Load_Dynamically}{$define LinkDynamically}{$endif}
 uses
 {$IFDEF LinkDynamically}
-      sysutils,
+     sysutils,
 {$ENDIF}
-     dynlibs,ctypes;
+     ctypes, dynlibs;
 
 {$IFDEF Unix}
   {$DEFINE extdecl:=cdecl}
   const
     mysqllib = 'libmysqlclient.'+sharedsuffix;
-  {$IF DEFINED(mysql55) or DEFINED(mysql56)}
+  {$IF DEFINED(mysql57)}
+    mysqlvlib = mysqllib+'.20';
+  {$ELSEIF DEFINED(mysql55) or DEFINED(mysql56)}
     mysqlvlib = mysqllib+'.18';
   {$ELSEIF DEFINED(mysql51)}
     mysqlvlib = mysqllib+'.16';
@@ -51,6 +53,10 @@ uses
 {$ENDIF}
 
 
+{$IFDEF mysql57}
+  {$DEFINE mysql56}
+{$ENDIF mysql57}
+
 {$IFDEF mysql56}
   {$DEFINE mysql55}
 {$ENDIF mysql56}
@@ -88,8 +94,8 @@ uses
     type
        my_bool = cchar;
        Pmy_bool  = ^my_bool;
-//       pppchar = ^ppchar;
-//       ppbyte = ^pbyte;
+       ppcchar = ^pcchar;
+       psize_t = pointer;
 
        PVIO = Pointer;
 
@@ -111,6 +117,7 @@ uses
      HOSTNAME_LENGTH = 60;
 {$IFDEF mysql51}
      SYSTEM_CHARSET_MBMAXLEN = 3;
+     FILENAME_CHARSET_MBMAXLEN = 5;
      NAME_CHAR_LEN = 64;              // Field/table name length
      USERNAME_CHAR_LENGTH = 16;
      NAME_LEN = (NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN);
@@ -133,6 +140,12 @@ uses
      INDEX_COMMENT_MAXLEN = 1024;
      TABLE_PARTITION_COMMENT_MAXLEN = 1024;
 
+  { Maximum length of protocol packet. }
+  { OK packet length limit also restricted to this value as any length greater
+    than this value will have first byte of OK packet to be 254 thus does not
+    provide a means to identify if this is OK or EOF packet. }
+     MAX_PACKET_LENGTH = (256*256*256-1);
+
   const
      MYSQL_NAMEDPIPE = 'MySQL';
      MYSQL_SERVICENAME = 'MySQL';
@@ -152,6 +165,9 @@ uses
        COM_DAEMON,
   {$IFDEF mysql56}
        COM_BINLOG_DUMP_GTID,
+   {$IFDEF mysql57}
+       COM_RESET_CONNECTION,
+   {$ENDIF}
   {$ENDIF}
  {$ENDIF}
 {$ELSE}
@@ -160,6 +176,7 @@ uses
        COM_RESET_STMT,COM_SET_OPTION,
   {$ENDIF}
 {$ENDIF}
+       { Must be last }
        COM_END
        );
 
@@ -217,6 +234,9 @@ uses
        FIELD_FLAGS_COLUMN_FORMAT_MASK = (3 shl FIELD_FLAGS_COLUMN_FORMAT);
   {$IFDEF mysql56}
        FIELD_IS_DROPPED = (1 shl 26);         // Intern: Field is being dropped
+   {$IFDEF mysql57}
+       EXPLICIT_NULL_FLAG = (1 shl 27);       // Field is explicitly specified as NULL by the user
+   {$ENDIF}
   {$ENDIF}
  {$ENDIF}
 {$ENDIF}
@@ -245,6 +265,7 @@ uses
        REFRESH_DES_KEY_FILE = $40000;
        REFRESH_USER_RESOURCES = $80000;
        REFRESH_FOR_EXPORT = $100000;       // FLUSH TABLES ... FOR EXPORT
+       REFRESH_OPTIMIZER_COSTS = $200000;  // FLUSH OPTIMIZER_COSTS
 
        CLIENT_LONG_PASSWORD = 1;           // new more secure passwords
        CLIENT_FOUND_ROWS = 2;              // Found instead of affected rows
@@ -261,7 +282,7 @@ uses
        CLIENT_IGNORE_SIGPIPE = 4096;       // IGNORE sigpipes
        CLIENT_TRANSACTIONS = 8192;         // Client knows about transactions
        CLIENT_RESERVED = 16384;            // Old flag for 4.1 protocol
-       CLIENT_SECURE_CONNECTION = 32768;   // New 4.1 authentication
+       CLIENT_SECURE_CONNECTION = 32768;   // Old flag for 4.1 authentication
        CLIENT_MULTI_STATEMENTS = 65536;    // Enable/disable multi-stmt support
        CLIENT_MULTI_RESULTS = 131072;      // Enable/disable multi-results
        CLIENT_PS_MULTI_RESULTS : cardinal = 1 shl 18; // Multi-results in PS-protocol
@@ -269,6 +290,8 @@ uses
        CLIENT_CONNECT_ATTRS : cardinal = (1 shl 20);  // Client supports connection attributes
        CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA : cardinal = (1 shl 21);  // Enable authentication response packet to be larger than 255 bytes.
        CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS : cardinal = (1 shl 22);    // Don't close the connection for a connection with expired password.
+       CLIENT_SESSION_TRACK : cardinal = (1 shl 23);  // Capable of handling server state change information. Its a hint to the server to include the state change information in Ok packet.
+       CLIENT_DEPRECATE_EOF : cardinal = (1 shl 24);  // Client no longer needs EOF packet
        CLIENT_SSL_VERIFY_SERVER_CERT : cardinal = 1 shl 30;
        CLIENT_REMEMBER_OPTIONS : cardinal = 1 shl 31;
 
@@ -294,21 +317,24 @@ uses
        SERVER_STATUS_DB_DROPPED = 256;     // A database was dropped
 {$IFDEF mysql50}
        SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512;
-{$ENDIF}
-{$IFDEF mysql51}
+ {$IFDEF mysql51}
     {
       Sent to the client if after a prepared statement reprepare
       we discovered that the new statement returns a different
       number of result set columns.
     }
        SERVER_STATUS_METADATA_CHANGED = 1024;
-{$ENDIF}
-{$IFDEF mysql55}
+  {$IFDEF mysql55}
        SERVER_QUERY_WAS_SLOW = 2048;
        SERVER_PS_OUT_PARAMS = 4096; // To mark ResultSet containing output parameter values.
-{$ENDIF}
-{$IFDEF mysql56}
+   {$IFDEF mysql56}
        SERVER_STATUS_IN_TRANS_READONLY = 8192;
+    {$IFDEF mysql57}
+       SERVER_SESSION_STATE_CHANGED = (1 shl 14); // This status flag, when on, implies that one of the state information has changed on the server because of the execution of the last statement.
+    {$ENDIF}
+   {$ENDIF}
+  {$ENDIF}
+ {$ENDIF}
 {$ENDIF}
 
 {$IFDEF mysql41}
@@ -340,7 +366,6 @@ uses
     type
        Pst_net = ^st_net;
        st_net = record
-{ $if !defined(CHECK_EMBEDDED_DIFFERENCES) || !defined(EMBEDDED_LIBRARY) }
             vio : PVio;
             buff : pcuchar;
             buff_end : pcuchar;
@@ -365,7 +390,6 @@ uses
             unused3: my_bool;  // Please remove with the next incompatible ABI change
             { Pointer to query object in query cache, do not equal NULL (0) for
               queries in cache that have not stored its results yet }
-{ $endif }
             unused: pcuchar;
             last_errno: cuint;
             error: cuchar;
@@ -531,6 +555,24 @@ uses
          MYSQL_OPTION_MULTI_STATEMENTS_OFF
          );
 
+{$IFDEF mysql57}
+    { Type of state change information that the server can include in the Ok
+      packet.
+      Note : 1) session_state_type shouldn't go past 255 (i.e. 1-byte boundary).
+             2) Modify the definition of SESSION_TRACK_END when a new member is added.
+    }
+       enum_session_state_type = (
+         SESSION_TRACK_SYSTEM_VARIABLES, // Session system variables
+         SESSION_TRACK_SCHEMA,           // Current schema
+         SESSION_TRACK_STATE_CHANGE,     // track session state changes
+         SESSION_TRACK_GTIDS
+       );
+
+    const
+       SESSION_TRACK_BEGIN = ord(SESSION_TRACK_SYSTEM_VARIABLES);
+       SESSION_TRACK_END = ord(SESSION_TRACK_GTIDS);
+{$ENDIF}
+
     function net_new_transaction(net : st_net) : st_net;
 
 {$IFNDEF LinkDynamically}
@@ -721,10 +763,6 @@ uses
          CLIENT_NET_READ_TIMEOUT = 365*24*3600;     // Timeout on read
          CLIENT_NET_WRITE_TIMEOUT = 365*24*3600;    // Timeout on write
       
-{$ifdef NETWARE}
-(** unsupported pragma#pragma pack(push, 8)		/* 8 byte alignment */*)
-{$endif}
-
     type
        Pst_mysql_field = ^st_mysql_field;
        st_mysql_field = record
@@ -892,6 +930,9 @@ uses
          ,MYSQL_SERVER_PUBLIC_KEY
          ,MYSQL_ENABLE_CLEARTEXT_PLUGIN
          ,MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS
+    {$IFDEF mysql57}
+         ,MYSQL_OPT_SSL_ENFORCE
+    {$ENDIF}
    {$ENDIF}
   {$ENDIF}
  {$ENDIF}
@@ -1510,6 +1551,13 @@ uses
     function mysql_real_query(mysql:PMYSQL; q:Pchar; length:culong):cint;extdecl;external mysqllib name 'mysql_real_query';
     function mysql_store_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_store_result';
     function mysql_use_result(mysql:PMYSQL):PMYSQL_RES;extdecl;external mysqllib name 'mysql_use_result';
+ {$IFDEF mysql50}
+    procedure mysql_get_character_set_info(mysql:PMYSQL; charset:PMY_CHARSET_INFO);extdecl;external mysqllib name 'mysql_get_character_set_info';
+  {$IFDEF mysql57}
+    function mysql_session_track_get_first(mysql:PMYSQL; typ:enum_session_state_type; data:ppcchar; length:psize_t):cint; extdecl; external mysqllib name 'mysql_session_track_get_first';
+    function mysql_session_track_get_next(mysql:PMYSQL; typ:enum_session_state_type; data:ppcchar; length:psize_t):cint; extdecl; external mysqllib name 'mysql_session_track_get_next';
+  {$ENDIF}
+ {$ENDIF}
 
 {$ELSE}
 
@@ -1548,6 +1596,14 @@ uses
       mysql_real_query: function (mysql:PMYSQL; q:Pchar; length:culong):cint;extdecl;
       mysql_store_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
       mysql_use_result: function (mysql:PMYSQL):PMYSQL_RES;extdecl;
+ {$IFDEF mysql50}
+      mysql_get_character_set_info: procedure(mysql:PMYSQL; charset:PMY_CHARSET_INFO);extdecl;
+  {$IFDEF mysql57}
+      mysql_session_track_get_first: function(mysql:PMYSQL; typ:enum_session_state_type; data:ppcchar; length:psize_t):cint; extdecl;
+      mysql_session_track_get_next: function(mysql:PMYSQL; typ:enum_session_state_type; data:ppcchar; length:psize_t):cint; extdecl;
+  {$ENDIF}
+ {$ENDIF}
+
 {$ENDIF}
 
 {$IFNDEF LinkDynamically}
@@ -1558,9 +1614,6 @@ uses
     { perform query on slave  }
     function mysql_slave_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_slave_query';
     function mysql_slave_send_query(mysql:PMYSQL; q:Pchar; length:culong):my_bool;extdecl;external mysqllib name 'mysql_slave_send_query';
-{$IFDEF mysql50}
-    procedure mysql_get_character_set_info(mysql : PMYSQL; charset : PMY_CHARSET_INFO);extdecl;external mysqllib name 'mysql_get_character_set_info';
-{$ENDIF}
 {$ENDIF}
 
     { local infile support  }
@@ -1696,6 +1749,9 @@ uses
       mysql_options: function (mysql:PMYSQL; option:mysql_option; arg:Pchar):cint;extdecl;
 {$IFDEF mysql56}
       mysql_options4: function (mysql:PMYSQL; option:mysql_option; arg1,arg2:Pointer):cint;extdecl;
+ {$IFDEF mysql57}
+      mysql_get_option: function (mysql:PMYSQL; option:mysql_option; arg:Pointer):cint;extdecl;
+ {$ENDIF}
 {$ENDIF}
       mysql_free_result: procedure (result:PMYSQL_RES);extdecl;
       mysql_data_seek: procedure (result:PMYSQL_RES; offset:my_ulonglong);extdecl;
@@ -1708,6 +1764,10 @@ uses
       mysql_escape_string: function (fto:Pchar; from:Pchar; from_length:culong):culong;extdecl;
       mysql_hex_string: function (fto:Pchar; from:Pchar; from_length:culong):culong;extdecl;
       mysql_real_escape_string: function (mysql:PMYSQL; fto:Pchar; from:Pchar; length:culong):culong;extdecl;
+{$IFDEF mysql57}
+      mysql_real_escape_string_quote: function(mysql:PMYSQL; fto:pcchar; from:pcchar; length:culong; quote: cchar):culong;extdecl;
+      mysql_reset_connection: function(mysql:PMYSQL):cint;extdecl;
+{$ENDIF}
       mysql_debug: procedure (debug:Pchar);extdecl;
 
       mysql_rollback: function (mysql:PMYSQL):my_bool;extdecl;
@@ -1757,16 +1817,8 @@ uses
 
     function mysql_reload(mysql : PMySQL) : cint;
 
-{$IFNDEF LinkDynamically}
-{$ifdef USE_OLD_FUNCTIONS}
-    function mysql_connect(mysql:PMYSQL; host:Pchar; user:Pchar; passwd:Pchar):PMYSQL;extdecl;external External_library name 'mysql_connect';
-    function mysql_create_db(mysql:PMYSQL; DB:Pchar):cint;extdecl;external External_library name 'mysql_create_db';
-    function mysql_drop_db(mysql:PMYSQL; DB:Pchar):cint;extdecl;external External_library name 'mysql_drop_db';
-    function mysql_reload(mysql : PMySQL) : cint;
-{$endif}
-{$endif}
+{$define HAVE_MYSQL_REAL_CONNECT}
 
-{$define HAVE_MYSQL_REAL_CONNECT}    
     { The following functions are mainly exported because of mysqlbinlog;
       They are not for general usage     }
 
@@ -1775,9 +1827,6 @@ uses
     function net_safe_read(mysql:PMYSQL):cuint;cdecl;external mysqllib name 'net_safe_read';
 {$ENDIF}
 
-{$ifdef NETWARE}
-(** unsupported pragma#pragma pack(pop)		/* restore alignment */*)
-{$endif}
 
 {$IFDEF LinkDynamically}
 Function InitialiseMysql(Const LibraryName : AnsiString) : Integer;
@@ -1812,6 +1861,7 @@ begin
       Exit;
     Inc(RefCount);
     MysqlLoadedLibrary:=LibraryName;
+
 // Only the procedure that are given in the c-library documentation are loaded, to
 // avoid problems with 'incomplete' libraries
     pointer(my_init) := GetProcedureAddress(MysqlLibraryHandle,'my_init');
@@ -1821,13 +1871,9 @@ begin
     pointer(mysql_affected_rows) := GetProcedureAddress(MysqlLibraryHandle,'mysql_affected_rows');
     pointer(mysql_autocommit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_autocommit');
     pointer(mysql_change_user) := GetProcedureAddress(MysqlLibraryHandle,'mysql_change_user');
-//    pointer(mysql_charset_name) := GetProcedureAddress(MysqlLibraryHandle,'mysql_charset_name');
     pointer(mysql_close) := GetProcedureAddress(MysqlLibraryHandle,'mysql_close');
     pointer(mysql_commit) := GetProcedureAddress(MysqlLibraryHandle,'mysql_commit');
-//    pointer(mysql_connect) := GetProcedureAddress(MysqlLibraryHandle,'mysql_connect');
-//    pointer(mysql_create_db) := GetProcedureAddress(MysqlLibraryHandle,'mysql_create_db');
     pointer(mysql_data_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_data_seek');
-//    pointer(mysql_drop_db) := GetProcedureAddress(MysqlLibraryHandle,'mysql_drop_db');
     pointer(mysql_debug) := GetProcedureAddress(MysqlLibraryHandle,'mysql_debug');
     pointer(mysql_dump_debug_info) := GetProcedureAddress(MysqlLibraryHandle,'mysql_dump_debug_info');
     pointer(mysql_eof) := GetProcedureAddress(MysqlLibraryHandle,'mysql_eof');
@@ -1870,7 +1916,6 @@ begin
     pointer(mysql_real_escape_string) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_escape_string');
     pointer(mysql_real_query) := GetProcedureAddress(MysqlLibraryHandle,'mysql_real_query');
     pointer(mysql_refresh) := GetProcedureAddress(MysqlLibraryHandle,'mysql_refresh');
-//    pointer(mysql_reload) := GetProcedureAddress(MysqlLibraryHandle,'mysql_reload');
     pointer(mysql_rollback) := GetProcedureAddress(MysqlLibraryHandle,'mysql_rollback');
     pointer(mysql_row_seek) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_seek');
     pointer(mysql_row_tell) := GetProcedureAddress(MysqlLibraryHandle,'mysql_row_tell');
@@ -1884,7 +1929,6 @@ begin
     pointer(mysql_stat) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stat');
     pointer(mysql_store_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_store_result');
     pointer(mysql_thread_id) := GetProcedureAddress(MysqlLibraryHandle,'mysql_thread_id');
-//    pointer(mysql_thread_save) := GetProcedureAddress(MysqlLibraryHandle,'mysql_thread_save');
     pointer(mysql_use_result) := GetProcedureAddress(MysqlLibraryHandle,'mysql_use_result');
     pointer(mysql_warning_count) := GetProcedureAddress(MysqlLibraryHandle,'mysql_warning_count');
     pointer(mysql_stmt_init) := GetProcedureAddress(MysqlLibraryHandle,'mysql_stmt_init');
@@ -1915,6 +1959,10 @@ begin
     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_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
       Exit;

+ 12 - 0
packages/mysql/src/mysql57dyn.pp

@@ -0,0 +1,12 @@
+{
+  Contains the MySQL calls for MySQL 5.7
+}
+
+unit mysql57dyn;
+
+{$DEFINE LinkDynamically}
+{$DEFINE MYSQL57}
+
+{$i mysql.inc}
+
+end.