From ad0580377dbc5218ac8807473c46ee54a0de70d7 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Thu, 10 Apr 2014 10:17:45 +0200 Subject: [PATCH] - Windows build fixes for async API --- include/my_global.h | 1 + include/mysql.h | 112 +++++++++++++++++++++++++++++- libmariadb/libmariadb.c | 2 +- libmariadb/libmariadb_exports.def | 72 +++++++++++++++++++ libmariadb/mysql_async.c | 6 +- libmariadb/version_script.txt | 72 +++++++++++++++++++ unittest/libmariadb/async.c | 4 +- unittest/libmariadb/ssl.c | 32 ++++----- 8 files changed, 278 insertions(+), 23 deletions(-) diff --git a/include/my_global.h b/include/my_global.h index 3a87daf0..13129c4c 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -459,6 +459,7 @@ typedef SOCKET_SIZE_TYPE size_socket; #ifdef _WIN32 #define NO_DIR_LIBRARY /* Not standar dir-library */ #define USE_MY_STAT_STRUCT /* For my_lib */ +typedef SSIZE_T ssize_t; #endif /* Some things that this system does have */ diff --git a/include/mysql.h b/include/mysql.h index 23a73032..44cced57 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -366,6 +366,8 @@ typedef struct /* Local infile support functions */ #define LOCAL_INFILE_ERROR_LEN 512 +#include + void STDCALL mysql_set_local_infile_handler(MYSQL *mysql, int (*local_infile_init)(void **, const char *, void *), int (*local_infile_read)(void *, char *, unsigned int), @@ -494,7 +496,115 @@ my_socket STDCALL mysql_get_socket(const MYSQL *mysql); unsigned int STDCALL mysql_get_timeout_value(const MYSQL *mysql); unsigned int STDCALL mysql_get_timeout_value_ms(const MYSQL *mysql); -#include +/* Async API */ +int STDCALL mysql_close_start(MYSQL *sock); +int STDCALL mysql_close_cont(MYSQL *sock, int status); +int STDCALL mysql_commit_start(my_bool *ret, MYSQL * mysql); +int STDCALL mysql_commit_cont(my_bool *ret, MYSQL * mysql, int status); +int STDCALL mysql_rollback_start(my_bool *ret, MYSQL * mysql); +int STDCALL mysql_rollback_cont(my_bool *ret, MYSQL * mysql, int status); +int STDCALL mysql_autocommit_start(my_bool *ret, MYSQL * mysql, + my_bool auto_mode); +int STDCALL mysql_autocommit_cont(my_bool *ret, MYSQL * mysql, int status); +int STDCALL mysql_next_result_start(int *ret, MYSQL *mysql); +int STDCALL mysql_next_result_cont(int *ret, MYSQL *mysql, int status); +int STDCALL mysql_stmt_next_result_start(int *ret, MYSQL_STMT *stmt); +int STDCALL mysql_stmt_next_result_cont(int *ret, MYSQL_STMT *stmt, int status); + +int STDCALL mysql_stmt_close_start(my_bool *ret, MYSQL_STMT *stmt); +int STDCALL mysql_stmt_close_cont(my_bool *ret, MYSQL_STMT * stmt, int status); +int STDCALL mysql_set_character_set_start(int *ret, MYSQL *mysql, + const char *csname); +int STDCALL mysql_set_character_set_cont(int *ret, MYSQL *mysql, + int status); +int STDCALL mysql_change_user_start(my_bool *ret, MYSQL *mysql, + const char *user, + const char *passwd, + const char *db); +int STDCALL mysql_change_user_cont(my_bool *ret, MYSQL *mysql, + int status); +int STDCALL mysql_real_connect_start(MYSQL **ret, MYSQL *mysql, + const char *host, + const char *user, + const char *passwd, + const char *db, + unsigned int port, + const char *unix_socket, + unsigned long clientflag); +int STDCALL mysql_real_connect_cont(MYSQL **ret, MYSQL *mysql, + int status); +int STDCALL mysql_query_start(int *ret, MYSQL *mysql, + const char *q); +int STDCALL mysql_query_cont(int *ret, MYSQL *mysql, + int status); +int STDCALL mysql_send_query_start(int *ret, MYSQL *mysql, + const char *q, + unsigned long length); +int STDCALL mysql_send_query_cont(int *ret, MYSQL *mysql, int status); +int STDCALL mysql_real_query_start(int *ret, MYSQL *mysql, + const char *q, + unsigned long length); +int STDCALL mysql_real_query_cont(int *ret, MYSQL *mysql, + int status); +int STDCALL mysql_store_result_start(MYSQL_RES **ret, MYSQL *mysql); +int STDCALL mysql_store_result_cont(MYSQL_RES **ret, MYSQL *mysql, + int status); +int STDCALL mysql_shutdown_start(int *ret, MYSQL *mysql, + enum mysql_enum_shutdown_level + shutdown_level); +int STDCALL mysql_shutdown_cont(int *ret, MYSQL *mysql, + int status); +int STDCALL mysql_refresh_start(int *ret, MYSQL *mysql, + unsigned int refresh_options); +int STDCALL mysql_refresh_cont(int *ret, MYSQL *mysql, int status); +int STDCALL mysql_kill_start(int *ret, MYSQL *mysql, + unsigned long pid); +int STDCALL mysql_kill_cont(int *ret, MYSQL *mysql, int status); +int STDCALL mysql_set_server_option_start(int *ret, MYSQL *mysql, + enum enum_mysql_set_option + option); +int STDCALL mysql_set_server_option_cont(int *ret, MYSQL *mysql, + int status); +int STDCALL mysql_ping_start(int *ret, MYSQL *mysql); +int STDCALL mysql_ping_cont(int *ret, MYSQL *mysql, int status); +int STDCALL mysql_stat_start(const char **ret, MYSQL *mysql); +int STDCALL mysql_stat_cont(const char **ret, MYSQL *mysql, + int status); +int STDCALL mysql_free_result_start(MYSQL_RES *result); +int STDCALL mysql_free_result_cont(MYSQL_RES *result, int status); +MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); +int STDCALL mysql_fetch_row_start(MYSQL_ROW *ret, + MYSQL_RES *result); +int STDCALL mysql_fetch_row_cont(MYSQL_ROW *ret, MYSQL_RES *result, + int status); +int STDCALL mysql_read_query_result_start(my_bool *ret, + MYSQL *mysql); +int STDCALL mysql_read_query_result_cont(my_bool *ret, + MYSQL *mysql, int status); +int STDCALL mysql_stmt_prepare_start(int *ret, MYSQL_STMT *stmt,const char *query, unsigned long length); +int STDCALL mysql_stmt_prepare_cont(int *ret, MYSQL_STMT *stmt, int status); +int STDCALL mysql_stmt_execute_start(int *ret, MYSQL_STMT *stmt); +int STDCALL mysql_stmt_execute_cont(int *ret, MYSQL_STMT *stmt, int status); +int STDCALL mysql_stmt_fetch_start(int *ret, MYSQL_STMT *stmt); +int STDCALL mysql_stmt_fetch_cont(int *ret, MYSQL_STMT *stmt, int status); +int STDCALL mysql_stmt_store_result_start(int *ret, MYSQL_STMT *stmt); +int STDCALL mysql_stmt_store_result_cont(int *ret, MYSQL_STMT *stmt,int status); +int STDCALL mysql_stmt_close_start(my_bool *ret, MYSQL_STMT *stmt); +int STDCALL mysql_stmt_close_cont(my_bool *ret, MYSQL_STMT * stmt, int status); +my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt); +int STDCALL mysql_stmt_reset_start(my_bool *ret, MYSQL_STMT * stmt); +int STDCALL mysql_stmt_reset_cont(my_bool *ret, MYSQL_STMT *stmt, int status); +int STDCALL mysql_stmt_free_result_start(my_bool *ret, MYSQL_STMT *stmt); +int STDCALL mysql_stmt_free_result_cont(my_bool *ret, MYSQL_STMT *stmt, + int status); +int STDCALL mysql_stmt_send_long_data_start(my_bool *ret, MYSQL_STMT *stmt, + unsigned int param_number, + const char *data, + unsigned long len); +int STDCALL mysql_stmt_send_long_data_cont(my_bool *ret, MYSQL_STMT *stmt, + int status); + + /* these methods can be overwritten by db plugins */ struct st_mysql_methods { diff --git a/libmariadb/libmariadb.c b/libmariadb/libmariadb.c index fb36a2d5..62aa4613 100644 --- a/libmariadb/libmariadb.c +++ b/libmariadb/libmariadb.c @@ -2191,7 +2191,7 @@ void my_set_error(MYSQL *mysql, DBUG_VOID_RETURN; } -void STDCALL mysql_close_slow_part(MYSQL *mysql) +void mysql_close_slow_part(MYSQL *mysql) { if (mysql->net.vio) { diff --git a/libmariadb/libmariadb_exports.def b/libmariadb/libmariadb_exports.def index 175257ed..9616c1e1 100644 --- a/libmariadb/libmariadb_exports.def +++ b/libmariadb/libmariadb_exports.def @@ -135,4 +135,76 @@ EXPORTS mariadb_dyncol_column_cmp_named mariadb_dyncol_column_count mariadb_dyncol_json + mysql_autocommit_cont + mysql_autocommit_start + mysql_change_user_cont + mysql_change_user_start + mysql_close_cont + mysql_close_start + mysql_commit_cont + mysql_commit_start + mysql_dump_debug_info_cont + mysql_dump_debug_info_start + mysql_fetch_row_cont + mysql_fetch_row_start + mysql_free_result_cont + mysql_free_result_start + mysql_kill_cont + mysql_kill_start + mysql_list_dbs_cont + mysql_list_dbs_start + mysql_list_fields_cont + mysql_list_fields_start + mysql_list_processes_cont + mysql_list_processes_start + mysql_list_tables_cont + mysql_list_tables_start + mysql_next_result_cont + mysql_next_result_start + mysql_ping_cont + mysql_ping_start + mysql_query_cont + mysql_query_start + mysql_read_query_result_cont + mysql_read_query_result_start + mysql_real_connect_cont + mysql_real_connect_start + mysql_real_query_cont + mysql_real_query_start + mysql_refresh_cont + mysql_refresh_start + mysql_rollback_cont + mysql_rollback_start + mysql_select_db_cont + mysql_select_db_start + mysql_send_query_cont + mysql_send_query_start + mysql_set_character_set_cont + mysql_set_character_set_start + mysql_set_server_option_cont + mysql_set_server_option_start + mysql_shutdown_cont + mysql_shutdown_start + mysql_stat_cont + mysql_stat_start + mysql_stmt_close_cont + mysql_stmt_close_start + mysql_stmt_execute_cont + mysql_stmt_execute_start + mysql_stmt_fetch_cont + mysql_stmt_fetch_start + mysql_stmt_free_result_cont + mysql_stmt_free_result_start + mysql_stmt_next_result_cont + mysql_stmt_next_result_start + mysql_stmt_prepare_cont + mysql_stmt_prepare_start + mysql_stmt_reset_cont + mysql_stmt_reset_start + mysql_stmt_send_long_data_cont + mysql_stmt_send_long_data_start + mysql_stmt_store_result_cont + mysql_stmt_store_result_start + mysql_store_result_cont + mysql_store_result_start diff --git a/libmariadb/mysql_async.c b/libmariadb/mysql_async.c index 7a7fc3c7..1a3cf421 100644 --- a/libmariadb/mysql_async.c +++ b/libmariadb/mysql_async.c @@ -34,7 +34,7 @@ #include "mysql_async.h" -#ifdef __WIN__ +#ifdef _WIN32 /* Windows does not support MSG_DONTWAIT for send()/recv(). So we need to ensure that the socket is non-blocking at the start of every operation. @@ -67,7 +67,7 @@ my_connect_async(struct mysql_async_context *b, my_socket fd, size_socket s_err_size; /* Make the socket non-blocking. */ -#ifdef __WIN__ +#ifdef _WIN32 ulong arg= 1; ioctlsocket(fd, FIONBIO, (void *)&arg); #else @@ -84,7 +84,7 @@ my_connect_async(struct mysql_async_context *b, my_socket fd, res= connect(fd, name, namelen); if (res != 0) { -#ifdef __WIN__ +#ifdef _WIN32 int wsa_err= WSAGetLastError(); if (wsa_err != WSAEWOULDBLOCK) return res; diff --git a/libmariadb/version_script.txt b/libmariadb/version_script.txt index bb53acf6..e6eb3e34 100644 --- a/libmariadb/version_script.txt +++ b/libmariadb/version_script.txt @@ -135,6 +135,78 @@ global: mariadb_dyncol_column_cmp_named; mariadb_dyncol_column_count; mariadb_dyncol_json; + mysql_autocommit_cont; + mysql_autocommit_start; + mysql_change_user_cont; + mysql_change_user_start; + mysql_close_cont; + mysql_close_start; + mysql_commit_cont; + mysql_commit_start; + mysql_dump_debug_info_cont; + mysql_dump_debug_info_start; + mysql_fetch_row_cont; + mysql_fetch_row_start; + mysql_free_result_cont; + mysql_free_result_start; + mysql_kill_cont; + mysql_kill_start; + mysql_list_dbs_cont; + mysql_list_dbs_start; + mysql_list_fields_cont; + mysql_list_fields_start; + mysql_list_processes_cont; + mysql_list_processes_start; + mysql_list_tables_cont; + mysql_list_tables_start; + mysql_next_result_cont; + mysql_next_result_start; + mysql_ping_cont; + mysql_ping_start; + mysql_query_cont; + mysql_query_start; + mysql_read_query_result_cont; + mysql_read_query_result_start; + mysql_real_connect_cont; + mysql_real_connect_start; + mysql_real_query_cont; + mysql_real_query_start; + mysql_refresh_cont; + mysql_refresh_start; + mysql_rollback_cont; + mysql_rollback_start; + mysql_select_db_cont; + mysql_select_db_start; + mysql_send_query_cont; + mysql_send_query_start; + mysql_set_character_set_cont; + mysql_set_character_set_start; + mysql_set_server_option_cont; + mysql_set_server_option_start; + mysql_shutdown_cont; + mysql_shutdown_start; + mysql_stat_cont; + mysql_stat_start; + mysql_stmt_close_cont; + mysql_stmt_close_start; + mysql_stmt_execute_cont; + mysql_stmt_execute_start; + mysql_stmt_fetch_cont; + mysql_stmt_fetch_start; + mysql_stmt_free_result_cont; + mysql_stmt_free_result_start; + mysql_stmt_next_result_cont; + mysql_stmt_next_result_start; + mysql_stmt_prepare_cont; + mysql_stmt_prepare_start; + mysql_stmt_reset_cont; + mysql_stmt_reset_start; + mysql_stmt_send_long_data_cont; + mysql_stmt_send_long_data_start; + mysql_stmt_store_result_cont; + mysql_stmt_store_result_start; + mysql_store_result_cont; + mysql_store_result_start; local: *; }; diff --git a/unittest/libmariadb/async.c b/unittest/libmariadb/async.c index 450cf881..7cc86310 100644 --- a/unittest/libmariadb/async.c +++ b/unittest/libmariadb/async.c @@ -18,7 +18,7 @@ #include "ma_common.h" -#ifndef __WIN__ +#ifndef _WIN32 #include #else #include @@ -33,7 +33,7 @@ static int wait_for_mysql(MYSQL *mysql, int status) { -#ifdef __WIN__ +#ifdef _WIN32 fd_set rs, ws, es; int res; struct timeval tv, *timeout; diff --git a/unittest/libmariadb/ssl.c b/unittest/libmariadb/ssl.c index 06d80b5a..e9abdfec 100644 --- a/unittest/libmariadb/ssl.c +++ b/unittest/libmariadb/ssl.c @@ -74,7 +74,7 @@ static int test_ssl_cipher(MYSQL *unused) my= mysql_init(NULL); FAIL_IF(!my, "mysql_init() failed"); - mysql_ssl_set(my,0, 0, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); + mysql_ssl_set(my,0, 0, "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); FAIL_IF(!mysql_real_connect(my, hostname, username, password, schema, port, socketname, 0), mysql_error(my)); @@ -118,7 +118,7 @@ static int test_multi_ssl_connections(MYSQL *unused) mysql[i]= mysql_init(NULL); FAIL_IF(!mysql[i],"mysql_init() failed"); - mysql_ssl_set(mysql[i], 0, 0, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); + mysql_ssl_set(mysql[i], 0, 0, "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); mysql_real_connect(mysql[i], hostname, username, password, schema, port, socketname, 0); @@ -161,7 +161,7 @@ static void ssl_thread(void) mysql_thread_end(); pthread_exit(NULL); } - mysql_ssl_set(mysql, 0, 0, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); + mysql_ssl_set(mysql, 0, 0, "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); if(!mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0)) @@ -227,9 +227,9 @@ static int test_phpbug51647(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", - "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/client-cert.pem", - "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); + mysql_ssl_set(mysql, "C:/work/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", + "C:/work/mariadb-native-client/unittest/libmariadb/certs/client-cert.pem", + "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", 0, 0); FAIL_IF(!mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0), mysql_error(mysql)); @@ -249,7 +249,7 @@ static int test_conc50(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, NULL, NULL, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/my_cert.pem", NULL, NULL); + mysql_ssl_set(mysql, NULL, NULL, "C:/work/mariadb-native-client/unittest/libmariadb/certs/my_cert.pem", NULL, NULL); mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0); @@ -270,7 +270,7 @@ static int test_conc50_1(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, NULL, NULL, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL); + mysql_ssl_set(mysql, NULL, NULL, "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL); mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0); @@ -292,7 +292,7 @@ static int test_conc50_2(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, NULL, NULL, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/dummy.pem", NULL, NULL); + mysql_ssl_set(mysql, NULL, NULL, "C:/work/mariadb-native-client/unittest/libmariadb/certs/dummy.pem", NULL, NULL); mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0); @@ -332,7 +332,7 @@ static int test_conc50_3(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, NULL, NULL, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL); + mysql_ssl_set(mysql, NULL, NULL, "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL); mysql_real_connect(mysql, hostname, "ssltest", NULL, schema, port, socketname, 0); @@ -352,7 +352,7 @@ static int test_conc50_4(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, NULL, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL, NULL); + mysql_ssl_set(mysql, NULL, "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL, NULL); mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0); @@ -376,7 +376,7 @@ static int verify_ssl_server_cert(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, NULL, NULL, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL); + mysql_ssl_set(mysql, NULL, NULL, "C:/work/mariadb-native-client/unittest/libmariadb/certs/ca.pem", NULL, NULL); mysql_options(mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, &verify); mysql_real_connect(mysql, hostname, username, password, schema, @@ -409,7 +409,7 @@ static int test_bug62743(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", NULL, NULL, NULL, NULL); + mysql_ssl_set(mysql, "C:/work/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", NULL, NULL, NULL, NULL); mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0); @@ -420,8 +420,8 @@ static int test_bug62743(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", - "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/client-cert.pem", NULL, NULL, NULL); + mysql_ssl_set(mysql, "C:/work/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", + "C:/work/mariadb-native-client/unittest/libmariadb/certs/client-cert.pem", NULL, NULL, NULL); mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0); @@ -431,7 +431,7 @@ static int test_bug62743(MYSQL *my) mysql= mysql_init(NULL); FAIL_IF(!mysql, "Can't allocate memory"); - mysql_ssl_set(mysql, "/home/georg/work/mariadb/client/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", "blablubb", NULL, NULL, NULL); + mysql_ssl_set(mysql, "C:/work/mariadb-native-client/unittest/libmariadb/certs/client-key.pem", "blablubb", NULL, NULL, NULL); mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0);