Merge branch 'gh-287'

This commit is contained in:
Alexey Kopytov
2019-01-16 16:33:04 +03:00
2 changed files with 54 additions and 10 deletions

View File

@ -114,7 +114,24 @@ AC_DEFINE([USE_MYSQL], 1,
USE_MYSQL=1
AC_SUBST([MYSQL_LIBS])
AC_SUBST([MYSQL_CFLAGS])
AC_MSG_CHECKING([if mysql.h defines MYSQL_OPT_SSL_MODE])
SAVE_CFLAGS="${CFLAGS}"
CFLAGS="${CFLAGS} ${MYSQL_CFLAGS}"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[
#include <mysql.h>
enum mysql_option opt = MYSQL_OPT_SSL_MODE;
]])], [
AC_DEFINE([HAVE_MYSQL_OPT_SSL_MODE], 1,
[Define to 1 if mysql.h defines MYSQL_OPT_SSL_MODE])
AC_MSG_RESULT([yes])
], [AC_MSG_RESULT([no])])
])
CFLAGS="${SAVE_CFLAGS}"
AM_CONDITIONAL([USE_MYSQL], test "x$with_mysql" != xno)
AC_SUBST([USE_MYSQL])

View File

@ -64,7 +64,7 @@ static sb_arg_t mysql_drv_args[] =
SB_OPT("mysql-user", "MySQL user", "sbtest", STRING),
SB_OPT("mysql-password", "MySQL password", "", STRING),
SB_OPT("mysql-db", "MySQL database name", "sbtest", STRING),
#ifdef MYSQL_OPT_SSL_MODE
#ifdef HAVE_MYSQL_OPT_SSL_MODE
SB_OPT("mysql-ssl", "SSL mode. This accepts the same values as the "
"--ssl-mode option in the MySQL client utilities. Disabled by default",
"disabled", STRING),
@ -98,8 +98,8 @@ typedef struct
const char *user;
const char *password;
const char *db;
#ifdef MYSQL_OPT_SSL_MODE
int ssl_mode;
#ifdef HAVE_MYSQL_OPT_SSL_MODE
unsigned int ssl_mode;
#endif
bool use_ssl;
const char *ssl_key;
@ -123,6 +123,14 @@ typedef struct
char *socket;
} db_mysql_conn_t;
#ifdef HAVE_MYSQL_OPT_SSL_MODE
typedef struct {
const char *name;
enum mysql_ssl_mode mode;
} ssl_mode_map_t;
#endif
/* Structure used for DB-to-MySQL bind types map */
typedef struct
@ -172,6 +180,17 @@ static sb_list_item_t *sockets_pos;
static pthread_mutex_t pos_mutex;
#ifdef HAVE_MYSQL_OPT_SSL_MODE
static ssl_mode_map_t ssl_mode_names[] = {
{"DISABLED", SSL_MODE_DISABLED},
{"PREFERRED", SSL_MODE_PREFERRED},
{"REQUIRED", SSL_MODE_REQUIRED},
{"VERIFY_CA", SSL_MODE_VERIFY_CA},
{"VERIFY_IDENTITY", SSL_MODE_VERIFY_IDENTITY},
{NULL, 0}
};
#endif
/* MySQL driver operations */
static int mysql_drv_init(void);
@ -272,12 +291,21 @@ int mysql_drv_init(void)
args.ssl_cert = sb_get_value_string("mysql-ssl-cert");
args.ssl_ca = sb_get_value_string("mysql-ssl-ca");
#ifdef MYSQL_OPT_SSL_MODE
#ifdef HAVE_MYSQL_OPT_SSL_MODE
const char * const ssl_mode_string = sb_get_value_string("mysql-ssl");
args.ssl_mode = find_type(ssl_mode_string, ssl_mode_typelib, FIND_TYPE_BASIC);
if (args.ssl_mode <= 0)
args.ssl_mode = 0;
for (int i = 0; ssl_mode_names[i].name != NULL; i++) {
if (!strcasecmp(ssl_mode_string, ssl_mode_names[i].name)) {
args.ssl_mode = ssl_mode_names[i].mode;
break;
}
}
if (args.ssl_mode == 0)
{
log_text(LOG_FATAL, "Invalid value for --mysql-ssl: '%s'");
log_text(LOG_FATAL, "Invalid value for --mysql-ssl: '%s'", ssl_mode_string);
return 1;
}
@ -344,9 +372,9 @@ static int mysql_drv_real_connect(db_mysql_conn_t *db_mysql_con)
{
MYSQL *con = db_mysql_con->mysql;
#ifdef MYSQL_OPT_SSL_MODE
#ifdef HAVE_MYSQL_OPT_SSL_MODE
DEBUG("mysql_options(%p,%s,%d)", con, "MYSQL_OPT_SSL_MODE", args.ssl_mode);
mysql_options(con, MYSQL_OPT_SSL_MODE, args.ssl_mode);
mysql_options(con, MYSQL_OPT_SSL_MODE, &args.ssl_mode);
#endif
if (args.use_ssl)
@ -357,7 +385,6 @@ static int mysql_drv_real_connect(db_mysql_conn_t *db_mysql_con)
mysql_ssl_set(con, args.ssl_key, args.ssl_cert, args.ssl_ca, NULL,
args.ssl_cipher);
}
if (args.use_compression)