summaryrefslogtreecommitdiff
path: root/storage/spider
diff options
context:
space:
mode:
authorKentoku SHIBA <kentokushiba@gmail.com>2020-07-01 09:10:22 +0900
committerKentoku SHIBA <kentokushiba@gmail.com>2020-08-07 03:21:42 +0900
commit5585c9f984540fa55cc655c845bcabb505a8e100 (patch)
treecb6bc978f4589f7b188c55b13ae2e4de60f37745 /storage/spider
parent0dffe33c93e1453ba21ccc9b4f4ce879236abd30 (diff)
downloadmariadb-git-5585c9f984540fa55cc655c845bcabb505a8e100.tar.gz
add a table parameter "driver" to Spider
Diffstat (limited to 'storage/spider')
-rw-r--r--storage/spider/spd_conn.cc13
-rw-r--r--storage/spider/spd_direct_sql.cc28
-rw-r--r--storage/spider/spd_include.h14
-rw-r--r--storage/spider/spd_init_query.h16
-rw-r--r--storage/spider/spd_sys_table.cc74
-rw-r--r--storage/spider/spd_sys_table.h8
-rw-r--r--storage/spider/spd_table.cc85
-rw-r--r--storage/spider/spd_trx.cc29
8 files changed, 240 insertions, 27 deletions
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc
index eed0a79ae44..1099a69e983 100644
--- a/storage/spider/spd_conn.cc
+++ b/storage/spider/spd_conn.cc
@@ -566,7 +566,7 @@ SPIDER_CONN *spider_create_conn(
char *tmp_name, *tmp_host, *tmp_username, *tmp_password, *tmp_socket;
char *tmp_wrapper, *tmp_db, *tmp_ssl_ca, *tmp_ssl_capath, *tmp_ssl_cert;
char *tmp_ssl_cipher, *tmp_ssl_key, *tmp_default_file, *tmp_default_group;
- char *tmp_dsn, *tmp_filedsn;
+ char *tmp_dsn, *tmp_filedsn, *tmp_driver;
DBUG_ENTER("spider_create_conn");
if (unlikely(!UTC))
@@ -620,6 +620,8 @@ SPIDER_CONN *spider_create_conn(
(uint) (share->tgt_dsns_lengths[link_idx] + 1),
&tmp_filedsn,
(uint) (share->tgt_filedsns_lengths[link_idx] + 1),
+ &tmp_driver,
+ (uint) (share->tgt_drivers_lengths[link_idx] + 1),
&need_mon, (uint) (sizeof(int)),
NullS))
) {
@@ -737,6 +739,15 @@ SPIDER_CONN *spider_create_conn(
share->tgt_filedsns_lengths[link_idx]);
} else
conn->tgt_filedsn = NULL;
+ conn->tgt_driver_length =
+ share->tgt_drivers_lengths[link_idx];
+ if (conn->tgt_driver_length)
+ {
+ conn->tgt_driver = tmp_driver;
+ memcpy(conn->tgt_driver, share->tgt_drivers[link_idx],
+ share->tgt_drivers_lengths[link_idx]);
+ } else
+ conn->tgt_driver = NULL;
conn->tgt_port = share->tgt_ports[link_idx];
conn->tgt_ssl_vsc = share->tgt_ssl_vscs[link_idx];
conn->dbton_id = share->sql_dbton_ids[link_idx];
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index 35c3cb92797..055b07226c6 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -290,7 +290,8 @@ int spider_udf_direct_sql_create_conn_key(
+ direct_sql->tgt_default_file_length + 1
+ direct_sql->tgt_default_group_length + 1
+ direct_sql->tgt_dsn_length + 1
- + direct_sql->tgt_filedsn_length;
+ + direct_sql->tgt_filedsn_length + 1
+ + direct_sql->tgt_driver_length;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
direct_sql->conn_key_length
@@ -411,6 +412,13 @@ int spider_udf_direct_sql_create_conn_key(
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_filedsn);
} else
tmp_name++;
+ if (direct_sql->tgt_driver)
+ {
+ DBUG_PRINT("info",("spider tgt_driver=%s",
+ direct_sql->tgt_driver));
+ tmp_name = strmov(tmp_name + 1, direct_sql->tgt_driver);
+ } else
+ tmp_name++;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
}
#endif
@@ -430,7 +438,7 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
char *tmp_name, *tmp_host, *tmp_username, *tmp_password, *tmp_socket;
char *tmp_wrapper, *tmp_db, *tmp_ssl_ca, *tmp_ssl_capath, *tmp_ssl_cert;
char *tmp_ssl_cipher, *tmp_ssl_key, *tmp_default_file, *tmp_default_group;
- char *tmp_dsn, *tmp_filedsn;
+ char *tmp_dsn, *tmp_filedsn, *tmp_driver;
int *need_mon;
bool tables_on_different_db_are_joinable = TRUE;
DBUG_ENTER("spider_udf_direct_sql_create_conn");
@@ -473,6 +481,8 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
(uint) (direct_sql->tgt_dsn_length + 1),
&tmp_filedsn,
(uint) (direct_sql->tgt_filedsn_length + 1),
+ &tmp_driver,
+ (uint) (direct_sql->tgt_driver_length + 1),
&need_mon, (uint) (sizeof(int)),
NullS))
) {
@@ -605,6 +615,14 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
direct_sql->tgt_filedsn_length);
} else
conn->tgt_filedsn = NULL;
+ conn->tgt_driver_length = direct_sql->tgt_driver_length;
+ if (conn->tgt_driver_length)
+ {
+ conn->tgt_driver = tmp_driver;
+ memcpy(conn->tgt_driver, direct_sql->tgt_driver,
+ direct_sql->tgt_driver_length);
+ } else
+ conn->tgt_driver = NULL;
conn->tgt_ssl_vsc = direct_sql->tgt_ssl_vsc;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
@@ -1275,6 +1293,7 @@ int spider_udf_parse_direct_sql_param(
SPIDER_PARAM_INT("cto", connect_timeout, 0);
SPIDER_PARAM_STR("dff", tgt_default_file);
SPIDER_PARAM_STR("dfg", tgt_default_group);
+ SPIDER_PARAM_STR("drv", tgt_driver);
SPIDER_PARAM_STR("dsn", tgt_dsn);
SPIDER_PARAM_STR("fds", tgt_filedsn);
SPIDER_PARAM_LONGLONG("prt", priority, 0);
@@ -1302,6 +1321,7 @@ int spider_udf_parse_direct_sql_param(
error_num = param_string_parse.print_param_error();
goto error;
case 6:
+ SPIDER_PARAM_STR("driver", tgt_driver);
SPIDER_PARAM_STR("server", server_name);
SPIDER_PARAM_STR("socket", tgt_socket);
SPIDER_PARAM_HINT_WITH_MAX("iop", iop, 3, direct_sql->table_count, 0, 2);
@@ -1709,6 +1729,10 @@ void spider_udf_free_direct_sql_alloc(
{
spider_free(spider_current_trx, direct_sql->tgt_filedsn, MYF(0));
}
+ if (direct_sql->tgt_driver)
+ {
+ spider_free(spider_current_trx, direct_sql->tgt_driver, MYF(0));
+ }
if (direct_sql->conn_key)
{
spider_free(spider_current_trx, direct_sql->conn_key, MYF(0));
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index 0edd17f365c..a369b738ffe 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -256,7 +256,7 @@ const char SPIDER_empty_string = "";
#define SPIDER_LINK_MON_DRAW_FEW_MON 1
#define SPIDER_LINK_MON_DRAW 2
-#define SPIDER_TMP_SHARE_CHAR_PTR_COUNT 22
+#define SPIDER_TMP_SHARE_CHAR_PTR_COUNT 23
#define SPIDER_TMP_SHARE_UINT_COUNT SPIDER_TMP_SHARE_CHAR_PTR_COUNT
#define SPIDER_TMP_SHARE_LONG_COUNT 20
#define SPIDER_TMP_SHARE_LONGLONG_COUNT 3
@@ -353,6 +353,7 @@ typedef struct st_spider_alter_table
char **tmp_tgt_default_groups;
char **tmp_tgt_dsns;
char **tmp_tgt_filedsns;
+ char **tmp_tgt_drivers;
char **tmp_static_link_ids;
long *tmp_tgt_ports;
long *tmp_tgt_ssl_vscs;
@@ -376,6 +377,7 @@ typedef struct st_spider_alter_table
uint *tmp_tgt_default_groups_lengths;
uint *tmp_tgt_dsns_lengths;
uint *tmp_tgt_filedsns_lengths;
+ uint *tmp_tgt_drivers_lengths;
uint *tmp_static_link_ids_lengths;
uint tmp_server_names_charlen;
@@ -395,6 +397,7 @@ typedef struct st_spider_alter_table
uint tmp_tgt_default_groups_charlen;
uint tmp_tgt_dsns_charlen;
uint tmp_tgt_filedsns_charlen;
+ uint tmp_tgt_drivers_charlen;
uint tmp_static_link_ids_charlen;
uint tmp_server_names_length;
@@ -414,6 +417,7 @@ typedef struct st_spider_alter_table
uint tmp_tgt_default_groups_length;
uint tmp_tgt_dsns_length;
uint tmp_tgt_filedsns_length;
+ uint tmp_tgt_drivers_length;
uint tmp_static_link_ids_length;
uint tmp_tgt_ports_length;
uint tmp_tgt_ssl_vscs_length;
@@ -500,6 +504,7 @@ typedef struct st_spider_conn
char *tgt_default_group;
char *tgt_dsn;
char *tgt_filedsn;
+ char *tgt_driver;
long tgt_port;
long tgt_ssl_vsc;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -522,6 +527,7 @@ typedef struct st_spider_conn
uint tgt_default_group_length;
uint tgt_dsn_length;
uint tgt_filedsn_length;
+ uint tgt_driver_length;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
uint hs_sock_length;
#endif
@@ -1130,6 +1136,7 @@ typedef struct st_spider_share
char **tgt_default_groups;
char **tgt_dsns;
char **tgt_filedsns;
+ char **tgt_drivers;
char **static_link_ids;
char **tgt_pk_names;
char **tgt_sequence_names;
@@ -1187,6 +1194,7 @@ typedef struct st_spider_share
uint *tgt_default_groups_lengths;
uint *tgt_dsns_lengths;
uint *tgt_filedsns_lengths;
+ uint *tgt_drivers_lengths;
uint *static_link_ids_lengths;
uint *tgt_pk_names_lengths;
uint *tgt_sequence_names_lengths;
@@ -1219,6 +1227,7 @@ typedef struct st_spider_share
uint tgt_default_groups_charlen;
uint tgt_dsns_charlen;
uint tgt_filedsns_charlen;
+ uint tgt_drivers_charlen;
uint static_link_ids_charlen;
uint tgt_pk_names_charlen;
uint tgt_sequence_names_charlen;
@@ -1247,6 +1256,7 @@ typedef struct st_spider_share
uint tgt_default_groups_length;
uint tgt_dsns_length;
uint tgt_filedsns_length;
+ uint tgt_drivers_length;
uint static_link_ids_length;
uint tgt_pk_names_length;
uint tgt_sequence_names_length;
@@ -1384,6 +1394,7 @@ typedef struct st_spider_direct_sql
char *tgt_default_group;
char *tgt_dsn;
char *tgt_filedsn;
+ char *tgt_driver;
char *conn_key;
long tgt_port;
long tgt_ssl_vsc;
@@ -1404,6 +1415,7 @@ typedef struct st_spider_direct_sql
uint tgt_default_group_length;
uint tgt_dsn_length;
uint tgt_filedsn_length;
+ uint tgt_driver_length;
uint conn_key_length;
uint dbton_id;
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
diff --git a/storage/spider/spd_init_query.h b/storage/spider/spd_init_query.h
index 819b3fb7447..19b04d50b82 100644
--- a/storage/spider/spd_init_query.h
+++ b/storage/spider/spd_init_query.h
@@ -53,6 +53,7 @@ static LEX_STRING spider_init_queries[] = {
" default_group char(64) default null,"
" dsn char(64) default null,"
" filedsn text default null,"
+ " driver char(64) default null,"
" key idx1 (data, format_id, gtrid_length, host)"
") engine=MyISAM default charset=utf8 collate=utf8_bin"
)},
@@ -78,6 +79,7 @@ static LEX_STRING spider_init_queries[] = {
" default_group char(64) default null,"
" dsn char(64) default null,"
" filedsn text default null,"
+ " driver char(64) default null,"
" thread_id int default null,"
" status char(8) not null default '',"
" failed_time timestamp not null default current_timestamp,"
@@ -108,6 +110,7 @@ static LEX_STRING spider_init_queries[] = {
" default_group char(64) default null,"
" dsn char(64) default null,"
" filedsn text default null,"
+ " driver char(64) default null,"
" tgt_db_name char(64) default null,"
" tgt_table_name char(64) default null,"
" link_status tinyint not null default 1,"
@@ -141,6 +144,7 @@ static LEX_STRING spider_init_queries[] = {
" default_group char(64) default null,"
" dsn char(64) default null,"
" filedsn text default null,"
+ " driver char(64) default null,"
" primary key (db_name, table_name, link_id, sid)"
") engine=MyISAM default charset=utf8 collate=utf8_bin"
)},
@@ -630,6 +634,18 @@ static LEX_STRING spider_init_queries[] = {
" call mysql.spider_fix_one_table('spider_xa_member', 'filedsn',"
" 'alter table mysql.spider_xa_member"
" add column filedsn text default null after dsn');"
+ " call mysql.spider_fix_one_table('spider_link_mon_servers', 'driver',"
+ " 'alter table mysql.spider_link_mon_servers"
+ " add column driver char(64) default null after filedsn');"
+ " call mysql.spider_fix_one_table('spider_tables', 'driver',"
+ " 'alter table mysql.spider_tables"
+ " add column driver char(64) default null after filedsn');"
+ " call mysql.spider_fix_one_table('spider_xa_failed_log', 'driver',"
+ " 'alter table mysql.spider_xa_failed_log"
+ " add column driver char(64) default null after filedsn');"
+ " call mysql.spider_fix_one_table('spider_xa_member', 'driver',"
+ " 'alter table mysql.spider_xa_member"
+ " add column driver char(64) default null after filedsn');"
"end;"
)},
{C_STRING_WITH_LEN(
diff --git a/storage/spider/spd_sys_table.cc b/storage/spider/spd_sys_table.cc
index 0934cb87885..ed456d8fd67 100644
--- a/storage/spider/spd_sys_table.cc
+++ b/storage/spider/spd_sys_table.cc
@@ -65,9 +65,10 @@ extern Time_zone *spd_tz_system;
#define SPIDER_XA_MEMBER_DEFAULT_GROUP_POS 17
#define SPIDER_XA_MEMBER_DSN_POS 18
#define SPIDER_XA_MEMBER_FILEDSN_POS 19
-#define SPIDER_XA_FAILED_LOG_THREAD_ID_POS 20
-#define SPIDER_XA_FAILED_LOG_STATUS_POS 21
-#define SPIDER_XA_FAILED_LOG_FAILED_TIME_POS 22
+#define SPIDER_XA_MEMBER_DRIVER_POS 20
+#define SPIDER_XA_FAILED_LOG_THREAD_ID_POS 21
+#define SPIDER_XA_FAILED_LOG_STATUS_POS 22
+#define SPIDER_XA_FAILED_LOG_FAILED_TIME_POS 23
#define SPIDER_TABLES_DB_NAME_POS 0
#define SPIDER_TABLES_TABLE_NAME_POS 1
@@ -91,11 +92,12 @@ extern Time_zone *spd_tz_system;
#define SPIDER_TABLES_DEFAULT_GROUP_POS 19
#define SPIDER_TABLES_DSN_POS 20
#define SPIDER_TABLES_FILEDSN_POS 21
-#define SPIDER_TABLES_TGT_DB_NAME_POS 22
-#define SPIDER_TABLES_TGT_TABLE_NAME_POS 23
-#define SPIDER_TABLES_LINK_STATUS_POS 24
-#define SPIDER_TABLES_BLOCK_STATUS_POS 25
-#define SPIDER_TABLES_STATIC_LINK_ID_POS 26
+#define SPIDER_TABLES_DRIVER_POS 22
+#define SPIDER_TABLES_TGT_DB_NAME_POS 23
+#define SPIDER_TABLES_TGT_TABLE_NAME_POS 24
+#define SPIDER_TABLES_LINK_STATUS_POS 25
+#define SPIDER_TABLES_BLOCK_STATUS_POS 26
+#define SPIDER_TABLES_STATIC_LINK_ID_POS 27
#define SPIDER_LINK_MON_SERVERS_DB_NAME_POS 0
#define SPIDER_LINK_MON_SERVERS_TABLE_NAME_POS 1
@@ -118,6 +120,7 @@ extern Time_zone *spd_tz_system;
#define SPIDER_LINK_MON_SERVERS_DEFAULT_GROUP_POS 18
#define SPIDER_LINK_MON_SERVERS_DSN_POS 19
#define SPIDER_LINK_MON_SERVERS_FILEDSN_POS 20
+#define SPIDER_LINK_MON_SERVERS_DRIVER_POS 21
#define SPIDER_LINK_FAILED_LOG_DB_NAME_POS 0
#define SPIDER_LINK_FAILED_LOG_TABLE_NAME_POS 1
@@ -1120,6 +1123,17 @@ void spider_store_xa_member_info(
table->field[SPIDER_XA_MEMBER_FILEDSN_POS]->set_null();
table->field[SPIDER_XA_MEMBER_FILEDSN_POS]->reset();
}
+ if (conn->tgt_driver)
+ {
+ table->field[SPIDER_XA_MEMBER_DRIVER_POS]->set_notnull();
+ table->field[SPIDER_XA_MEMBER_DRIVER_POS]->store(
+ conn->tgt_driver,
+ (uint) conn->tgt_driver_length,
+ system_charset_info);
+ } else {
+ table->field[SPIDER_XA_MEMBER_DRIVER_POS]->set_null();
+ table->field[SPIDER_XA_MEMBER_DRIVER_POS]->reset();
+ }
DBUG_VOID_RETURN;
}
@@ -1445,6 +1459,17 @@ void spider_store_tables_connect_info(
table->field[SPIDER_TABLES_FILEDSN_POS]->set_null();
table->field[SPIDER_TABLES_FILEDSN_POS]->reset();
}
+ if (alter_table->tmp_tgt_drivers[link_idx])
+ {
+ table->field[SPIDER_TABLES_DRIVER_POS]->set_notnull();
+ table->field[SPIDER_TABLES_DRIVER_POS]->store(
+ alter_table->tmp_tgt_drivers[link_idx],
+ (uint) alter_table->tmp_tgt_drivers_lengths[link_idx],
+ system_charset_info);
+ } else {
+ table->field[SPIDER_TABLES_DRIVER_POS]->set_null();
+ table->field[SPIDER_TABLES_DRIVER_POS]->reset();
+ }
if (alter_table->tmp_tgt_dbs[link_idx])
{
table->field[SPIDER_TABLES_TGT_DB_NAME_POS]->set_notnull();
@@ -2441,6 +2466,17 @@ int spider_get_sys_server_info(
share->tgt_filedsns_lengths[link_idx] = 0;
share->tgt_filedsns[link_idx] = NULL;
}
+ if (
+ !table->field[SPIDER_XA_MEMBER_DRIVER_POS]->is_null() &&
+ (ptr = get_field(mem_root, table->field[SPIDER_XA_MEMBER_DRIVER_POS]))
+ ) {
+ share->tgt_drivers_lengths[link_idx] = strlen(ptr);
+ share->tgt_drivers[link_idx] =
+ spider_create_string(ptr, share->tgt_drivers_lengths[link_idx]);
+ } else {
+ share->tgt_drivers_lengths[link_idx] = 0;
+ share->tgt_drivers[link_idx] = NULL;
+ }
DBUG_RETURN(0);
}
@@ -2711,6 +2747,17 @@ int spider_get_sys_tables_connect_info(
share->tgt_filedsns[link_idx] = NULL;
}
if (
+ !table->field[SPIDER_TABLES_DRIVER_POS]->is_null() &&
+ (ptr = get_field(mem_root, table->field[SPIDER_TABLES_DRIVER_POS]))
+ ) {
+ share->tgt_drivers_lengths[link_idx] = strlen(ptr);
+ share->tgt_drivers[link_idx] =
+ spider_create_string(ptr, share->tgt_drivers_lengths[link_idx]);
+ } else {
+ share->tgt_drivers_lengths[link_idx] = 0;
+ share->tgt_drivers[link_idx] = NULL;
+ }
+ if (
!table->field[SPIDER_TABLES_TGT_DB_NAME_POS]->is_null() &&
(ptr = get_field(mem_root, table->field[SPIDER_TABLES_TGT_DB_NAME_POS]))
) {
@@ -3317,6 +3364,17 @@ int spider_get_sys_link_mon_connect_info(
share->tgt_filedsns_lengths[link_idx] = 0;
share->tgt_filedsns[link_idx] = NULL;
}
+ if (
+ !table->field[SPIDER_LINK_MON_SERVERS_DRIVER_POS]->is_null() &&
+ (ptr = get_field(mem_root, table->field[SPIDER_LINK_MON_SERVERS_DRIVER_POS]))
+ ) {
+ share->tgt_drivers_lengths[link_idx] = strlen(ptr);
+ share->tgt_drivers[link_idx] =
+ spider_create_string(ptr, share->tgt_drivers_lengths[link_idx]);
+ } else {
+ share->tgt_drivers_lengths[link_idx] = 0;
+ share->tgt_drivers[link_idx] = NULL;
+ }
DBUG_RETURN(error_num);
}
diff --git a/storage/spider/spd_sys_table.h b/storage/spider/spd_sys_table.h
index 2c97f1041d7..90d9ca70a81 100644
--- a/storage/spider/spd_sys_table.h
+++ b/storage/spider/spd_sys_table.h
@@ -51,15 +51,15 @@
#define SPIDER_SYS_XA_COL_CNT 5
#define SPIDER_SYS_XA_PK_COL_CNT 3
#define SPIDER_SYS_XA_IDX1_COL_CNT 1
-#define SPIDER_SYS_XA_MEMBER_COL_CNT 20
+#define SPIDER_SYS_XA_MEMBER_COL_CNT 21
#define SPIDER_SYS_XA_MEMBER_PK_COL_CNT 6
-#define SPIDER_SYS_TABLES_COL_CNT 27
+#define SPIDER_SYS_TABLES_COL_CNT 28
#define SPIDER_SYS_TABLES_PK_COL_CNT 3
#define SPIDER_SYS_TABLES_IDX1_COL_CNT 1
#define SPIDER_SYS_TABLES_UIDX1_COL_CNT 3
-#define SPIDER_SYS_LINK_MON_TABLE_COL_CNT 21
+#define SPIDER_SYS_LINK_MON_TABLE_COL_CNT 22
#define SPIDER_SYS_LINK_FAILED_TABLE_COL_CNT 4
-#define SPIDER_SYS_XA_FAILED_TABLE_COL_CNT 23
+#define SPIDER_SYS_XA_FAILED_TABLE_COL_CNT 24
#define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_COL_CNT 7
#define SPIDER_SYS_TABLE_STS_COL_CNT 11
#define SPIDER_SYS_TABLE_STS_PK_COL_CNT 2
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index b3b9f6eac88..9c449d0fa34 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -821,6 +821,17 @@ int spider_free_share_alloc(
}
spider_free(spider_current_trx, share->tgt_filedsns, MYF(0));
}
+ if (share->tgt_drivers)
+ {
+ for (roop_count = 0; roop_count < (int) share->tgt_drivers_length;
+ roop_count++)
+ {
+ if (share->tgt_drivers[roop_count])
+ spider_free(spider_current_trx, share->tgt_drivers[roop_count],
+ MYF(0));
+ }
+ spider_free(spider_current_trx, share->tgt_drivers, MYF(0));
+ }
if (share->tgt_pk_names)
{
for (roop_count = 0; roop_count < (int) share->tgt_pk_names_length;
@@ -1036,6 +1047,11 @@ void spider_free_tmp_share_alloc(
spider_free(spider_current_trx, share->tgt_filedsns[0], MYF(0));
share->tgt_filedsns[0] = NULL;
}
+ if (share->tgt_drivers && share->tgt_drivers[0])
+ {
+ spider_free(spider_current_trx, share->tgt_drivers[0], MYF(0));
+ share->tgt_drivers[0] = NULL;
+ }
if (share->tgt_pk_names && share->tgt_pk_names[0])
{
spider_free(spider_current_trx, share->tgt_pk_names[0], MYF(0));
@@ -2339,6 +2355,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_STR_LIST("dff", tgt_default_files);
SPIDER_PARAM_STR_LIST("dfg", tgt_default_groups);
SPIDER_PARAM_LONGLONG("dol", direct_order_limit, 0);
+ SPIDER_PARAM_STR_LIST("drv", tgt_drivers);
SPIDER_PARAM_STR_LIST("dsn", tgt_dsns);
SPIDER_PARAM_INT_WITH_MAX("erm", error_read_mode, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("ewm", error_write_mode, 0, 1);
@@ -2457,6 +2474,7 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 6:
+ SPIDER_PARAM_STR_LIST("driver", tgt_drivers);
SPIDER_PARAM_STR_LIST("server", server_names);
SPIDER_PARAM_STR_LIST("socket", tgt_sockets);
SPIDER_PARAM_HINT("idx", key_hint, 3, (int) table_share->keys,
@@ -2763,6 +2781,8 @@ int spider_parse_connect_info(
share->all_link_count = share->tgt_dsns_length;
if (share->all_link_count < share->tgt_filedsns_length)
share->all_link_count = share->tgt_filedsns_length;
+ if (share->all_link_count < share->tgt_drivers_length)
+ share->all_link_count = share->tgt_drivers_length;
if (share->all_link_count < share->tgt_pk_names_length)
share->all_link_count = share->tgt_pk_names_length;
if (share->all_link_count < share->tgt_sequence_names_length)
@@ -2943,6 +2963,13 @@ int spider_parse_connect_info(
share->all_link_count)))
goto error;
if ((error_num = spider_increase_string_list(
+ &share->tgt_drivers,
+ &share->tgt_drivers_lengths,
+ &share->tgt_drivers_length,
+ &share->tgt_drivers_charlen,
+ share->all_link_count)))
+ goto error;
+ if ((error_num = spider_increase_string_list(
&share->tgt_pk_names,
&share->tgt_pk_names_lengths,
&share->tgt_pk_names_length,
@@ -3138,6 +3165,8 @@ int spider_parse_connect_info(
(uint) (sizeof(char *) * share->all_link_count),
&share_alter->tmp_tgt_filedsns,
(uint) (sizeof(char *) * share->all_link_count),
+ &share_alter->tmp_tgt_drivers,
+ (uint) (sizeof(char *) * share->all_link_count),
&share_alter->tmp_static_link_ids,
(uint) (sizeof(char *) * share->all_link_count),
&share_alter->tmp_server_names_lengths,
@@ -3174,6 +3203,8 @@ int spider_parse_connect_info(
(uint) (sizeof(uint *) * share->all_link_count),
&share_alter->tmp_tgt_filedsns_lengths,
(uint) (sizeof(uint *) * share->all_link_count),
+ &share_alter->tmp_tgt_drivers_lengths,
+ (uint) (sizeof(uint *) * share->all_link_count),
&share_alter->tmp_static_link_ids_lengths,
(uint) (sizeof(uint *) * share->all_link_count),
&share_alter->tmp_tgt_ports,
@@ -3225,6 +3256,8 @@ int spider_parse_connect_info(
sizeof(char *) * share->all_link_count);
memcpy(share_alter->tmp_tgt_filedsns, share->tgt_filedsns,
sizeof(char *) * share->all_link_count);
+ memcpy(share_alter->tmp_tgt_drivers, share->tgt_drivers,
+ sizeof(char *) * share->all_link_count);
memcpy(share_alter->tmp_static_link_ids, share->static_link_ids,
sizeof(char *) * share->all_link_count);
@@ -3286,6 +3319,9 @@ int spider_parse_connect_info(
memcpy(share_alter->tmp_tgt_filedsns_lengths,
share->tgt_filedsns_lengths,
sizeof(uint) * share->all_link_count);
+ memcpy(share_alter->tmp_tgt_drivers_lengths,
+ share->tgt_drivers_lengths,
+ sizeof(uint) * share->all_link_count);
memcpy(share_alter->tmp_static_link_ids_lengths,
share->static_link_ids_lengths,
sizeof(uint) * share->all_link_count);
@@ -3311,6 +3347,8 @@ int spider_parse_connect_info(
share->tgt_dsns_charlen;
share_alter->tmp_tgt_filedsns_charlen =
share->tgt_filedsns_charlen;
+ share_alter->tmp_tgt_drivers_charlen =
+ share->tgt_drivers_charlen;
share_alter->tmp_static_link_ids_charlen =
share->static_link_ids_charlen;
@@ -3334,6 +3372,8 @@ int spider_parse_connect_info(
share->tgt_dsns_length;
share_alter->tmp_tgt_filedsns_length =
share->tgt_filedsns_length;
+ share_alter->tmp_tgt_drivers_length =
+ share->tgt_drivers_length;
share_alter->tmp_static_link_ids_length =
share->static_link_ids_length;
share_alter->tmp_tgt_ports_length = share->tgt_ports_length;
@@ -3581,6 +3621,18 @@ int spider_parse_connect_info(
}
DBUG_PRINT("info",
+ ("spider tgt_drivers_lengths[%d] = %u", roop_count,
+ share->tgt_drivers_lengths[roop_count]));
+ if (share->tgt_drivers_lengths[roop_count] >
+ SPIDER_CONNECT_INFO_MAX_LEN)
+ {
+ error_num = ER_SPIDER_INVALID_CONNECT_INFO_TOO_LONG_NUM;
+ my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_TOO_LONG_STR,
+ MYF(0), share->tgt_drivers[roop_count], "driver");
+ goto error;
+ }
+
+ DBUG_PRINT("info",
("spider tgt_pk_names_lengths[%d] = %u", roop_count,
share->tgt_pk_names_lengths[roop_count]));
if (share->tgt_pk_names_lengths[roop_count] >
@@ -4420,7 +4472,8 @@ int spider_create_conn_keys(
+ share->tgt_default_files_lengths[roop_count] + 1
+ share->tgt_default_groups_lengths[roop_count] + 1
+ share->tgt_dsns_lengths[roop_count] + 1
- + share->tgt_filedsns_lengths[roop_count];
+ + share->tgt_filedsns_lengths[roop_count] + 1
+ + share->tgt_drivers_lengths[roop_count];
share->conn_keys_charlen += conn_keys_lengths[roop_count] + 2;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
hs_r_conn_keys_lengths[roop_count]
@@ -4611,6 +4664,13 @@ int spider_create_conn_keys(
tmp_name = strmov(tmp_name + 1, share->tgt_filedsns[roop_count]);
} else
tmp_name++;
+ if (share->tgt_drivers[roop_count])
+ {
+ DBUG_PRINT("info",("spider tgt_drivers[%d]=%s", roop_count,
+ share->tgt_drivers[roop_count]));
+ tmp_name = strmov(tmp_name + 1, share->tgt_drivers[roop_count]);
+ } else
+ tmp_name++;
tmp_name++;
tmp_name++;
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
@@ -8599,12 +8659,13 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_default_groups = &tmp_connect_info[14];
tmp_share->tgt_dsns = &tmp_connect_info[15];
tmp_share->tgt_filedsns = &tmp_connect_info[16];
- tmp_share->tgt_pk_names = &tmp_connect_info[17];
- tmp_share->tgt_sequence_names = &tmp_connect_info[18];
- tmp_share->static_link_ids = &tmp_connect_info[19];
+ tmp_share->tgt_drivers = &tmp_connect_info[17];
+ tmp_share->tgt_pk_names = &tmp_connect_info[18];
+ tmp_share->tgt_sequence_names = &tmp_connect_info[19];
+ tmp_share->static_link_ids = &tmp_connect_info[20];
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->hs_read_socks = &tmp_connect_info[20];
- tmp_share->hs_write_socks = &tmp_connect_info[21];
+ tmp_share->hs_read_socks = &tmp_connect_info[21];
+ tmp_share->hs_write_socks = &tmp_connect_info[22];
#endif
tmp_share->tgt_ports = &tmp_long[0];
tmp_share->tgt_ssl_vscs = &tmp_long[1];
@@ -8655,12 +8716,13 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_default_groups_lengths = &tmp_connect_info_length[14];
tmp_share->tgt_dsns_lengths = &tmp_connect_info_length[15];
tmp_share->tgt_filedsns_lengths = &tmp_connect_info_length[16];
- tmp_share->tgt_pk_names_lengths = &tmp_connect_info_length[17];
- tmp_share->tgt_sequence_names_lengths = &tmp_connect_info_length[18];
- tmp_share->static_link_ids_lengths = &tmp_connect_info_length[19];
+ tmp_share->tgt_drivers_lengths = &tmp_connect_info_length[17];
+ tmp_share->tgt_pk_names_lengths = &tmp_connect_info_length[18];
+ tmp_share->tgt_sequence_names_lengths = &tmp_connect_info_length[19];
+ tmp_share->static_link_ids_lengths = &tmp_connect_info_length[20];
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->hs_read_socks_lengths = &tmp_connect_info_length[20];
- tmp_share->hs_write_socks_lengths = &tmp_connect_info_length[21];
+ tmp_share->hs_read_socks_lengths = &tmp_connect_info_length[21];
+ tmp_share->hs_write_socks_lengths = &tmp_connect_info_length[22];
#endif
tmp_share->server_names_length = 1;
tmp_share->tgt_table_names_length = 1;
@@ -8679,6 +8741,7 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_default_groups_length = 1;
tmp_share->tgt_dsns_length = 1;
tmp_share->tgt_filedsns_length = 1;
+ tmp_share->tgt_drivers_length = 1;
tmp_share->tgt_pk_names_length = 1;
tmp_share->tgt_sequence_names_length = 1;
tmp_share->static_link_ids_length = 1;
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index c8fcaa1ac3f..166e100688c 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -507,6 +507,7 @@ int spider_create_trx_alter_table(
char **tmp_tgt_default_groups;
char **tmp_tgt_dsns;
char **tmp_tgt_filedsns;
+ char **tmp_tgt_drivers;
char **tmp_static_link_ids;
uint *tmp_server_names_lengths;
uint *tmp_tgt_table_names_lengths;
@@ -525,6 +526,7 @@ int spider_create_trx_alter_table(
uint *tmp_tgt_default_groups_lengths;
uint *tmp_tgt_dsns_lengths;
uint *tmp_tgt_filedsns_lengths;
+ uint *tmp_tgt_drivers_lengths;
uint *tmp_static_link_ids_lengths;
long *tmp_tgt_ports;
long *tmp_tgt_ssl_vscs;
@@ -547,6 +549,7 @@ int spider_create_trx_alter_table(
char *tmp_tgt_default_groups_char;
char *tmp_tgt_dsns_char;
char *tmp_tgt_filedsns_char;
+ char *tmp_tgt_drivers_char;
char *tmp_static_link_ids_char;
uint old_elements;
@@ -575,6 +578,7 @@ int spider_create_trx_alter_table(
&tmp_tgt_default_groups, (uint) (sizeof(char *) * share->all_link_count),
&tmp_tgt_dsns, (uint) (sizeof(char *) * share->all_link_count),
&tmp_tgt_filedsns, (uint) (sizeof(char *) * share->all_link_count),
+ &tmp_tgt_drivers, (uint) (sizeof(char *) * share->all_link_count),
&tmp_static_link_ids, (uint) (sizeof(char *) * share->all_link_count),
&tmp_server_names_lengths, (uint) (sizeof(uint) * share->all_link_count),
@@ -602,6 +606,7 @@ int spider_create_trx_alter_table(
(uint) (sizeof(uint) * share->all_link_count),
&tmp_tgt_dsns_lengths, (uint) (sizeof(uint) * share->all_link_count),
&tmp_tgt_filedsns_lengths, (uint) (sizeof(uint) * share->all_link_count),
+ &tmp_tgt_drivers_lengths, (uint) (sizeof(uint) * share->all_link_count),
&tmp_static_link_ids_lengths,
(uint) (sizeof(uint) * share->all_link_count),
@@ -645,6 +650,8 @@ int spider_create_trx_alter_table(
(share_alter->tmp_tgt_dsns_charlen + 1)),
&tmp_tgt_filedsns_char, (uint) (sizeof(char) *
(share_alter->tmp_tgt_filedsns_charlen + 1)),
+ &tmp_tgt_drivers_char, (uint) (sizeof(char) *
+ (share_alter->tmp_tgt_drivers_charlen + 1)),
&tmp_static_link_ids_char, (uint) (sizeof(char) *
(share_alter->tmp_static_link_ids_charlen + 1)),
NullS))
@@ -682,6 +689,7 @@ int spider_create_trx_alter_table(
alter_table->tmp_tgt_default_groups = tmp_tgt_default_groups;
alter_table->tmp_tgt_dsns = tmp_tgt_dsns;
alter_table->tmp_tgt_filedsns = tmp_tgt_filedsns;
+ alter_table->tmp_tgt_drivers = tmp_tgt_drivers;
alter_table->tmp_static_link_ids = tmp_static_link_ids;
alter_table->tmp_tgt_ports = tmp_tgt_ports;
@@ -707,6 +715,7 @@ int spider_create_trx_alter_table(
alter_table->tmp_tgt_default_groups_lengths = tmp_tgt_default_groups_lengths;
alter_table->tmp_tgt_dsns_lengths = tmp_tgt_dsns_lengths;
alter_table->tmp_tgt_filedsns_lengths = tmp_tgt_filedsns_lengths;
+ alter_table->tmp_tgt_drivers_lengths = tmp_tgt_drivers_lengths;
alter_table->tmp_static_link_ids_lengths = tmp_static_link_ids_lengths;
for(roop_count = 0; roop_count < (int) share->all_link_count; roop_count++)
@@ -819,6 +828,12 @@ int spider_create_trx_alter_table(
tmp_tgt_filedsns_char +=
share_alter->tmp_tgt_filedsns_lengths[roop_count] + 1;
+ tmp_tgt_drivers[roop_count] = tmp_tgt_drivers_char;
+ memcpy(tmp_tgt_drivers_char, share_alter->tmp_tgt_drivers[roop_count],
+ sizeof(char) * share_alter->tmp_tgt_drivers_lengths[roop_count]);
+ tmp_tgt_drivers_char +=
+ share_alter->tmp_tgt_drivers_lengths[roop_count] + 1;
+
if (share_alter->tmp_static_link_ids[roop_count])
{
tmp_static_link_ids[roop_count] = tmp_static_link_ids_char;
@@ -876,6 +891,8 @@ int spider_create_trx_alter_table(
sizeof(uint) * share->all_link_count);
memcpy(tmp_tgt_filedsns_lengths, share_alter->tmp_tgt_filedsns_lengths,
sizeof(uint) * share->all_link_count);
+ memcpy(tmp_tgt_drivers_lengths, share_alter->tmp_tgt_drivers_lengths,
+ sizeof(uint) * share->all_link_count);
memcpy(tmp_static_link_ids_lengths,
share_alter->tmp_static_link_ids_lengths,
sizeof(uint) * share->all_link_count);
@@ -914,6 +931,8 @@ int spider_create_trx_alter_table(
share_alter->tmp_tgt_dsns_length;
alter_table->tmp_tgt_filedsns_length =
share_alter->tmp_tgt_filedsns_length;
+ alter_table->tmp_tgt_drivers_length =
+ share_alter->tmp_tgt_drivers_length;
alter_table->tmp_static_link_ids_length =
share_alter->tmp_static_link_ids_length;
alter_table->tmp_tgt_ports_length =
@@ -1138,6 +1157,16 @@ bool spider_cmp_trx_alter_table(
)
) ||
(
+ cmp1->tmp_tgt_drivers[roop_count] !=
+ cmp2->tmp_tgt_drivers[roop_count] &&
+ (
+ !cmp1->tmp_tgt_drivers[roop_count] ||
+ !cmp2->tmp_tgt_drivers[roop_count] ||
+ strcmp(cmp1->tmp_tgt_drivers[roop_count],
+ cmp2->tmp_tgt_drivers[roop_count])
+ )
+ ) ||
+ (
cmp1->tmp_static_link_ids[roop_count] !=
cmp2->tmp_static_link_ids[roop_count] &&
(