You've already forked mariadb-connector-c
mirror of
https://github.com/mariadb-corporation/mariadb-connector-c.git
synced 2025-08-08 14:02:17 +03:00
Merge branch '10.3-server' into 3.0
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -87,6 +87,7 @@ unittest/libmariadb/t_aurora
|
|||||||
unittest/libmariadb/t_conc173
|
unittest/libmariadb/t_conc173
|
||||||
unittest/libmariadb/thread
|
unittest/libmariadb/thread
|
||||||
unittest/libmariadb/view
|
unittest/libmariadb/view
|
||||||
|
unittest/libmariadb/conc336
|
||||||
|
|
||||||
#VS files/directories
|
#VS files/directories
|
||||||
*.vcxproj
|
*.vcxproj
|
||||||
|
@@ -151,7 +151,7 @@ ENDIF()
|
|||||||
|
|
||||||
# various defines for generating include/mysql_version.h
|
# various defines for generating include/mysql_version.h
|
||||||
INCLUDE(FindGit)
|
INCLUDE(FindGit)
|
||||||
IF(GIT_EXECUTABLE)
|
IF(GIT_EXECUTABLE AND EXISTS ${CC_SOURCE_DIR}/.git)
|
||||||
EXECUTE_PROCESS(
|
EXECUTE_PROCESS(
|
||||||
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
|
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
|
||||||
WORKING_DIRECTORY ${CC_SOURCE_DIR}
|
WORKING_DIRECTORY ${CC_SOURCE_DIR}
|
||||||
@@ -399,7 +399,7 @@ ENDIF()
|
|||||||
IF(WIN32 AND WITH_MSI AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
IF(WIN32 AND WITH_MSI AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
||||||
ADD_SUBDIRECTORY(win/packaging)
|
ADD_SUBDIRECTORY(win/packaging)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
MESSAGE("SYSTEM processor: ${CMAKE_SYSTEM_PROCESSOR}")
|
MESSAGE1(SYSTEM_PROCESSOR "SYSTEM processor: ${CMAKE_SYSTEM_PROCESSOR}")
|
||||||
SET(CPACK_PACKAGE_VENDOR "MariaDB Corporation Ab")
|
SET(CPACK_PACKAGE_VENDOR "MariaDB Corporation Ab")
|
||||||
SET(CPACK_PACKAGE_DESCRIPTION "MariaDB Connector/C. A library for connecting to MariaDB and MySQL servers")
|
SET(CPACK_PACKAGE_DESCRIPTION "MariaDB Connector/C. A library for connecting to MariaDB and MySQL servers")
|
||||||
SET(CPACK_PACKAGE_NAME "mariadb_connector_c")
|
SET(CPACK_PACKAGE_NAME "mariadb_connector_c")
|
||||||
@@ -417,15 +417,15 @@ ENDIF()
|
|||||||
# Build source packages
|
# Build source packages
|
||||||
IF(GIT_BUILD_SRCPKG)
|
IF(GIT_BUILD_SRCPKG)
|
||||||
# get branch name
|
# get branch name
|
||||||
EXECUTE_PROCESS(COMMAND git show-branch OUTPUT_VARIABLE git_branch)
|
EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} show-branch OUTPUT_VARIABLE git_branch)
|
||||||
STRING(REGEX MATCH "\\[([^]]+)\\]" git_branch ${git_branch})
|
STRING(REGEX MATCH "\\[([^]]+)\\]" git_branch ${git_branch})
|
||||||
STRING(REGEX REPLACE "\\[|\\]" "" GIT_BRANCH ${git_branch})
|
STRING(REGEX REPLACE "\\[|\\]" "" GIT_BRANCH ${git_branch})
|
||||||
MESSAGE1(GIT_BRANCH "${GIT_BRANCH}")
|
MESSAGE1(GIT_BRANCH "${GIT_BRANCH}")
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
EXECUTE_PROCESS(COMMAND git archive ${GIT_BRANCH} --format=zip --prefix=${CPACK_SOURCE_PACKAGE_FILE_NAME}/ --output=${CPACK_SOURCE_PACKAGE_FILE_NAME}.zip)
|
EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} archive ${GIT_BRANCH} --format=zip --prefix=${CPACK_SOURCE_PACKAGE_FILE_NAME}/ --output=${CPACK_SOURCE_PACKAGE_FILE_NAME}.zip)
|
||||||
ELSE()
|
ELSE()
|
||||||
EXECUTE_PROCESS(COMMAND git archive ${GIT_BRANCH} --format=zip --prefix=${CPACK_SOURCE_PACKAGE_FILE_NAME}/ --output=${CPACK_SOURCE_PACKAGE_FILE_NAME}.zip)
|
EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} archive ${GIT_BRANCH} --format=zip --prefix=${CPACK_SOURCE_PACKAGE_FILE_NAME}/ --output=${CPACK_SOURCE_PACKAGE_FILE_NAME}.zip)
|
||||||
EXECUTE_PROCESS(COMMAND git archive ${GIT_BRANCH} --format=tar --prefix=${CPACK_SOURCE_PACKAGE_FILE_NAME}/ --output=${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar)
|
EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} archive ${GIT_BRANCH} --format=tar --prefix=${CPACK_SOURCE_PACKAGE_FILE_NAME}/ --output=${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar)
|
||||||
EXECUTE_PROCESS(COMMAND gzip -9 -f ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar)
|
EXECUTE_PROCESS(COMMAND gzip -9 -f ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
@@ -22,10 +22,6 @@
|
|||||||
# INSTALL_LIBDIR location of libraries
|
# INSTALL_LIBDIR location of libraries
|
||||||
# INSTALL_PLUGINDIR location of plugins
|
# INSTALL_PLUGINDIR location of plugins
|
||||||
|
|
||||||
IF(DEFINED INSTALL_BINDIR AND DEFINED INSTALL_LIBDIR AND DEFINED INSTALL_INCLUDEDIR AND DEFINED INSTALL_DOCDIR AND DEFINED INSTALL_PLUGINDIR)
|
|
||||||
RETURN()
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
IF(NOT INSTALL_LAYOUT)
|
IF(NOT INSTALL_LAYOUT)
|
||||||
SET(INSTALL_LAYOUT "DEFAULT")
|
SET(INSTALL_LAYOUT "DEFAULT")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
@@ -8,22 +8,28 @@
|
|||||||
MACRO(create_symlink symlink_name target install_path)
|
MACRO(create_symlink symlink_name target install_path)
|
||||||
# According to cmake documentation symlinks work on unix systems only
|
# According to cmake documentation symlinks work on unix systems only
|
||||||
IF(UNIX)
|
IF(UNIX)
|
||||||
# Set target components
|
# Get target components
|
||||||
SET(target_lib $<TARGET_FILE_DIR:${target}>/${symlink_name})
|
|
||||||
|
|
||||||
ADD_CUSTOM_COMMAND(
|
ADD_CUSTOM_COMMAND(
|
||||||
TARGET ${target} POST_BUILD
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name}
|
||||||
COMMAND ${CMAKE_COMMAND} ARGS -E remove -f ${target_lib}
|
COMMAND ${CMAKE_COMMAND} ARGS -E remove -f ${symlink_name}
|
||||||
COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink $<TARGET_FILE_NAME:${target}> ${symlink_name})
|
COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink $<TARGET_FILE_NAME:${target}> ${symlink_name}
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
DEPENDS ${target}
|
||||||
|
)
|
||||||
|
|
||||||
|
ADD_CUSTOM_TARGET(SYM_${symlink_name}
|
||||||
|
ALL
|
||||||
|
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name})
|
||||||
|
SET_TARGET_PROPERTIES(SYM_${symlink_name} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
|
||||||
|
|
||||||
IF(CMAKE_GENERATOR MATCHES "Xcode")
|
IF(CMAKE_GENERATOR MATCHES "Xcode")
|
||||||
# For Xcode, replace project config with install config
|
# For Xcode, replace project config with install config
|
||||||
STRING(REPLACE "${CMAKE_CFG_INTDIR}"
|
STRING(REPLACE "${CMAKE_CFG_INTDIR}"
|
||||||
"\${CMAKE_INSTALL_CONFIG_NAME}" output ${target_path}/${symlink_name})
|
"\${CMAKE_INSTALL_CONFIG_NAME}" output ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
# presumably this will be used for libmysql*.so symlinks
|
# presumably this will be used for libmysql*.so symlinks
|
||||||
INSTALL(FILES ${target_lib} DESTINATION ${install_path}
|
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name} DESTINATION ${install_path}
|
||||||
COMPONENT SharedLibraries)
|
COMPONENT SharedLibraries)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDMACRO()
|
ENDMACRO()
|
||||||
|
@@ -9,8 +9,8 @@ FUNCTION(GET_FILE_VERSION FILE_NAME FILE_VERSION)
|
|||||||
|
|
||||||
# if we build from a git repository, we calculate the file version:
|
# if we build from a git repository, we calculate the file version:
|
||||||
# Patch number is numer of commits for given file
|
# Patch number is numer of commits for given file
|
||||||
IF(EXISTS ${CC_SOURCE_DIR}/.git)
|
IF(GIT_EXECUTABLE AND EXISTS ${CC_SOURCE_DIR}/.git)
|
||||||
EXECUTE_PROCESS(COMMAND git --git-dir=${CC_SOURCE_DIR}/.git --work-tree=${CC_SOURCE_DIR} rev-list HEAD --count -- ${FILE_NAME}
|
EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} --git-dir=${CC_SOURCE_DIR}/.git --work-tree=${CC_SOURCE_DIR} rev-list HEAD --count -- ${FILE_NAME}
|
||||||
OUTPUT_VARIABLE FV)
|
OUTPUT_VARIABLE FV)
|
||||||
STRING(REPLACE "\n" "" FV ${FV})
|
STRING(REPLACE "\n" "" FV ${FV})
|
||||||
SET(${FILE_VERSION} ${FV} PARENT_SCOPE)
|
SET(${FILE_VERSION} ${FV} PARENT_SCOPE)
|
||||||
|
@@ -449,9 +449,7 @@ INSTALL(TARGETS libmariadb
|
|||||||
|
|
||||||
|
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
IF(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
|
# On Windows, install PDB
|
||||||
SET(PDB_LOCATION ${CC_BINARY_DIR}/libmariadb/RelWIthDebInfo/libmariadb.pdb)
|
INSTALL(FILES $<TARGET_PDB_FILE:libmariadb> DESTINATION "${INSTALL_LIBDIR}"
|
||||||
INSTALL(FILES ${PDB_LOCATION} DESTINATION "${INSTALL_LIBDIR}"
|
|
||||||
COMPONENT Development)
|
COMPONENT Development)
|
||||||
ENDIF()
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
@@ -96,8 +96,8 @@ my_bool ma_dynstr_append_quoted(DYNAMIC_STRING *str,
|
|||||||
const char *append, size_t len,
|
const char *append, size_t len,
|
||||||
char quote)
|
char quote)
|
||||||
{
|
{
|
||||||
uint additional= str->alloc_increment;
|
size_t additional= str->alloc_increment;
|
||||||
uint lim= additional;
|
size_t lim= additional;
|
||||||
uint i;
|
uint i;
|
||||||
|
|
||||||
if (ma_dynstr_realloc(str, len + additional + 2))
|
if (ma_dynstr_realloc(str, len + additional + 2))
|
||||||
|
@@ -39,6 +39,13 @@
|
|||||||
#define HAVE_OPENSSL_1_1_API
|
#define HAVE_OPENSSL_1_1_API
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10000000L
|
||||||
|
#define SSL_OP_NO_TLSv1_1 0L
|
||||||
|
#define SSL_OP_NO_TLSv1_2 0L
|
||||||
|
#define CRYPTO_THREADID_set_callback CRYPTO_set_id_callback
|
||||||
|
#define CRYPTO_THREADID_get_callback CRYPTO_get_id_callback
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_TLS_SESSION_CACHE
|
#ifdef HAVE_TLS_SESSION_CACHE
|
||||||
#undef HAVE_TLS_SESSION_CACHE
|
#undef HAVE_TLS_SESSION_CACHE
|
||||||
#endif
|
#endif
|
||||||
@@ -436,7 +443,7 @@ int ma_tls_get_password(char *buf, int size,
|
|||||||
memset(buf, 0, size);
|
memset(buf, 0, size);
|
||||||
if (userdata)
|
if (userdata)
|
||||||
strncpy(buf, (char *)userdata, size);
|
strncpy(buf, (char *)userdata, size);
|
||||||
return strlen(buf);
|
return (int)strlen(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -616,7 +623,7 @@ my_bool ma_tls_connect(MARIADB_TLS *ctls)
|
|||||||
SSL_set_bio(ssl, bio, bio);
|
SSL_set_bio(ssl, bio, bio);
|
||||||
BIO_set_fd(bio, mysql_get_socket(mysql), BIO_NOCLOSE);
|
BIO_set_fd(bio, mysql_get_socket(mysql), BIO_NOCLOSE);
|
||||||
#else
|
#else
|
||||||
SSL_set_fd(ssl, mysql_get_socket(mysql));
|
SSL_set_fd(ssl, (int)mysql_get_socket(mysql));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (try_connect && (rc= SSL_connect(ssl)) == -1)
|
while (try_connect && (rc= SSL_connect(ssl)) == -1)
|
||||||
@@ -693,7 +700,7 @@ ssize_t ma_tls_read_async(MARIADB_PVIO *pvio,
|
|||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
res= SSL_read((SSL *)ctls->ssl, (void *)buffer, length);
|
res= SSL_read((SSL *)ctls->ssl, (void *)buffer, (int)length);
|
||||||
if (ma_tls_async_check_result(res, b, (SSL *)ctls->ssl))
|
if (ma_tls_async_check_result(res, b, (SSL *)ctls->ssl))
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -709,7 +716,7 @@ ssize_t ma_tls_write_async(MARIADB_PVIO *pvio,
|
|||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
res= SSL_write((SSL *)ctls->ssl, (void *)buffer, length);
|
res= SSL_write((SSL *)ctls->ssl, (void *)buffer, (int)length);
|
||||||
if (ma_tls_async_check_result(res, b, (SSL *)ctls->ssl))
|
if (ma_tls_async_check_result(res, b, (SSL *)ctls->ssl))
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -718,7 +725,7 @@ ssize_t ma_tls_write_async(MARIADB_PVIO *pvio,
|
|||||||
|
|
||||||
ssize_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
|
ssize_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
|
||||||
{
|
{
|
||||||
ssize_t rc;
|
int rc;
|
||||||
MARIADB_PVIO *pvio= ctls->pvio;
|
MARIADB_PVIO *pvio= ctls->pvio;
|
||||||
|
|
||||||
while ((rc= SSL_read((SSL *)ctls->ssl, (void *)buffer, (int)length)) < 0)
|
while ((rc= SSL_read((SSL *)ctls->ssl, (void *)buffer, (int)length)) < 0)
|
||||||
@@ -734,7 +741,7 @@ ssize_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
|
|||||||
|
|
||||||
ssize_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
|
ssize_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
|
||||||
{
|
{
|
||||||
ssize_t rc;
|
int rc;
|
||||||
MARIADB_PVIO *pvio= ctls->pvio;
|
MARIADB_PVIO *pvio= ctls->pvio;
|
||||||
|
|
||||||
while ((rc= SSL_write((SSL *)ctls->ssl, (void *)buffer, (int)length)) <= 0)
|
while ((rc= SSL_write((SSL *)ctls->ssl, (void *)buffer, (int)length)) <= 0)
|
||||||
|
@@ -39,7 +39,7 @@ IF(GSSAPI_SOURCES)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(${WITH_SSL} STREQUAL "OPENSSL" OR ${WITH_SSL} STREQUAL "SCHANNEL")
|
IF(${WITH_SSL} STREQUAL "OPENSSL" OR ${WITH_SSL} STREQUAL "SCHANNEL")
|
||||||
IF(WIN32)
|
IF(WITH_SSL STREQUAL "SCHANNEL")
|
||||||
SET(SHA256_LIBS crypt32)
|
SET(SHA256_LIBS crypt32)
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(SHA256_LIBS ${SSL_LIBRARIES})
|
SET(SHA256_LIBS ${SSL_LIBRARIES})
|
||||||
|
@@ -142,7 +142,7 @@ char *load_pub_key_file(const char *filename, int *pub_key_size)
|
|||||||
if (bytes_read < (size_t)fsize)
|
if (bytes_read < (size_t)fsize)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
*pub_key_size= bytes_read;
|
*pub_key_size= (int)bytes_read;
|
||||||
|
|
||||||
error= 0;
|
error= 0;
|
||||||
|
|
||||||
|
@@ -34,11 +34,8 @@
|
|||||||
my_bool pvio_npipe_set_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
|
my_bool pvio_npipe_set_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
|
||||||
int pvio_npipe_get_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
|
int pvio_npipe_get_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
|
||||||
ssize_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
|
ssize_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
|
||||||
ssize_t pvio_npipe_async_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
|
|
||||||
ssize_t pvio_npipe_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
|
ssize_t pvio_npipe_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
|
||||||
ssize_t pvio_npipe_async_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
|
|
||||||
int pvio_npipe_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeout);
|
|
||||||
int pvio_npipe_blocking(MARIADB_PVIO *pvio, my_bool value, my_bool *old_value);
|
|
||||||
my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo);
|
my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo);
|
||||||
my_bool pvio_npipe_close(MARIADB_PVIO *pvio);
|
my_bool pvio_npipe_close(MARIADB_PVIO *pvio);
|
||||||
int pvio_npipe_fast_send(MARIADB_PVIO *pvio);
|
int pvio_npipe_fast_send(MARIADB_PVIO *pvio);
|
||||||
@@ -55,8 +52,8 @@ struct st_ma_pvio_methods pvio_npipe_methods= {
|
|||||||
NULL,
|
NULL,
|
||||||
pvio_npipe_write,
|
pvio_npipe_write,
|
||||||
NULL,
|
NULL,
|
||||||
pvio_npipe_wait_io_or_timeout,
|
NULL,
|
||||||
pvio_npipe_blocking,
|
NULL,
|
||||||
pvio_npipe_connect,
|
pvio_npipe_connect,
|
||||||
pvio_npipe_close,
|
pvio_npipe_close,
|
||||||
pvio_npipe_fast_send,
|
pvio_npipe_fast_send,
|
||||||
@@ -91,14 +88,22 @@ MARIADB_PVIO_PLUGIN _mysql_client_plugin_declaration_ =
|
|||||||
struct st_pvio_npipe {
|
struct st_pvio_npipe {
|
||||||
HANDLE pipe;
|
HANDLE pipe;
|
||||||
OVERLAPPED overlapped;
|
OVERLAPPED overlapped;
|
||||||
size_t rw_size;
|
|
||||||
MYSQL *mysql;
|
MYSQL *mysql;
|
||||||
};
|
};
|
||||||
|
|
||||||
my_bool pvio_npipe_set_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout)
|
my_bool pvio_npipe_set_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout)
|
||||||
{
|
{
|
||||||
|
int timeout_ms;
|
||||||
|
|
||||||
if (!pvio)
|
if (!pvio)
|
||||||
return 1;
|
return 1;
|
||||||
|
if (timeout > INT_MAX/1000)
|
||||||
|
timeout_ms= -1;
|
||||||
|
else if (timeout <=0)
|
||||||
|
timeout_ms= -1;
|
||||||
|
else
|
||||||
|
timeout_ms = timeout*100;
|
||||||
|
|
||||||
pvio->timeout[type]= (timeout > 0) ? timeout * 1000 : -1;
|
pvio->timeout[type]= (timeout > 0) ? timeout * 1000 : -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -110,103 +115,78 @@ int pvio_npipe_get_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type)
|
|||||||
return pvio->timeout[type] / 1000;
|
return pvio->timeout[type] / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL complete_io(HANDLE file, OVERLAPPED *ov, BOOL ret, DWORD timeout, DWORD *size)
|
||||||
|
{
|
||||||
|
if (ret)
|
||||||
|
timeout = 0; /* IO completed successfully, do not WaitForSingleObject */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(timeout);
|
||||||
|
if (GetLastError() != ERROR_IO_PENDING)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout)
|
||||||
|
{
|
||||||
|
HANDLE wait_handle= ov->hEvent;
|
||||||
|
assert(wait_handle && (wait_handle != INVALID_HANDLE_VALUE));
|
||||||
|
|
||||||
|
DWORD wait_ret= WaitForSingleObject(wait_handle, timeout);
|
||||||
|
switch (wait_ret)
|
||||||
|
{
|
||||||
|
case WAIT_OBJECT_0:
|
||||||
|
break;
|
||||||
|
case WAIT_TIMEOUT:
|
||||||
|
CancelIoEx(file, ov);
|
||||||
|
SetLastError(ERROR_TIMEOUT);
|
||||||
|
return FALSE;
|
||||||
|
default:
|
||||||
|
/* WAIT_ABANDONED or WAIT_FAILED unexpected. */
|
||||||
|
assert(0);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetOverlappedResult(file, ov, size, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
|
ssize_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
|
||||||
{
|
{
|
||||||
DWORD dwRead= 0;
|
BOOL ret;
|
||||||
ssize_t r= -1;
|
ssize_t r= -1;
|
||||||
struct st_pvio_npipe *cpipe= NULL;
|
struct st_pvio_npipe *cpipe= NULL;
|
||||||
|
DWORD size;
|
||||||
|
|
||||||
if (!pvio || !pvio->data)
|
if (!pvio || !pvio->data)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
cpipe= (struct st_pvio_npipe *)pvio->data;
|
cpipe= (struct st_pvio_npipe *)pvio->data;
|
||||||
|
|
||||||
if (ReadFile(cpipe->pipe, (LPVOID)buffer, (DWORD)length, &dwRead, &cpipe->overlapped))
|
ret= ReadFile(cpipe->pipe, buffer, (DWORD)length, NULL, &cpipe->overlapped);
|
||||||
{
|
ret= complete_io(cpipe->pipe, &cpipe->overlapped, ret, pvio->timeout[PVIO_READ_TIMEOUT], &size);
|
||||||
r= (ssize_t)dwRead;
|
r= ret? (ssize_t) size:-1;
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
if (GetLastError() == ERROR_IO_PENDING)
|
|
||||||
{
|
|
||||||
if (!pvio_npipe_wait_io_or_timeout(pvio, 1, 0))
|
|
||||||
r= cpipe->rw_size;
|
|
||||||
}
|
|
||||||
end:
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t pvio_npipe_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
|
ssize_t pvio_npipe_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
|
||||||
{
|
{
|
||||||
DWORD dwWrite= 0;
|
|
||||||
ssize_t r= -1;
|
ssize_t r= -1;
|
||||||
struct st_pvio_npipe *cpipe= NULL;
|
struct st_pvio_npipe *cpipe= NULL;
|
||||||
|
BOOL ret;
|
||||||
|
DWORD size;
|
||||||
|
|
||||||
if (!pvio || !pvio->data)
|
if (!pvio || !pvio->data)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
cpipe= (struct st_pvio_npipe *)pvio->data;
|
cpipe= (struct st_pvio_npipe *)pvio->data;
|
||||||
|
|
||||||
if (WriteFile(cpipe->pipe, buffer, (DWORD)length, &dwWrite, &cpipe->overlapped))
|
ret= WriteFile(cpipe->pipe, buffer, (DWORD)length, NULL , &cpipe->overlapped);
|
||||||
{
|
ret= complete_io(cpipe->pipe, &cpipe->overlapped, ret, pvio->timeout[PVIO_WRITE_TIMEOUT], &size);
|
||||||
r= (ssize_t)dwWrite;
|
r= ret ? (ssize_t)size : -1;
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
if (GetLastError() == ERROR_IO_PENDING)
|
|
||||||
{
|
|
||||||
if (!pvio_npipe_wait_io_or_timeout(pvio, 0, 0))
|
|
||||||
r= cpipe->rw_size;
|
|
||||||
}
|
|
||||||
end:
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pvio_npipe_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeout)
|
|
||||||
{
|
|
||||||
DWORD status;
|
|
||||||
int save_error;
|
|
||||||
struct st_pvio_npipe *cpipe= NULL;
|
|
||||||
|
|
||||||
cpipe= (struct st_pvio_npipe *)pvio->data;
|
|
||||||
|
|
||||||
if (!timeout)
|
|
||||||
timeout= (is_read) ? pvio->timeout[PVIO_READ_TIMEOUT] : pvio->timeout[PVIO_WRITE_TIMEOUT];
|
|
||||||
if (!timeout)
|
|
||||||
timeout= INFINITE;
|
|
||||||
|
|
||||||
status= WaitForSingleObject(cpipe->overlapped.hEvent, timeout);
|
|
||||||
if (status == WAIT_OBJECT_0)
|
|
||||||
{
|
|
||||||
if (GetOverlappedResult(cpipe->pipe, &cpipe->overlapped, (LPDWORD)&cpipe->rw_size, FALSE))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* For other status codes (WAIT_ABANDONED, WAIT_TIMEOUT and WAIT_FAILED)
|
|
||||||
we return error */
|
|
||||||
save_error= GetLastError();
|
|
||||||
CancelIo(cpipe->pipe);
|
|
||||||
SetLastError(save_error);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pvio_npipe_blocking(MARIADB_PVIO *pvio, my_bool block, my_bool *previous_mode)
|
|
||||||
{
|
|
||||||
/* not supported */
|
|
||||||
DWORD flags= 0;
|
|
||||||
struct st_pvio_npipe *cpipe= NULL;
|
|
||||||
|
|
||||||
cpipe= (struct st_pvio_npipe *)pvio->data;
|
|
||||||
|
|
||||||
if (previous_mode)
|
|
||||||
{
|
|
||||||
if (!GetNamedPipeHandleState(cpipe->pipe, &flags, NULL, NULL, NULL, NULL, 0))
|
|
||||||
return 1;
|
|
||||||
*previous_mode= flags & PIPE_NOWAIT ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
flags= block ? PIPE_WAIT : PIPE_NOWAIT;
|
|
||||||
if (!SetNamedPipeHandleState(cpipe->pipe, &flags, NULL, NULL))
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pvio_npipe_keepalive(MARIADB_PVIO *pvio)
|
int pvio_npipe_keepalive(MARIADB_PVIO *pvio)
|
||||||
{
|
{
|
||||||
@@ -245,10 +225,10 @@ my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
|
|||||||
|
|
||||||
if (cinfo->type == PVIO_TYPE_NAMEDPIPE)
|
if (cinfo->type == PVIO_TYPE_NAMEDPIPE)
|
||||||
{
|
{
|
||||||
my_bool has_timedout= 0;
|
|
||||||
char szPipeName[MAX_PATH];
|
char szPipeName[MAX_PATH];
|
||||||
DWORD dwMode;
|
ULONGLONG deadline;
|
||||||
|
LONGLONG wait_ms;
|
||||||
|
DWORD backoff= 0; /* Avoid busy wait if ERROR_PIPE_BUSY.*/
|
||||||
if ( ! cinfo->unix_socket || (cinfo->unix_socket)[0] == 0x00)
|
if ( ! cinfo->unix_socket || (cinfo->unix_socket)[0] == 0x00)
|
||||||
cinfo->unix_socket = MARIADB_NAMEDPIPE;
|
cinfo->unix_socket = MARIADB_NAMEDPIPE;
|
||||||
if (!cinfo->host || !strcmp(cinfo->host,LOCAL_HOST))
|
if (!cinfo->host || !strcmp(cinfo->host,LOCAL_HOST))
|
||||||
@@ -257,6 +237,7 @@ my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
|
|||||||
szPipeName[MAX_PATH - 1]= 0;
|
szPipeName[MAX_PATH - 1]= 0;
|
||||||
snprintf(szPipeName, MAX_PATH - 1, "\\\\%s\\pipe\\%s", cinfo->host, cinfo->unix_socket);
|
snprintf(szPipeName, MAX_PATH - 1, "\\\\%s\\pipe\\%s", cinfo->host, cinfo->unix_socket);
|
||||||
|
|
||||||
|
deadline = GetTickCount64() + pvio->timeout[PVIO_CONNECT_TIMEOUT];
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if ((cpipe->pipe = CreateFile(szPipeName,
|
if ((cpipe->pipe = CreateFile(szPipeName,
|
||||||
@@ -276,24 +257,23 @@ my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_timedout || !WaitNamedPipe(szPipeName, pvio->timeout[PVIO_CONNECT_TIMEOUT]))
|
Sleep(backoff);
|
||||||
|
if (!backoff)
|
||||||
|
backoff = 1;
|
||||||
|
|
||||||
|
wait_ms = deadline - GetTickCount64();
|
||||||
|
if (wait_ms > INFINITE)
|
||||||
|
wait_ms = INFINITE;
|
||||||
|
|
||||||
|
if ((wait_ms <= 0) || !WaitNamedPipe(szPipeName, (DWORD)wait_ms))
|
||||||
{
|
{
|
||||||
pvio->set_error(pvio->mysql, CR_NAMEDPIPEWAIT_ERROR, "HY000", 0,
|
pvio->set_error(pvio->mysql, CR_NAMEDPIPEWAIT_ERROR, "HY000", 0,
|
||||||
cinfo->host, cinfo->unix_socket, GetLastError());
|
cinfo->host, cinfo->unix_socket, ERROR_TIMEOUT);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
has_timedout= 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dwMode = PIPE_READMODE_BYTE | PIPE_WAIT;
|
|
||||||
if (!SetNamedPipeHandleState(cpipe->pipe, &dwMode, NULL, NULL))
|
|
||||||
{
|
|
||||||
pvio->set_error(pvio->mysql, CR_NAMEDPIPESETSTATE_ERROR, "HY000", 0,
|
|
||||||
cinfo->host, cinfo->unix_socket, (ulong) GetLastError());
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Register event handler for overlapped IO */
|
|
||||||
if (!(cpipe->overlapped.hEvent= CreateEvent(NULL, FALSE, FALSE, NULL)))
|
if (!(cpipe->overlapped.hEvent= CreateEvent(NULL, FALSE, FALSE, NULL)))
|
||||||
{
|
{
|
||||||
pvio->set_error(pvio->mysql, CR_EVENT_CREATE_FAILED, "HY000", 0,
|
pvio->set_error(pvio->mysql, CR_EVENT_CREATE_FAILED, "HY000", 0,
|
||||||
@@ -348,14 +328,7 @@ my_bool pvio_npipe_get_handle(MARIADB_PVIO *pvio, void *handle)
|
|||||||
|
|
||||||
my_bool pvio_npipe_is_blocking(MARIADB_PVIO *pvio)
|
my_bool pvio_npipe_is_blocking(MARIADB_PVIO *pvio)
|
||||||
{
|
{
|
||||||
DWORD flags= 0;
|
return 1;
|
||||||
struct st_pvio_npipe *cpipe= NULL;
|
|
||||||
|
|
||||||
cpipe= (struct st_pvio_npipe *)pvio->data;
|
|
||||||
|
|
||||||
if (!GetNamedPipeHandleState(cpipe->pipe, &flags, NULL, NULL, NULL, NULL, 0))
|
|
||||||
return 1;
|
|
||||||
return (flags & PIPE_NOWAIT) ? 0 : 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pvio_npipe_shutdown(MARIADB_PVIO *pvio)
|
int pvio_npipe_shutdown(MARIADB_PVIO *pvio)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
#include "my_test.h"
|
#include "my_test.h"
|
||||||
|
|
||||||
#define MAX_COUNT 4000
|
#define MAX_COUNT 2000
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ int main(int argc, char *argv[]) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mysql_real_connect(mysql, hostname, username, password, NULL, port, NULL, 0)) {
|
if (!mysql_real_connect(mysql, hostname, username, password, schema, port, socketname, 0)) {
|
||||||
diag("mysql_real_connect failed: %s", mysql_error(mysql));
|
diag("mysql_real_connect failed: %s", mysql_error(mysql));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user