diff options
author | Kentoku SHIBA <kentokushiba@gmail.com> | 2020-07-01 09:10:22 +0900 |
---|---|---|
committer | Kentoku SHIBA <kentokushiba@gmail.com> | 2020-08-07 03:21:42 +0900 |
commit | 5585c9f984540fa55cc655c845bcabb505a8e100 (patch) | |
tree | cb6bc978f4589f7b188c55b13ae2e4de60f37745 /storage/spider | |
parent | 0dffe33c93e1453ba21ccc9b4f4ce879236abd30 (diff) | |
download | mariadb-git-5585c9f984540fa55cc655c845bcabb505a8e100.tar.gz |
add a table parameter "driver" to Spider
Diffstat (limited to 'storage/spider')
-rw-r--r-- | storage/spider/spd_conn.cc | 13 | ||||
-rw-r--r-- | storage/spider/spd_direct_sql.cc | 28 | ||||
-rw-r--r-- | storage/spider/spd_include.h | 14 | ||||
-rw-r--r-- | storage/spider/spd_init_query.h | 16 | ||||
-rw-r--r-- | storage/spider/spd_sys_table.cc | 74 | ||||
-rw-r--r-- | storage/spider/spd_sys_table.h | 8 | ||||
-rw-r--r-- | storage/spider/spd_table.cc | 85 | ||||
-rw-r--r-- | storage/spider/spd_trx.cc | 29 |
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] && ( |