MXS-1275: Compile mysql_client as C++

A custom parser for detecting "set sql_mode=ORACLE" is needed
and writing that is C++ is more convenient than writing it in
C. Consequently, so as to be able to use that parser, mysql_client
must be compiled as C++.
This commit is contained in:
Johan Wikman
2017-05-26 11:55:14 +03:00
parent 94b0b082e4
commit cd1e3f26cf
2 changed files with 21 additions and 42 deletions

View File

@ -1,4 +1,4 @@
add_library(MySQLClient SHARED mysql_client.c) add_library(MySQLClient SHARED mysql_client.cc)
target_link_libraries(MySQLClient maxscale-common MySQLCommon) target_link_libraries(MySQLClient maxscale-common MySQLCommon)
set_target_properties(MySQLClient PROPERTIES VERSION "1.0.0") set_target_properties(MySQLClient PROPERTIES VERSION "1.0.0")
install_module(MySQLClient core) install_module(MySQLClient core)

View File

@ -17,33 +17,6 @@
* *
* MySQL Protocol module for handling the protocol between the gateway * MySQL Protocol module for handling the protocol between the gateway
* and the client. * and the client.
*
* Revision History
* Date Who Description
* 14/06/2013 Mark Riddoch Initial version
* 17/06/2013 Massimiliano Pinto Added Client To MaxScale routines
* 24/06/2013 Massimiliano Pinto Added: fetch passwords from service users' hashtable
* 02/09/2013 Massimiliano Pinto Added: session refcount
* 16/12/2013 Massimiliano Pinto Added: client closed socket detection with recv(..., MSG_PEEK)
* 24/02/2014 Massimiliano Pinto Added: on failed authentication a new users' table is loaded
* with time and frequency limitations
* If current user is authenticated the new users' table will
* replace the old one
* 28/02/2014 Massimiliano Pinto Added: client IPv4 in dcb->ipv4 and inet_ntop for string
* representation
* 11/03/2014 Massimiliano Pinto Added: Unix socket support
* 07/05/2014 Massimiliano Pinto Added: specific version string in server handshake
* 09/09/2014 Massimiliano Pinto Added: 777 permission for socket path
* 13/10/2014 Massimiliano Pinto Added: dbname authentication check
* 10/11/2014 Massimiliano Pinto Added: client charset added to protocol struct
* 29/05/2015 Markus Makela Added SSL support
* 11/06/2015 Martin Brampton COM_QUIT suppressed for persistent connections
* 04/09/2015 Martin Brampton Introduce DUMMY session to fulfill guarantee DCB always has session
* 09/09/2015 Martin Brampton Modify error handler calls
* 11/01/2016 Martin Brampton Remove SSL write code, now handled at lower level;
* replace gwbuf_consume by gwbuf_free (multiple).
* 07/02/2016 Martin Brampton Split off authentication and SSL.
* 31/05/2016 Martin Brampton Implement connection throttling
*/ */
#define MXS_MODULE_NAME "MySQLClient" #define MXS_MODULE_NAME "MySQLClient"
@ -99,6 +72,10 @@ static void gw_process_one_new_client(DCB *client_dcb);
* *
* @return The module object * @return The module object
*/ */
extern "C"
{
MXS_MODULE* MXS_CREATE_MODULE() MXS_MODULE* MXS_CREATE_MODULE()
{ {
static MXS_PROTOCOL MyObject = static MXS_PROTOCOL MyObject =
@ -137,6 +114,8 @@ MXS_MODULE* MXS_CREATE_MODULE()
return &info; return &info;
} }
}
/*lint +e14 */ /*lint +e14 */
/** /**
@ -197,7 +176,7 @@ static void thread_finish(void)
*/ */
static char *gw_default_auth() static char *gw_default_auth()
{ {
return "MySQLAuth"; return (char*)"MySQLAuth";
} }
/** /**
@ -255,7 +234,7 @@ int MySQLSendHandshake(DCB* dcb)
} }
else else
{ {
version_string = GW_MYSQL_VERSION; version_string = (char*)GW_MYSQL_VERSION;
len_version_string = strlen(GW_MYSQL_VERSION); len_version_string = strlen(GW_MYSQL_VERSION);
} }
@ -503,7 +482,7 @@ int gw_read_client_event(DCB* dcb)
case MXS_AUTH_STATE_MESSAGE_READ: case MXS_AUTH_STATE_MESSAGE_READ:
/* After this call read_buffer will point to freed data */ /* After this call read_buffer will point to freed data */
if (nbytes_read < 3 || (0 == max_bytes && nbytes_read < if (nbytes_read < 3 || (0 == max_bytes && nbytes_read <
(MYSQL_GET_PAYLOAD_LEN((uint8_t *) GWBUF_DATA(read_buffer)) + 4)) || (int)(MYSQL_GET_PAYLOAD_LEN((uint8_t *) GWBUF_DATA(read_buffer)) + 4)) ||
(0 != max_bytes && nbytes_read < max_bytes)) (0 != max_bytes && nbytes_read < max_bytes))
{ {
@ -688,7 +667,7 @@ gw_read_do_authentication(DCB *dcb, GWBUF *read_buffer, int nbytes_read)
if (dcb->user == NULL) if (dcb->user == NULL)
{ {
/** User authentication complete, copy the username to the DCB */ /** User authentication complete, copy the username to the DCB */
MYSQL_session *ses = dcb->data; MYSQL_session *ses = (MYSQL_session*)dcb->data;
if ((dcb->user = MXS_STRDUP(ses->user)) == NULL) if ((dcb->user = MXS_STRDUP(ses->user)) == NULL)
{ {
dcb_close(dcb); dcb_close(dcb);
@ -862,7 +841,7 @@ static bool process_client_commands(DCB* dcb, int bytes_available, GWBUF** buffe
if (dcb->protocol_packet_length - MYSQL_HEADER_LEN != GW_MYSQL_MAX_PACKET_LEN) if (dcb->protocol_packet_length - MYSQL_HEADER_LEN != GW_MYSQL_MAX_PACKET_LEN)
{ {
/** We're processing the first packet of a command */ /** We're processing the first packet of a command */
proto->current_command = cmd; proto->current_command = (mysql_server_cmd_t)cmd;
} }
dcb->protocol_packet_length = pktlen + MYSQL_HEADER_LEN; dcb->protocol_packet_length = pktlen + MYSQL_HEADER_LEN;
@ -935,7 +914,7 @@ gw_read_normal_data(DCB *dcb, GWBUF *read_buffer, int nbytes_read)
if (rcap_type_required(capabilities, RCAP_TYPE_STMT_INPUT)) if (rcap_type_required(capabilities, RCAP_TYPE_STMT_INPUT))
{ {
if (nbytes_read < 3 || nbytes_read < if (nbytes_read < 3 || nbytes_read <
(MYSQL_GET_PAYLOAD_LEN((uint8_t *) GWBUF_DATA(read_buffer)) + 4)) (int)(MYSQL_GET_PAYLOAD_LEN((uint8_t *) GWBUF_DATA(read_buffer)) + 4))
{ {
dcb->dcb_readqueue = read_buffer; dcb->dcb_readqueue = read_buffer;
@ -951,7 +930,7 @@ gw_read_normal_data(DCB *dcb, GWBUF *read_buffer, int nbytes_read)
* The option is stored as a two byte integer with the values 0 for enabling * The option is stored as a two byte integer with the values 0 for enabling
* multi-statements and 1 for disabling it. * multi-statements and 1 for disabling it.
*/ */
MySQLProtocol *proto = dcb->protocol; MySQLProtocol *proto = (MySQLProtocol*)dcb->protocol;
uint8_t opt; uint8_t opt;
if (proto->current_command == MYSQL_COM_SET_OPTION && if (proto->current_command == MYSQL_COM_SET_OPTION &&
@ -1033,8 +1012,8 @@ gw_read_finish_processing(DCB *dcb, GWBUF *read_buffer, uint64_t capabilities)
* Ensure that there are enough backends * Ensure that there are enough backends
* available for router to continue operation. * available for router to continue operation.
*/ */
session->service->router->handleError(session->service->router_instance, session->service->router->handleError((MXS_ROUTER*)session->service->router_instance,
session->router_session, (MXS_ROUTER_SESSION*)session->router_session,
errbuf, errbuf,
dcb, dcb,
ERRACT_NEW_CONNECTION, ERRACT_NEW_CONNECTION,
@ -1089,7 +1068,7 @@ mysql_client_auth_error_handling(DCB *dcb, int auth_val, int packet_number)
/** Send error 1049 to client */ /** Send error 1049 to client */
message_len = 25 + MYSQL_DATABASE_MAXLEN; message_len = 25 + MYSQL_DATABASE_MAXLEN;
fail_str = MXS_CALLOC(1, message_len + 1); fail_str = (char*)MXS_CALLOC(1, message_len + 1);
MXS_ABORT_IF_NULL(fail_str); MXS_ABORT_IF_NULL(fail_str);
snprintf(fail_str, message_len, "Unknown database '%s'", session->db); snprintf(fail_str, message_len, "Unknown database '%s'", session->db);
@ -1395,7 +1374,7 @@ gw_client_close(DCB *dcb)
if (session->router_session != NULL) if (session->router_session != NULL)
{ {
/** Close router session and all its connections */ /** Close router session and all its connections */
router->closeSession(router_instance, session->router_session); router->closeSession((MXS_ROUTER*)router_instance, (MXS_ROUTER_SESSION*)session->router_session);
} }
} }
return 1; return 1;
@ -1553,9 +1532,9 @@ static int route_by_statement(MXS_SESSION* session, uint64_t capabilities, GWBUF
} }
else if ((type & QUERY_TYPE_COMMIT) || (type & QUERY_TYPE_ROLLBACK)) else if ((type & QUERY_TYPE_COMMIT) || (type & QUERY_TYPE_ROLLBACK))
{ {
mxs_session_trx_state_t trx_state = session_get_trx_state(session); uint32_t trx_state = session_get_trx_state(session);
trx_state |= SESSION_TRX_ENDING_BIT; trx_state |= SESSION_TRX_ENDING_BIT;
session_set_trx_state(session, trx_state); session_set_trx_state(session, (mxs_session_trx_state_t)trx_state);
if (type & QUERY_TYPE_ENABLE_AUTOCOMMIT) if (type & QUERY_TYPE_ENABLE_AUTOCOMMIT)
{ {
@ -1618,7 +1597,7 @@ static bool ensure_complete_packet(DCB *dcb, GWBUF **read_buffer, int nbytes_rea
{ {
uint8_t* data = (uint8_t *) GWBUF_DATA(*read_buffer); uint8_t* data = (uint8_t *) GWBUF_DATA(*read_buffer);
if (nbytes_read < 3 || nbytes_read < MYSQL_GET_PAYLOAD_LEN(data) + 4) if (nbytes_read < 3 || nbytes_read < (int)MYSQL_GET_PAYLOAD_LEN(data) + 4)
{ {
dcb->dcb_readqueue = gwbuf_append(dcb->dcb_readqueue, *read_buffer); dcb->dcb_readqueue = gwbuf_append(dcb->dcb_readqueue, *read_buffer);
return false; return false;