From 4442ecc863cff88d75069c174df48a227d683add Mon Sep 17 00:00:00 2001 From: michael Date: Wed, 22 Jul 2015 18:59:41 +0000 Subject: [PATCH] * Added MySQL 5.7 header translation from Laco (bug ID 28417) git-svn-id: trunk@31218 - --- .gitattributes | 1 + packages/mysql/fpmake.pp | 7 ++ packages/mysql/src/mysql.inc | 126 +++++++++++++++++++++---------- packages/mysql/src/mysql57dyn.pp | 12 +++ 4 files changed, 107 insertions(+), 39 deletions(-) create mode 100644 packages/mysql/src/mysql57dyn.pp diff --git a/.gitattributes b/.gitattributes index 89a8006c9e..ed1a2ef11f 100644 --- a/.gitattributes +++ b/.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 diff --git a/packages/mysql/fpmake.pp b/packages/mysql/fpmake.pp index 8d1b775767..39f7de0154 100644 --- a/packages/mysql/fpmake.pp +++ b/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'); diff --git a/packages/mysql/src/mysql.inc b/packages/mysql/src/mysql.inc index abc7689d9e..1de2d85e73 100644 --- a/packages/mysql/src/mysql.inc +++ b/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; diff --git a/packages/mysql/src/mysql57dyn.pp b/packages/mysql/src/mysql57dyn.pp new file mode 100644 index 0000000000..486fdbd894 --- /dev/null +++ b/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.