summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-02-17 13:04:58 +0000
committermichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-02-17 13:04:58 +0000
commit44e70d0c04da893abe391c2c73223e5217b20a8f (patch)
tree0bde1715685944c3859a8f94e22966714bc724f4
parentac670cb1ea04da49633d5b8ef4452db2f3f18929 (diff)
downloadfpc-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.pp19
-rw-r--r--packages/fcl-db/src/datadict/fpddmysql80.pp74
-rw-r--r--packages/fcl-db/src/sqldb/mysql/Makefile.fpc4
-rw-r--r--packages/fcl-db/src/sqldb/mysql/mysql80conn.pas12
-rw-r--r--packages/fcl-db/src/sqldb/mysql/mysqlconn.inc127
-rw-r--r--packages/fcl-db/tests/sqldbtoolsunit.pas9
-rw-r--r--packages/mysql/fpmake.pp7
-rw-r--r--packages/mysql/src/mysql.inc201
-rw-r--r--packages/mysql/src/mysql80dyn.pp12
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.