diff options
author | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-02-17 13:04:58 +0000 |
---|---|---|
committer | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-02-17 13:04:58 +0000 |
commit | 44e70d0c04da893abe391c2c73223e5217b20a8f (patch) | |
tree | 0bde1715685944c3859a8f94e22966714bc724f4 | |
parent | ac670cb1ea04da49633d5b8ef4452db2f3f18929 (diff) | |
download | fpc-44e70d0c04da893abe391c2c73223e5217b20a8f.tar.gz |
* Merging revisions 48692 from trunk:
------------------------------------------------------------------------
r48692 | michael | 2021-02-17 13:59:32 +0100 (Wed, 17 Feb 2021) | 1 line
* Patch from Mattias Gaertner to add MySQL 8.0 support
------------------------------------------------------------------------
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/fixes_3_2@48693 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | packages/fcl-db/fpmake.pp | 19 | ||||
-rw-r--r-- | packages/fcl-db/src/datadict/fpddmysql80.pp | 74 | ||||
-rw-r--r-- | packages/fcl-db/src/sqldb/mysql/Makefile.fpc | 4 | ||||
-rw-r--r-- | packages/fcl-db/src/sqldb/mysql/mysql80conn.pas | 12 | ||||
-rw-r--r-- | packages/fcl-db/src/sqldb/mysql/mysqlconn.inc | 127 | ||||
-rw-r--r-- | packages/fcl-db/tests/sqldbtoolsunit.pas | 9 | ||||
-rw-r--r-- | packages/mysql/fpmake.pp | 7 | ||||
-rw-r--r-- | packages/mysql/src/mysql.inc | 201 | ||||
-rw-r--r-- | packages/mysql/src/mysql80dyn.pp | 12 |
9 files changed, 394 insertions, 71 deletions
diff --git a/packages/fcl-db/fpmake.pp b/packages/fcl-db/fpmake.pp index a185d93405..532a79068a 100644 --- a/packages/fcl-db/fpmake.pp +++ b/packages/fcl-db/fpmake.pp @@ -473,6 +473,14 @@ begin AddUnit('fpddsqldb'); AddUnit('mysql57conn'); end; + T:=P.Targets.AddUnit('fpddmysql80.pp', DatadictOSes); + with T.Dependencies do + begin + AddUnit('sqldb'); + AddUnit('fpdatadict'); + AddUnit('fpddsqldb'); + AddUnit('mysql80conn'); + end; T:=P.Targets.AddUnit('fpddodbc.pp', DatadictOSes); with T.Dependencies do begin @@ -716,6 +724,17 @@ begin AddUnit('dbconst'); end; + T:=P.Targets.AddUnit('mysql80conn.pas', SqldbConnectionOSes); + T.ResourceStrings:=true; + with T.Dependencies do + begin + AddInclude('mysqlconn.inc'); + AddUnit('bufdataset'); + AddUnit('sqldb'); + AddUnit('db'); + AddUnit('dbconst'); + end; + T:=P.Targets.AddUnit('odbcconn.pas', SqldbConnectionOSes); with T.Dependencies do begin diff --git a/packages/fcl-db/src/datadict/fpddmysql80.pp b/packages/fcl-db/src/datadict/fpddmysql80.pp new file mode 100644 index 0000000000..69be3a54eb --- /dev/null +++ b/packages/fcl-db/src/datadict/fpddmysql80.pp @@ -0,0 +1,74 @@ +{ + This file is part of the Free Pascal run time library. + Copyright (c) 2007 by Michael Van Canneyt, member of the + Free Pascal development team + + MySQL 5.7 Data Dictionary Engine Implementation. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit fpddmysql80; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, sqldb, fpdatadict, fpddsqldb; + +Type + { TSQLDBMySql80DDEngine } + + TSQLDBMySql80DDEngine = Class(TSQLDBDDEngine) + Protected + Function CreateConnection(AConnectString : String) : TSQLConnection; override; + Public + Class function Description : string; override; + Class function DBType : String; override; + end; + +Procedure RegisterMySQL80DDEngine; +Procedure UnRegisterMySQL80DDEngine; + +implementation + +uses mysql80conn; + +Procedure RegisterMySQL80DDEngine; + +begin + RegisterDictionaryEngine(TSQLDBMySQL80DDEngine); +end; + +Procedure UnRegisterMySQL80DDEngine; + +begin + UnRegisterDictionaryEngine(TSQLDBMySQL80DDEngine); +end; + +{ TSQLDBMySql80DDEngine } + +function TSQLDBMySql80DDEngine.CreateConnection(AConnectString: String + ): TSQLConnection; +begin + Result:=mysql80conn.TMySQL80Connection.Create(Self); +end; + +class function TSQLDBMySql80DDEngine.Description: string; +begin + Result:='Mysql 8.0 connection using SQLDB'; +end; + +class function TSQLDBMySql80DDEngine.DBType: String; +begin + Result:='MySQL 8.0'; +end; + +end. + diff --git a/packages/fcl-db/src/sqldb/mysql/Makefile.fpc b/packages/fcl-db/src/sqldb/mysql/Makefile.fpc index a3a3eb4792..a737049d8f 100644 --- a/packages/fcl-db/src/sqldb/mysql/Makefile.fpc +++ b/packages/fcl-db/src/sqldb/mysql/Makefile.fpc @@ -6,8 +6,8 @@ main=fcl-db [target] -units=mysql40conn mysql41conn mysql50conn mysql51conn mysql55conn mysql56conn mysql57conn -rsts=mysql40conn mysql41conn mysql50conn mysql51conn mysql55conn mysql56conn mysql57conn +units=mysql40conn mysql41conn mysql50conn mysql51conn mysql55conn mysql56conn mysql57conn mysql80conn +rsts=mysql40conn mysql41conn mysql50conn mysql51conn mysql55conn mysql56conn mysql57conn mysql80conn [require] packages=fcl-xml mysql diff --git a/packages/fcl-db/src/sqldb/mysql/mysql80conn.pas b/packages/fcl-db/src/sqldb/mysql/mysql80conn.pas new file mode 100644 index 0000000000..19f526752d --- /dev/null +++ b/packages/fcl-db/src/sqldb/mysql/mysql80conn.pas @@ -0,0 +1,12 @@ +{ + Contains the TMysqlConnection for MySQL 5.7 +} + +unit mysql80conn; + +{$DEFINE MYSQL80_UP} +{$DEFINE MYSQL80} + +{$i mysqlconn.inc} + +end. diff --git a/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc b/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc index 2447eb831d..a53b0da409 100644 --- a/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc +++ b/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc @@ -1,3 +1,6 @@ +{$IFDEF MYSQL80_UP} + {$DEFINE MYSQL57_UP} +{$ENDIF} {$IFDEF MYSQL57_UP} {$DEFINE MYSQL56_UP} {$ENDIF} @@ -17,6 +20,9 @@ interface uses Classes, SysUtils,bufdataset,sqldb,db,ctypes,fmtbcd, +{$IFDEF mysql80} + mysql80dyn; +{$ELSE} {$IFDEF mysql57} mysql57dyn; {$ELSE} @@ -42,9 +48,13 @@ uses {$endif} {$ENDIF} {$ENDIF} +{$ENDIF} Const MySQLVersion = +{$IFDEF mysql80} + '8.0'; +{$ELSE} {$IFDEF mysql57} '5.7'; {$ELSE} @@ -70,6 +80,7 @@ Const {$endif} {$ENDIF} {$ENDIF} +{$ENDIF} MariaDBVersion = {$IFDEF mysql57} @@ -92,10 +103,7 @@ Type TCursorName = Class(TSQLCursor) protected FRes: PMYSQL_RES; { Record pointer } - // Statement with param placeholders $1 $2 etc. - FPreparedStatement : String; - // Statement with param placeholders replaced with actual values. - FActualStatement : String; + FStatement : String; Row : MYSQL_ROW; Lengths : pculong; { Lengths of the columns of the current row } RowsAffected : QWord; @@ -208,6 +216,12 @@ Type end; + {$IFDEF mysql80} + TMySQL80Connection = Class(TConnectionName); + TMySQL80ConnectionDef = Class(TMySQLConnectionDef); + TMySQL80Transaction = Class(TTransactionName); + TMySQL80Cursor = Class(TCursorName); + {$ELSE} {$IFDEF mysql57} TMySQL57Connection = Class(TConnectionName); TMySQL57ConnectionDef = Class(TMySQLConnectionDef); @@ -254,6 +268,7 @@ Type {$ENDIF} {$ENDIF} {$ENDIF} + {$ENDIF} implementation @@ -263,15 +278,57 @@ uses DateUtils; const - Mysql_Option_Names : array[mysql_option] of string = ('MYSQL_OPT_CONNECT_TIMEOUT','MYSQL_OPT_COMPRESS', - 'MYSQL_OPT_NAMED_PIPE','MYSQL_INIT_COMMAND', - 'MYSQL_READ_DEFAULT_FILE','MYSQL_READ_DEFAULT_GROUP', - 'MYSQL_SET_CHARSET_DIR','MYSQL_SET_CHARSET_NAME', - 'MYSQL_OPT_LOCAL_INFILE','MYSQL_OPT_PROTOCOL', - 'MYSQL_SHARED_MEMORY_BASE_NAME','MYSQL_OPT_READ_TIMEOUT', - 'MYSQL_OPT_WRITE_TIMEOUT','MYSQL_OPT_USE_RESULT', - 'MYSQL_OPT_USE_REMOTE_CONNECTION','MYSQL_OPT_USE_EMBEDDED_CONNECTION', - 'MYSQL_OPT_GUESS_CONNECTION','MYSQL_SET_CLIENT_IP', + Mysql_Option_Names : array[mysql_option] of string = ( + 'MYSQL_OPT_CONNECT_TIMEOUT', + 'MYSQL_OPT_COMPRESS', + 'MYSQL_OPT_NAMED_PIPE', + 'MYSQL_INIT_COMMAND', + 'MYSQL_READ_DEFAULT_FILE', + 'MYSQL_READ_DEFAULT_GROUP', + 'MYSQL_SET_CHARSET_DIR', + 'MYSQL_SET_CHARSET_NAME', + 'MYSQL_OPT_LOCAL_INFILE', + 'MYSQL_OPT_PROTOCOL', + 'MYSQL_SHARED_MEMORY_BASE_NAME', + 'MYSQL_OPT_READ_TIMEOUT', + 'MYSQL_OPT_WRITE_TIMEOUT', + 'MYSQL_OPT_USE_RESULT' + {$IFDEF MYSQL80} + ,'MYSQL_REPORT_DATA_TRUNCATION', + 'MYSQL_OPT_RECONNECT', + 'MYSQL_PLUGIN_DIR', + 'MYSQL_DEFAULT_AUTH', + 'MYSQL_OPT_BIND', + 'MYSQL_OPT_SSL_KEY', + 'MYSQL_OPT_SSL_CERT', + 'MYSQL_OPT_SSL_CA', + 'MYSQL_OPT_SSL_CAPATH', + 'MYSQL_OPT_SSL_CIPHER', + 'MYSQL_OPT_SSL_CRL', + 'MYSQL_OPT_SSL_CRLPATH', + 'MYSQL_OPT_CONNECT_ATTR_RESET', + 'MYSQL_OPT_CONNECT_ATTR_ADD', + 'MYSQL_OPT_CONNECT_ATTR_DELETE', + 'MYSQL_SERVER_PUBLIC_KEY', + 'MYSQL_ENABLE_CLEARTEXT_PLUGIN', + 'MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS', + 'MYSQL_OPT_MAX_ALLOWED_PACKET', + 'MYSQL_OPT_NET_BUFFER_LENGTH', + 'MYSQL_OPT_TLS_VERSION', + 'MYSQL_OPT_SSL_MODE', + 'MYSQL_OPT_GET_SERVER_PUBLIC_KEY', + 'MYSQL_OPT_RETRY_COUNT', + 'MYSQL_OPT_OPTIONAL_RESULTSET_METADATA', + 'MYSQL_OPT_SSL_FIPS_MODE', + 'MYSQL_OPT_TLS_CIPHERSUITES', + 'MYSQL_OPT_COMPRESSION_ALGORITHMS', + 'MYSQL_OPT_ZSTD_COMPRESSION_LEVEL', + 'MYSQL_OPT_LOAD_DATA_LOCAL_DIR' + {$ELSE} + ,'MYSQL_OPT_USE_REMOTE_CONNECTION', + 'MYSQL_OPT_USE_EMBEDDED_CONNECTION', + 'MYSQL_OPT_GUESS_CONNECTION', + 'MYSQL_SET_CLIENT_IP', 'MYSQL_SECURE_AUTH' {$IFDEF MYSQL50_UP} ,'MYSQL_REPORT_DATA_TRUNCATION', 'MYSQL_OPT_RECONNECT' @@ -293,15 +350,16 @@ const {$ENDIF} {$ENDIF} {$ENDIF} +{$ENDIF} ); Resourcestring SErrServerConnectFailed = 'Server connect failed.'; SErrSetCharsetFailed = 'Failed to set connection character set: %s'; SErrDatabaseSelectFailed = 'Failed to select database: %s'; - SErrDatabaseCreate = 'Failed to create database: %s'; - SErrDatabaseDrop = 'Failed to drop database: %s'; - SErrNoData = 'No data for record'; + //SErrDatabaseCreate = 'Failed to create database: %s'; + //SErrDatabaseDrop = 'Failed to drop database: %s'; + //SErrNoData = 'No data for record'; SErrExecuting = 'Error executing query: %s'; SErrFetchingdata = 'Error fetching row data: %s'; SErrGettingResult = 'Error getting result set: %s'; @@ -517,6 +575,7 @@ begin // Version string should start with version number: // Note: in case of MariaDB version mismatch: tough luck, we report MySQL // version only. + writeln('TConnectionName.DoInternalConnect FullVersion=',FullVersion,' MySQLVersion=',MySQLVersion); if (pos(MySQLVersion, FullVersion) <> 1) and (pos(MariaDBVersion, FullVersion) <> 1) then Raise EInOutError.CreateFmt(SErrVersionMisMatch,[ClassName,MySQLVersion,FullVersion]); @@ -546,6 +605,9 @@ end; Function TConnectionName.AllocateCursorHandle: TSQLCursor; begin + {$IFDEF mysql80} + Result:=TMySQL80Cursor.Create; + {$ELSE} {$IFDEF mysql57} Result:=TMySQL57Cursor.Create; {$ELSE} @@ -571,6 +633,7 @@ begin {$EndIf} {$ENDIF} {$ENDIF} + {$ENDIF} end; Procedure TConnectionName.DeAllocateCursorHandle(var cursor : TSQLCursor); @@ -592,10 +655,9 @@ begin // DatabaseError('Parameters (not) yet supported for the MySQL SqlDB connection.',self); With Cursor as TCursorName do begin - FPreparedStatement:=Buf; + FStatement:=Buf; if assigned(AParams) and (AParams.count > 0) then - FPreparedStatement := AParams.ParseSQL(FPreparedStatement,false,sqEscapeSlash in ConnOptions, sqEscapeRepeat in ConnOptions,psSimulated,paramBinding,ParamReplaceString); - FPrepared:=True; + FStatement := AParams.ParseSQL(FStatement,false,sqEscapeSlash in ConnOptions, sqEscapeRepeat in ConnOptions,psSimulated,paramBinding,ParamReplaceString); end end; @@ -624,7 +686,6 @@ begin mysql_free_result(C.FRes); C.FRes:=Nil; end; - C.FInitFieldDef:=True; SetLength(c.MapDSRowToMSQLRow,0); inherited; end; @@ -652,19 +713,18 @@ begin ParamNames[AParams.count-i-1] := C.ParamReplaceString+inttostr(AParams[i].Index+1); ParamValues[AParams.count-i-1] := GetAsSQLText(AParams[i]); end; - C.FActualStatement := stringsreplace(C.FPreparedStatement,ParamNames,ParamValues,[rfReplaceAll]); - end - else - C.FActualStatement:=C.FPreparedStatement; + // paramreplacestring kan een probleem geven bij postgres als hij niet meer gewoon $ is? + C.FStatement := stringsreplace(C.FStatement,ParamNames,ParamValues,[rfReplaceAll]); + end; if LogEvent(detParamValue) then LogParams(AParams); if LogEvent(detExecute) then - Log(detExecute, C.FPreparedStatement); + Log(detExecute, C.FStatement); if LogEvent(detActualSQL) then - Log(detActualSQL,C.FActualStatement); + Log(detActualSQL,C.FStatement); - if mysql_query(FMySQL,Pchar(C.FActualStatement))<>0 then + if mysql_query(FMySQL,Pchar(C.FStatement))<>0 then begin if not ForcedClose then MySQLError(FMYSQL,SErrExecuting,Self) @@ -1397,6 +1457,9 @@ end; class function TMySQLConnectionDef.ConnectionClass: TSQLConnectionClass; begin + {$IFDEF mysql80} + Result:=TMySQL80Connection; + {$ELSE} {$IFDEF mysql57} Result:=TMySQL57Connection; {$ELSE} @@ -1422,6 +1485,7 @@ begin {$endif} {$ENDIF} {$ENDIF} + {$ENDIF} end; class function TMySQLConnectionDef.Description: String; @@ -1449,6 +1513,12 @@ begin Result:=MysqlLoadedLibrary; end; +{$IFDEF mysql80} + initialization + RegisterConnection(TMySQL80ConnectionDef); + finalization + UnRegisterConnection(TMySQL80ConnectionDef); +{$ELSE} {$IFDEF mysql57} initialization RegisterConnection(TMySQL57ConnectionDef); @@ -1492,7 +1562,8 @@ end; {$EndIf} {$EndIf} {$ENDIF} -{$endif} +{$ENDIF} +{$ENDIF} {$ENDIF} {$ENDIF} diff --git a/packages/fcl-db/tests/sqldbtoolsunit.pas b/packages/fcl-db/tests/sqldbtoolsunit.pas index 8495b0ecdc..786ef04c1a 100644 --- a/packages/fcl-db/tests/sqldbtoolsunit.pas +++ b/packages/fcl-db/tests/sqldbtoolsunit.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, toolsunit ,db, sqldb - ,mysql40conn, mysql41conn, mysql50conn, mysql51conn, mysql55conn, mysql56conn, mysql57conn + ,mysql40conn, mysql41conn, mysql50conn, mysql51conn, mysql55conn, mysql56conn, mysql57conn, mysql80conn ,ibconnection ,pqconnection ,odbcconn @@ -20,13 +20,13 @@ uses ; type - TSQLConnType = (mysql40,mysql41,mysql50,mysql51,mysql55,mysql56,mysql57,postgresql,interbase,odbc,oracle,sqlite3,mssql,sybase); + TSQLConnType = (mysql40,mysql41,mysql50,mysql51,mysql55,mysql56,mysql57,mysql80,postgresql,interbase,odbc,oracle,sqlite3,mssql,sybase); TSQLServerType = (ssFirebird, ssInterbase, ssMSSQL, ssMySQL, ssOracle, ssPostgreSQL, ssSQLite, ssSybase, ssUnknown); const - MySQLConnTypes = [mysql40,mysql41,mysql50,mysql51,mysql55,mysql56,mysql57]; + MySQLConnTypes = [mysql40,mysql41,mysql50,mysql51,mysql55,mysql56,mysql57,mysql80]; SQLConnTypesNames : Array [TSQLConnType] of String[19] = - ('MYSQL40','MYSQL41','MYSQL50','MYSQL51','MYSQL55','MYSQL56','MYSQL57','POSTGRESQL','INTERBASE','ODBC','ORACLE','SQLITE3','MSSQL','SYBASE'); + ('MYSQL40','MYSQL41','MYSQL50','MYSQL51','MYSQL55','MYSQL56','MYSQL57','MYSQL80','POSTGRESQL','INTERBASE','ODBC','ORACLE','SQLITE3','MSSQL','SYBASE'); STestNotApplicable = 'This test does not apply to this sqldb connection type'; @@ -177,6 +177,7 @@ begin MYSQL55: Fconnection := TMySQL55Connection.Create(nil); MYSQL56: Fconnection := TMySQL56Connection.Create(nil); MYSQL57: Fconnection := TMySQL57Connection.Create(nil); + MYSQL80: Fconnection := TMySQL80Connection.Create(nil); SQLITE3: Fconnection := TSQLite3Connection.Create(nil); POSTGRESQL: Fconnection := TPQConnection.Create(nil); INTERBASE : Fconnection := TIBConnection.Create(nil); diff --git a/packages/mysql/fpmake.pp b/packages/mysql/fpmake.pp index 6e13f3d74b..58f33f0642 100644 --- a/packages/mysql/fpmake.pp +++ b/packages/mysql/fpmake.pp @@ -151,6 +151,13 @@ begin end; T.ResourceStrings := True; + T:=P.Targets.AddUnit('mysql80dyn.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 94062396f0..a6febbbdbf 100644 --- a/packages/mysql/src/mysql.inc +++ b/packages/mysql/src/mysql.inc @@ -31,7 +31,9 @@ uses {$DEFINE extdecl:=cdecl} const mysqllib = 'libmysqlclient.'+sharedsuffix; - {$IF DEFINED(mysql57)} + {$IF DEFINED(mysql80)} + mysqlvlib = mysqllib+'.21'; + {$ELSEIF DEFINED(mysql57)} mysqlvlib = mysqllib+'.20'; {$ELSEIF DEFINED(mysql55) or DEFINED(mysql56)} mysqlvlib = mysqllib+'.18'; @@ -53,6 +55,10 @@ uses {$ENDIF} +{$IFDEF mysql80} + {$DEFINE mysql57} +{$ENDIF mysql80} + {$IFDEF mysql57} {$DEFINE mysql56} {$ENDIF mysql57} @@ -151,22 +157,46 @@ uses MYSQL_SERVICENAME = 'MySQL'; type - enum_server_command = (COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY, - COM_FIELD_LIST,COM_CREATE_DB,COM_DROP_DB, - COM_REFRESH,COM_SHUTDOWN,COM_STATISTICS, - COM_PROCESS_INFO,COM_CONNECT,COM_PROCESS_KILL, - COM_DEBUG,COM_PING,COM_TIME,COM_DELAYED_INSERT, - COM_CHANGE_USER,COM_BINLOG_DUMP,COM_TABLE_DUMP, - COM_CONNECT_OUT,COM_REGISTER_SLAVE, + enum_server_command = ( + COM_SLEEP, + COM_QUIT, + COM_INIT_DB, + COM_QUERY, + COM_FIELD_LIST, + COM_CREATE_DB, + COM_DROP_DB, + COM_REFRESH, + COM_SHUTDOWN, // deprecated + COM_STATISTICS, + COM_PROCESS_INFO, + COM_CONNECT, + COM_PROCESS_KILL, + COM_DEBUG, + COM_PING, + COM_TIME, + COM_DELAYED_INSERT, + COM_CHANGE_USER, + COM_BINLOG_DUMP, + COM_TABLE_DUMP, + COM_CONNECT_OUT, + COM_REGISTER_SLAVE, {$IFDEF mysql50} - COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE, - COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, + COM_STMT_PREPARE, + COM_STMT_EXECUTE, + COM_STMT_SEND_LONG_DATA, + COM_STMT_CLOSE, + COM_STMT_RESET, + COM_SET_OPTION, + COM_STMT_FETCH, {$IFDEF mysql51} COM_DAEMON, {$IFDEF mysql56} COM_BINLOG_DUMP_GTID, {$IFDEF mysql57} COM_RESET_CONNECTION, + {$IFDEF mysql80} + COM_CLONE, + {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} @@ -236,6 +266,11 @@ uses 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 + {$IFDEF mysql80} + FIELD_IS_MARKED = (1 shl 28); // Intern: field is marked, general purpose + NOT_SECONDARY_FLAG = (1 << 29); // Field will not be loaded in secondary engine. + FIELD_IS_INVISIBLE = (1 << 30); // Field is explicitly marked as invisible by the user. + {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} @@ -247,7 +282,8 @@ uses REFRESH_HOSTS = 8; // Flush host cache REFRESH_STATUS = 16; // Flush status variables REFRESH_THREADS = 32; // Flush thread cache - REFRESH_SLAVE = 64; // Reset master info and restart slave thread + REFRESH_REPLICA = 64; // Reset master info and restart replica thread + REFRESH_SLAVE = REFRESH_REPLICA; // Reset master info and restart slave thread REFRESH_MASTER = 128; // Remove all bin logs in the index and truncate the index REFRESH_ERROR_LOG = 256; // Rotate only the erorr log REFRESH_ENGINE_LOG = 512; // Flush all storage engine logs @@ -259,13 +295,19 @@ uses { The following can't be set with mysql_refresh() } REFRESH_READ_LOCK = 16384; // Lock tables for read REFRESH_FAST = 32768; // Intern flag + + {$IFNDEF mysql80} REFRESH_QUERY_CACHE = 65536; // RESET (remove all queries) from query cache REFRESH_QUERY_CACHE_FREE = $20000; // pack query cache - REFRESH_DES_KEY_FILE = $40000; + {$ENDIF} + REFRESH_USER_RESOURCES = $80000; REFRESH_FOR_EXPORT = $100000; // FLUSH TABLES ... FOR EXPORT REFRESH_OPTIMIZER_COSTS = $200000; // FLUSH OPTIMIZER_COSTS + {$IFDEF mysql80} + REFRESH_PERSIST = $400000; // RESET PERSIST + {$ENDIF} CLIENT_LONG_PASSWORD = 1; // new more secure passwords CLIENT_FOUND_ROWS = 2; // Found instead of affected rows @@ -292,6 +334,11 @@ uses 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 + {$IFDEF mysql80} + CLIENT_OPTIONAL_RESULTSET_METADATA : cardinal = (1 shl 25); // client can handle optional metadata information in the resultset + CLIENT_ZSTD_COMPRESSION_ALGORITHM : cardinal = (1 shl 26); // Client sets this flag when it is configured to use zstd compression method + CLIENT_QUERY_ATTRIBUTES : cardinal = (1 shl 27); // Can send the optional part containing the query parameter set(s) + {$ENDIF} CLIENT_SSL_VERIFY_SERVER_CERT : cardinal = 1 shl 30; CLIENT_REMEMBER_OPTIONS : cardinal = 1 shl 31; @@ -384,17 +431,17 @@ uses return_status: pcuint; reading_or_writing: cuchar; save_char: cchar; - unused1: my_bool; // Please remove with the next incompatible ABI change - unused2: my_bool; // Please remove with the next incompatible ABI change + unused1: my_bool; // Please remove with the next incompatible ABI change + unused2: my_bool; // Please remove with the next incompatible ABI change compress: my_bool; - unused3: my_bool; // Please remove with the next incompatible ABI change + 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 } - unused: pcuchar; + unused: pcuchar; last_errno: cuint; error: cuchar; - unused4: my_bool; // Please remove with the next incompatible ABI change - unused5: my_bool; // Please remove with the next incompatible ABI change + unused4: my_bool; // Please remove with the next incompatible ABI change + unused5: my_bool; // Please remove with the next incompatible ABI change { Client library error message buffer. Actually belongs to struct MYSQL. } last_error: array[0..MYSQL_ERRMSG_SIZE-1] of cchar; { Client library sqlstate buffer. Set along with the error message. } @@ -462,25 +509,44 @@ uses packet_error : culong = culong(not(0)); type - enum_field_types = (MYSQL_TYPE_DECIMAL,MYSQL_TYPE_TINY, - MYSQL_TYPE_SHORT,MYSQL_TYPE_LONG,MYSQL_TYPE_FLOAT, - MYSQL_TYPE_DOUBLE,MYSQL_TYPE_NULL, - MYSQL_TYPE_TIMESTAMP,MYSQL_TYPE_LONGLONG, - MYSQL_TYPE_INT24,MYSQL_TYPE_DATE,MYSQL_TYPE_TIME, - MYSQL_TYPE_DATETIME,MYSQL_TYPE_YEAR, + enum_field_types = ( + MYSQL_TYPE_DECIMAL, + MYSQL_TYPE_TINY, + MYSQL_TYPE_SHORT, + MYSQL_TYPE_LONG, + MYSQL_TYPE_FLOAT, + MYSQL_TYPE_DOUBLE, + MYSQL_TYPE_NULL, + MYSQL_TYPE_TIMESTAMP, + MYSQL_TYPE_LONGLONG, + MYSQL_TYPE_INT24, + MYSQL_TYPE_DATE, + MYSQL_TYPE_TIME, + MYSQL_TYPE_DATETIME, + MYSQL_TYPE_YEAR, MYSQL_TYPE_NEWDATE, {$IFDEF mysql50} MYSQL_TYPE_VARCHAR, MYSQL_TYPE_BIT, {$IFDEF mysql56} MYSQL_TYPE_TIMESTAMP2, MYSQL_TYPE_DATETIME2, MYSQL_TYPE_TIME2, + {$IFDEF mysql80} + MYSQL_TYPE_TYPED_ARRAY, // Used for replication only + MYSQL_TYPE_INVALID := 243, + MYSQL_TYPE_BOOL := 244, // Currently just a placeholder + MYSQL_TYPE_JSON := 245, + {$ENDIF} {$ENDIF} MYSQL_TYPE_NEWDECIMAL := 246, {$ENDIF} MYSQL_TYPE_ENUM := 247, - MYSQL_TYPE_SET := 248,MYSQL_TYPE_TINY_BLOB := 249, - MYSQL_TYPE_MEDIUM_BLOB := 250,MYSQL_TYPE_LONG_BLOB := 251, - MYSQL_TYPE_BLOB := 252,MYSQL_TYPE_VAR_STRING := 253, - MYSQL_TYPE_STRING := 254,MYSQL_TYPE_GEOMETRY := 255 + MYSQL_TYPE_SET := 248, + MYSQL_TYPE_TINY_BLOB := 249, + MYSQL_TYPE_MEDIUM_BLOB := 250, + MYSQL_TYPE_LONG_BLOB := 251, + MYSQL_TYPE_BLOB := 252, + MYSQL_TYPE_VAR_STRING := 253, + MYSQL_TYPE_STRING := 254, + MYSQL_TYPE_GEOMETRY := 255 ); { For backward compatibility } @@ -907,15 +973,57 @@ uses MYSQL_DATA = st_mysql_data; PMYSQL_DATA = ^MYSQL_DATA; - mysql_option = (MYSQL_OPT_CONNECT_TIMEOUT,MYSQL_OPT_COMPRESS, - MYSQL_OPT_NAMED_PIPE,MYSQL_INIT_COMMAND, - MYSQL_READ_DEFAULT_FILE,MYSQL_READ_DEFAULT_GROUP, - MYSQL_SET_CHARSET_DIR,MYSQL_SET_CHARSET_NAME, - MYSQL_OPT_LOCAL_INFILE,MYSQL_OPT_PROTOCOL, - MYSQL_SHARED_MEMORY_BASE_NAME,MYSQL_OPT_READ_TIMEOUT, - MYSQL_OPT_WRITE_TIMEOUT,MYSQL_OPT_USE_RESULT, - MYSQL_OPT_USE_REMOTE_CONNECTION,MYSQL_OPT_USE_EMBEDDED_CONNECTION, - MYSQL_OPT_GUESS_CONNECTION,MYSQL_SET_CLIENT_IP, + mysql_option = ( + MYSQL_OPT_CONNECT_TIMEOUT, + MYSQL_OPT_COMPRESS, + MYSQL_OPT_NAMED_PIPE, + MYSQL_INIT_COMMAND, + MYSQL_READ_DEFAULT_FILE, + MYSQL_READ_DEFAULT_GROUP, + MYSQL_SET_CHARSET_DIR, + MYSQL_SET_CHARSET_NAME, + MYSQL_OPT_LOCAL_INFILE, + MYSQL_OPT_PROTOCOL, + MYSQL_SHARED_MEMORY_BASE_NAME, + MYSQL_OPT_READ_TIMEOUT, + MYSQL_OPT_WRITE_TIMEOUT, + MYSQL_OPT_USE_RESULT, + {$IFDEF MYSQL80} + MYSQL_REPORT_DATA_TRUNCATION, + MYSQL_OPT_RECONNECT, + MYSQL_PLUGIN_DIR, + MYSQL_DEFAULT_AUTH, + MYSQL_OPT_BIND, + MYSQL_OPT_SSL_KEY, + MYSQL_OPT_SSL_CERT, + MYSQL_OPT_SSL_CA, + MYSQL_OPT_SSL_CAPATH, + MYSQL_OPT_SSL_CIPHER, + MYSQL_OPT_SSL_CRL, + MYSQL_OPT_SSL_CRLPATH, + MYSQL_OPT_CONNECT_ATTR_RESET, + MYSQL_OPT_CONNECT_ATTR_ADD, + MYSQL_OPT_CONNECT_ATTR_DELETE, + MYSQL_SERVER_PUBLIC_KEY, + MYSQL_ENABLE_CLEARTEXT_PLUGIN, + MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, + MYSQL_OPT_MAX_ALLOWED_PACKET, + MYSQL_OPT_NET_BUFFER_LENGTH, + MYSQL_OPT_TLS_VERSION, + MYSQL_OPT_SSL_MODE, + MYSQL_OPT_GET_SERVER_PUBLIC_KEY, + MYSQL_OPT_RETRY_COUNT, + MYSQL_OPT_OPTIONAL_RESULTSET_METADATA, + MYSQL_OPT_SSL_FIPS_MODE, + MYSQL_OPT_TLS_CIPHERSUITES, + MYSQL_OPT_COMPRESSION_ALGORITHMS, + MYSQL_OPT_ZSTD_COMPRESSION_LEVEL, + MYSQL_OPT_LOAD_DATA_LOCAL_DIR + {$ELSE} + MYSQL_OPT_USE_REMOTE_CONNECTION, + MYSQL_OPT_USE_EMBEDDED_CONNECTION, + MYSQL_OPT_GUESS_CONNECTION, + MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH {$IFDEF MYSQL50} ,MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT @@ -937,6 +1045,7 @@ uses {$ENDIF} {$ENDIF} {$ENDIF} +{$ENDIF} ); const @@ -1000,6 +1109,19 @@ uses shared_memory_base_name : Pchar; {$ENDIF} max_allowed_packet : culong; +{$IFDEF Mysql80} + compress : my_bool; + named_pipe : my_bool; + bind_address: Pchar; + report_data_truncation: my_bool; + { function pointers for local infile support } + local_infile_init : function (_para1:Ppointer; _para2:Pchar; _para3:pointer):cint;cdecl; + local_infile_read : function (_para1:pointer; _para2:Pchar; _para3:cuint):cint; + local_infile_end : procedure (_para1:pointer); + local_infile_error : function (_para1:pointer; _para2:Pchar; _para3:cuint):cint; + local_infile_userdata : pointer; + extension : ^st_mysql_options_extention; +{$ELSE} use_ssl : my_bool; // if to use SSL or not compress : my_bool; named_pipe : my_bool; @@ -1044,6 +1166,7 @@ uses extension : ^st_mysql_options_extention; {$ENDIF} {$ENDIF} +{$ENDIF} end; mysql_status = (MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT, MYSQL_STATUS_USE_RESULT @@ -1144,6 +1267,8 @@ uses free_me : my_bool; // If free in mysql_close reconnect : my_bool; // set to 1 if automatic reconnect scramble : array[0..(SCRAMBLE_LENGTH+1)-1] of char; // session-wide random string +{$IFDEF mysql80} +{$ELSE} { Set if this is the original connection, not a master or a slave we have added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave() } rpl_pivot : my_bool; @@ -1153,6 +1278,7 @@ uses next_slave : Pst_mysql; last_used_slave : Pst_mysql; // needed for round-robin slave pick last_used_con : Pst_mysql; // needed for send/read/store/use result to work correctly with replication +{$ENDIF} {$IFDEF mysql41} stmts : Pointer; // was PList, list of all statements methods : Pst_mysql_methods; @@ -2099,3 +2225,4 @@ end; initialization Refcount := 0; {$ENDIF} +end. diff --git a/packages/mysql/src/mysql80dyn.pp b/packages/mysql/src/mysql80dyn.pp new file mode 100644 index 0000000000..754435f2f3 --- /dev/null +++ b/packages/mysql/src/mysql80dyn.pp @@ -0,0 +1,12 @@ +{ + Contains the MySQL calls for MySQL 8.0 +} + +unit mysql80dyn; + +{$DEFINE LinkDynamically} +{$DEFINE MYSQL80} + +{$i mysql.inc} + +end. |