diff options
-rw-r--r-- | storage/spider/spd_copy_tables.cc | 84 | ||||
-rw-r--r-- | storage/spider/spd_direct_sql.cc | 116 | ||||
-rw-r--r-- | storage/spider/spd_table.cc | 245 | ||||
-rw-r--r-- | storage/spider/spd_table.h | 216 |
4 files changed, 419 insertions, 242 deletions
diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc index 97ad1c70631..82c0c490147 100644 --- a/storage/spider/spd_copy_tables.cc +++ b/storage/spider/spd_copy_tables.cc @@ -87,13 +87,12 @@ int spider_udf_set_copy_tables_param_default( if (!copy_tables->param_name) \ { \ if ((copy_tables->param_name = spider_get_string_between_quote( \ - start_ptr, TRUE))) \ + start_ptr, TRUE, ¶m_string_parse))) \ copy_tables->SPIDER_PARAM_STR_LEN(param_name) = \ strlen(copy_tables->param_name); \ - else { \ - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \ - MYF(0), tmp_ptr); \ + else \ + { \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%s", copy_tables->param_name)); \ @@ -113,9 +112,7 @@ int spider_udf_set_copy_tables_param_default( { \ if (hint_num < 0 || hint_num >= max_size) \ { \ - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } else if (copy_tables->param_name[hint_num] != -1) \ break; \ @@ -128,17 +125,13 @@ int spider_udf_set_copy_tables_param_default( else if (copy_tables->param_name[hint_num] > max_val) \ copy_tables->param_name[hint_num] = max_val; \ } else { \ - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \ copy_tables->param_name[hint_num])); \ } else { \ - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ break; \ @@ -157,10 +150,11 @@ int spider_udf_set_copy_tables_param_default( copy_tables->param_name = min_val; \ else if (copy_tables->param_name > max_val) \ copy_tables->param_name = max_val; \ + param_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \ @@ -179,10 +173,11 @@ int spider_udf_set_copy_tables_param_default( copy_tables->param_name = atoi(tmp_ptr2); \ if (copy_tables->param_name < min_val) \ copy_tables->param_name = min_val; \ + param_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \ @@ -202,10 +197,11 @@ int spider_udf_set_copy_tables_param_default( my_strtoll10(tmp_ptr2, (char**) NULL, &error_num); \ if (copy_tables->param_name < min_val) \ copy_tables->param_name = min_val; \ + param_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%lld", \ @@ -224,6 +220,7 @@ int spider_udf_parse_copy_tables_param( char *sprit_ptr[2]; char *tmp_ptr, *tmp_ptr2, *start_ptr; int title_length; + SPIDER_PARAM_STRING_PARSE param_string_parse; DBUG_ENTER("spider_udf_parse_copy_tables_param"); copy_tables->bulk_insert_interval = -1; copy_tables->bulk_insert_rows = -1; @@ -248,6 +245,7 @@ int spider_udf_parse_copy_tables_param( DBUG_PRINT("info",("spider param_string=%s", param_string)); sprit_ptr[0] = param_string; + param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM); while (sprit_ptr[0]) { if ((sprit_ptr[1] = strchr(sprit_ptr[0], ','))) @@ -274,10 +272,14 @@ int spider_udf_parse_copy_tables_param( title_length++; start_ptr++; } + param_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length); switch (title_length) { case 0: + error_num = param_string_parse.print_param_error(); + if (error_num) + goto error; continue; case 3: #ifndef WITHOUT_SPIDER_BG_SEARCH @@ -288,55 +290,43 @@ int spider_udf_parse_copy_tables_param( SPIDER_PARAM_STR("dtb", database); SPIDER_PARAM_INT_WITH_MAX("utc", use_table_charset, 0, 1); SPIDER_PARAM_INT_WITH_MAX("utr", use_transaction, 0, 1); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; #ifndef WITHOUT_SPIDER_BG_SEARCH case 7: SPIDER_PARAM_INT_WITH_MAX("bg_mode", bg_mode, 0, 1); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; #endif case 8: SPIDER_PARAM_STR("database", database); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 15: SPIDER_PARAM_INT_WITH_MAX("use_transaction", use_transaction, 0, 1); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 16: SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 17: SPIDER_PARAM_INT_WITH_MAX( "use_table_charset", use_table_charset, 0, 1); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 20: SPIDER_PARAM_INT("bulk_insert_interval", bulk_insert_interval, 0); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; default: - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; } + + /* Verify that the remainder of the parameter value is whitespace */ + if ((error_num = param_string_parse.has_extra_parameter_values())) + goto error; } set_default: diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc index 4d69d9af615..de355c1068d 100644 --- a/storage/spider/spd_direct_sql.cc +++ b/storage/spider/spd_direct_sql.cc @@ -973,13 +973,12 @@ error: if (!direct_sql->param_name) \ { \ if ((direct_sql->param_name = spider_get_string_between_quote( \ - start_ptr, TRUE))) \ + start_ptr, TRUE, ¶m_string_parse))) \ direct_sql->SPIDER_PARAM_STR_LEN(param_name) = \ strlen(direct_sql->param_name); \ - else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + else \ + { \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%s", direct_sql->param_name)); \ @@ -999,9 +998,7 @@ error: { \ if (hint_num < 0 || hint_num >= max_size) \ { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } else if (direct_sql->param_name[hint_num] != -1) \ break; \ @@ -1014,17 +1011,13 @@ error: else if (direct_sql->param_name[hint_num] > max_val) \ direct_sql->param_name[hint_num] = max_val; \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \ direct_sql->param_name[hint_num])); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ break; \ @@ -1043,10 +1036,11 @@ error: direct_sql->param_name = min_val; \ else if (direct_sql->param_name > max_val) \ direct_sql->param_name = max_val; \ + param_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%d", \ @@ -1066,10 +1060,11 @@ error: direct_sql->param_name = atoi(tmp_ptr2); \ if (direct_sql->param_name < min_val) \ direct_sql->param_name = min_val; \ + param_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%d", direct_sql->param_name)); \ @@ -1089,10 +1084,11 @@ error: my_strtoll10(tmp_ptr2, (char**) NULL, &error_num); \ if (direct_sql->param_name < min_val) \ direct_sql->param_name = min_val; \ + param_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = param_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%lld", \ @@ -1112,6 +1108,7 @@ int spider_udf_parse_direct_sql_param( char *sprit_ptr[2]; char *tmp_ptr, *tmp_ptr2, *start_ptr; int title_length; + SPIDER_PARAM_STRING_PARSE param_string_parse; DBUG_ENTER("spider_udf_parse_direct_sql_param"); direct_sql->tgt_port = -1; direct_sql->tgt_ssl_vsc = -1; @@ -1148,6 +1145,7 @@ int spider_udf_parse_direct_sql_param( DBUG_PRINT("info",("spider param_string=%s", param_string)); sprit_ptr[0] = param_string; + param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM); while (sprit_ptr[0]) { if ((sprit_ptr[1] = strchr(sprit_ptr[0], ','))) @@ -1174,10 +1172,14 @@ int spider_udf_parse_direct_sql_param( title_length++; start_ptr++; } + param_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length); switch (title_length) { case 0: + error_num = param_string_parse.print_param_error(); + if (error_num) + goto error; continue; case 3: #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) @@ -1203,120 +1205,92 @@ int spider_udf_parse_direct_sql_param( SPIDER_PARAM_INT_WITH_MAX("urt", use_real_table, 0, 1); #endif SPIDER_PARAM_INT("wto", net_write_timeout, 0); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 4: SPIDER_PARAM_INT_WITH_MAX("erwm", error_rw_mode, 0, 1); SPIDER_PARAM_STR("host", tgt_host); SPIDER_PARAM_INT_WITH_MAX("port", tgt_port, 0, 65535); SPIDER_PARAM_STR("user", tgt_username); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 6: 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); SPIDER_PARAM_STR("ssl_ca", tgt_ssl_ca); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 7: SPIDER_PARAM_STR("wrapper", tgt_wrapper); SPIDER_PARAM_STR("ssl_key", tgt_ssl_key); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 8: SPIDER_PARAM_STR("database", tgt_default_db_name); SPIDER_PARAM_STR("password", tgt_password); SPIDER_PARAM_LONGLONG("priority", priority, 0); SPIDER_PARAM_STR("ssl_cert", tgt_ssl_cert); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 10: SPIDER_PARAM_STR("ssl_cipher", tgt_ssl_cipher); SPIDER_PARAM_STR("ssl_capath", tgt_ssl_capath); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 11: #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) SPIDER_PARAM_INT_WITH_MAX("access_mode", access_mode, 0, 2); #endif - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 12: SPIDER_PARAM_STR("default_file", tgt_default_file); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 13: SPIDER_PARAM_STR("default_group", tgt_default_group); SPIDER_PARAM_INT_WITH_MAX("error_rw_mode", error_rw_mode, 0, 1); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 14: #if MYSQL_VERSION_ID < 50500 #else SPIDER_PARAM_INT_WITH_MAX("use_real_table", use_real_table, 0, 1); #endif - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 15: SPIDER_PARAM_INT_WITH_MAX("table_loop_mode", table_loop_mode, 0, 2); SPIDER_PARAM_INT("connect_timeout", connect_timeout, 0); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 16: SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1); SPIDER_PARAM_INT("net_read_timeout", net_read_timeout, 0); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 17: SPIDER_PARAM_INT("net_write_timeout", net_write_timeout, 0); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 18: SPIDER_PARAM_INT_WITH_MAX( "connection_channel", connection_channel, 0, 63); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; case 22: SPIDER_PARAM_INT_WITH_MAX("ssl_verify_server_cert", tgt_ssl_vsc, 0, 1); - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; default: - error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, - MYF(0), tmp_ptr); + error_num = param_string_parse.print_param_error(); goto error; } + + /* Verify that the remainder of the parameter value is whitespace */ + if ((error_num = param_string_parse.has_extra_parameter_values())) + goto error; } set_default: diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 76032ca80f0..80b02bafa64 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -1048,7 +1048,8 @@ void spider_free_tmp_share_alloc( char *spider_get_string_between_quote( char *ptr, - bool alloc + bool alloc, + SPIDER_PARAM_STRING_PARSE *param_string_parse ) { char *start_ptr, *end_ptr, *tmp_ptr, *esc_ptr; bool find_flg = FALSE, esc_flg = FALSE; @@ -1139,6 +1140,10 @@ char *spider_get_string_between_quote( strcpy(esc_ptr, esc_ptr + 1); } } + + if (param_string_parse) + param_string_parse->set_param_value(start_ptr, start_ptr + strlen(start_ptr) + 1); + if (alloc) { DBUG_RETURN( @@ -1156,7 +1161,8 @@ int spider_create_string_list( uint **string_length_list, uint *list_length, char *str, - uint length + uint length, + SPIDER_PARAM_STRING_PARSE *param_string_parse ) { int roop_count; char *tmp_ptr, *tmp_ptr2, *tmp_ptr3, *esc_ptr; @@ -1164,6 +1170,7 @@ int spider_create_string_list( DBUG_ENTER("spider_create_string_list"); *list_length = 0; + param_string_parse->init_param_value(); if (!str) { *string_list = NULL; @@ -1274,6 +1281,10 @@ int spider_create_string_list( my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } + + param_string_parse->set_param_value(tmp_ptr3, + tmp_ptr3 + strlen(tmp_ptr3) + 1); + DBUG_PRINT("info",("spider string_list[%d]=%s", roop_count, (*string_list)[roop_count])); @@ -1286,13 +1297,15 @@ int spider_create_long_list( char *str, uint length, long min_val, - long max_val + long max_val, + SPIDER_PARAM_STRING_PARSE *param_string_parse ) { int roop_count; char *tmp_ptr; DBUG_ENTER("spider_create_long_list"); *list_length = 0; + param_string_parse->init_param_value(); if (!str) { *long_list = NULL; @@ -1348,6 +1361,9 @@ int spider_create_long_list( (*long_list)[roop_count] = max_val; } + param_string_parse->set_param_value(tmp_ptr, + tmp_ptr + strlen(tmp_ptr) + 1); + #ifndef DBUG_OFF for (roop_count = 0; roop_count < (int) *list_length; roop_count++) { @@ -1365,13 +1381,15 @@ int spider_create_longlong_list( char *str, uint length, longlong min_val, - longlong max_val + longlong max_val, + SPIDER_PARAM_STRING_PARSE *param_string_parse ) { int error_num, roop_count; char *tmp_ptr; DBUG_ENTER("spider_create_longlong_list"); *list_length = 0; + param_string_parse->init_param_value(); if (!str) { *longlong_list = NULL; @@ -1428,6 +1446,9 @@ int spider_create_longlong_list( (*longlong_list)[roop_count] = max_val; } + param_string_parse->set_param_value(tmp_ptr, + tmp_ptr + strlen(tmp_ptr) + 1); + #ifndef DBUG_OFF for (roop_count = 0; roop_count < (int) *list_length; roop_count++) { @@ -1667,6 +1688,38 @@ static int spider_set_ll_value( DBUG_RETURN(error_num); } +/** + Print a parameter string error message. + + @return Error code. +*/ + +int st_spider_param_string_parse::print_param_error() +{ + if (start_title_ptr) + { + /* Restore the input delimiter characters */ + restore_delims(); + + /* Print the error message */ + switch (error_num) + { + case ER_SPIDER_INVALID_UDF_PARAM_NUM: + my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, + MYF(0), start_title_ptr); + break; + case ER_SPIDER_INVALID_CONNECT_INFO_NUM: + default: + my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, + MYF(0), start_title_ptr); + } + + return error_num; + } + else + return 0; +} + #define SPIDER_PARAM_STR_LEN(name) name ## _length #define SPIDER_PARAM_STR(title_name, param_name) \ if (!strncasecmp(tmp_ptr, title_name, title_length)) \ @@ -1675,12 +1728,11 @@ static int spider_set_ll_value( if (!share->param_name) \ { \ if ((share->param_name = spider_get_string_between_quote( \ - start_ptr, TRUE))) \ + start_ptr, TRUE, &connect_string_parse))) \ share->SPIDER_PARAM_STR_LEN(param_name) = strlen(share->param_name); \ - else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + else \ + { \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%s", share->param_name)); \ @@ -1704,12 +1756,11 @@ static int spider_set_ll_value( &share->SPIDER_PARAM_STR_LENS(param_name), \ &share->SPIDER_PARAM_STR_LEN(param_name), \ tmp_ptr2, \ - share->SPIDER_PARAM_STR_CHARLEN(param_name)))) \ + share->SPIDER_PARAM_STR_CHARLEN(param_name), \ + &connect_string_parse))) \ goto error; \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ } \ @@ -1727,9 +1778,7 @@ static int spider_set_ll_value( { \ if (hint_num < 0 || hint_num >= max_size) \ { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } else if (share->param_name[hint_num].length() > 0) \ break; \ @@ -1740,9 +1789,7 @@ static int spider_set_ll_value( DBUG_PRINT("info",("spider " title_name "[%d]=%s", hint_num, \ share->param_name[hint_num].ptr())); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ break; \ @@ -1759,9 +1806,7 @@ static int spider_set_ll_value( { \ if (hint_num < 0 || hint_num >= max_size) \ { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } else if (share->param_name[hint_num] != -1) \ break; \ @@ -1772,9 +1817,7 @@ static int spider_set_ll_value( DBUG_PRINT("info",("spider " title_name "[%d]=%lld", hint_num, \ share->param_name[hint_num])); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ break; \ @@ -1795,12 +1838,11 @@ static int spider_set_ll_value( &share->SPIDER_PARAM_LONG_LEN(param_name), \ tmp_ptr2, \ strlen(tmp_ptr2), \ - min_val, max_val))) \ + min_val, max_val, \ + &connect_string_parse))) \ goto error; \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ } \ @@ -1822,12 +1864,11 @@ static int spider_set_ll_value( &share->SPIDER_PARAM_LONGLONG_LEN(param_name), \ tmp_ptr2, \ strlen(tmp_ptr2), \ - min_val, max_val))) \ + min_val, max_val, \ + &connect_string_parse))) \ goto error; \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ } \ @@ -1847,10 +1888,11 @@ static int spider_set_ll_value( share->param_name = min_val; \ else if (share->param_name > max_val) \ share->param_name = max_val; \ + connect_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%d", share->param_name)); \ @@ -1869,10 +1911,11 @@ static int spider_set_ll_value( share->param_name = atoi(tmp_ptr2); \ if (share->param_name < min_val) \ share->param_name = min_val; \ + connect_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%d", share->param_name)); \ @@ -1891,10 +1934,11 @@ static int spider_set_ll_value( share->param_name = my_atof(tmp_ptr2); \ if (share->param_name < min_val) \ share->param_name = min_val; \ + connect_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%f", share->param_name)); \ @@ -1913,10 +1957,11 @@ static int spider_set_ll_value( share->param_name = my_strtoll10(tmp_ptr2, (char**) NULL, &error_num); \ if (share->param_name < min_val) \ share->param_name = min_val; \ + connect_string_parse.set_param_value(tmp_ptr2, \ + tmp_ptr2 + \ + strlen(tmp_ptr2) + 1); \ } else { \ - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \ - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \ - MYF(0), tmp_ptr); \ + error_num = connect_string_parse.print_param_error(); \ goto error; \ } \ DBUG_PRINT("info",("spider " title_name "=%lld", share->param_name)); \ @@ -1938,6 +1983,7 @@ int spider_parse_connect_info( char *tmp_ptr, *tmp_ptr2, *start_ptr; int roop_count; int title_length; + SPIDER_PARAM_STRING_PARSE connect_string_parse; SPIDER_ALTER_TABLE *share_alter; #ifdef WITH_PARTITION_STORAGE_ENGINE partition_element *part_elem; @@ -2126,6 +2172,7 @@ int spider_parse_connect_info( } sprit_ptr[0] = connect_string; + connect_string_parse.init(connect_string, ER_SPIDER_INVALID_CONNECT_INFO_NUM); while (sprit_ptr[0]) { if ((sprit_ptr[1] = strchr(sprit_ptr[0], ','))) @@ -2152,10 +2199,14 @@ int spider_parse_connect_info( title_length++; start_ptr++; } + connect_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length); switch (title_length) { case 0: + error_num = connect_string_parse.print_param_error(); + if (error_num) + goto error; continue; case 3: SPIDER_PARAM_LONG_LIST_WITH_MAX("abl", access_balances, 0, @@ -2296,23 +2347,17 @@ int spider_parse_connect_info( #endif SPIDER_PARAM_INT_WITH_MAX("upu", use_pushdown_udf, 0, 1); SPIDER_PARAM_INT_WITH_MAX("utc", use_table_charset, 0, 1); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 4: SPIDER_PARAM_STR_LIST("host", tgt_hosts); SPIDER_PARAM_STR_LIST("user", tgt_usernames); SPIDER_PARAM_LONG_LIST_WITH_MAX("port", tgt_ports, 0, 65535); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 5: SPIDER_PARAM_STR_LIST("table", tgt_table_names); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 6: SPIDER_PARAM_STR_LIST("server", server_names); @@ -2322,17 +2367,13 @@ int spider_parse_connect_info( SPIDER_PARAM_STR_LIST("ssl_ca", tgt_ssl_cas); SPIDER_PARAM_NUMHINT("skc", static_key_cardinality, 3, (int) table_share->keys, spider_set_ll_value); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 7: SPIDER_PARAM_STR_LIST("wrapper", tgt_wrappers); SPIDER_PARAM_STR_LIST("ssl_key", tgt_ssl_keys); SPIDER_PARAM_STR_LIST("pk_name", tgt_pk_names); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 8: SPIDER_PARAM_STR_LIST("database", tgt_dbs); @@ -2352,18 +2393,14 @@ int spider_parse_connect_info( #endif SPIDER_PARAM_STR_LIST("ssl_cert", tgt_ssl_certs); SPIDER_PARAM_INT_WITH_MAX("bka_mode", bka_mode, 0, 2); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 9: SPIDER_PARAM_INT("max_order", max_order, 0); SPIDER_PARAM_INT("bulk_size", bulk_size, 0); SPIDER_PARAM_DOUBLE("scan_rate", scan_rate, 0); SPIDER_PARAM_DOUBLE("read_rate", read_rate, 0); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 10: SPIDER_PARAM_DOUBLE("crd_weight", crd_weight, 1); @@ -2373,9 +2410,7 @@ int spider_parse_connect_info( SPIDER_PARAM_STR_LIST("ssl_capath", tgt_ssl_capaths); SPIDER_PARAM_STR("bka_engine", bka_engine); SPIDER_PARAM_LONGLONG("first_read", first_read, 0); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 11: SPIDER_PARAM_INT_WITH_MAX("query_cache", query_cache, 0, 2); @@ -2389,9 +2424,7 @@ int spider_parse_connect_info( SPIDER_PARAM_LONG_LIST_WITH_MAX("use_hs_read", use_hs_reads, 0, 1); #endif SPIDER_PARAM_INT_WITH_MAX("casual_read", casual_read, 0, 63); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 12: SPIDER_PARAM_DOUBLE("sts_interval", sts_interval, 0); @@ -2404,9 +2437,7 @@ int spider_parse_connect_info( SPIDER_PARAM_LONG_LIST_WITH_MAX( "hs_read_port", hs_read_ports, 0, 65535); #endif - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 13: SPIDER_PARAM_STR_LIST("default_group", tgt_default_groups); @@ -2415,9 +2446,7 @@ int spider_parse_connect_info( "hs_write_port", hs_write_ports, 0, 65535); #endif SPIDER_PARAM_STR_LIST("sequence_name", tgt_sequence_names); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 14: SPIDER_PARAM_LONGLONG("internal_limit", internal_limit, 0); @@ -2434,9 +2463,7 @@ int spider_parse_connect_info( SPIDER_PARAM_STR_LIST("static_link_id", static_link_ids); SPIDER_PARAM_INT_WITH_MAX("store_last_crd", store_last_crd, 0, 1); SPIDER_PARAM_INT_WITH_MAX("store_last_sts", store_last_sts, 0, 1); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 15: SPIDER_PARAM_LONGLONG("internal_offset", internal_offset, 0); @@ -2456,9 +2483,7 @@ int spider_parse_connect_info( SPIDER_PARAM_LONG_LIST_WITH_MAX("connect_timeout", connect_timeouts, 0, 2147483647); SPIDER_PARAM_INT_WITH_MAX("error_read_mode", error_read_mode, 0, 1); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 16: SPIDER_PARAM_INT_WITH_MAX( @@ -2490,9 +2515,7 @@ int spider_parse_connect_info( #endif SPIDER_PARAM_INT_WITH_MAX( "query_cache_sync", query_cache_sync, 0, 3); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 17: SPIDER_PARAM_INT_WITH_MAX( @@ -2512,9 +2535,7 @@ int spider_parse_connect_info( SPIDER_PARAM_INT_WITH_MAX( "force_bulk_update", force_bulk_update, 0, 1); #endif - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 18: SPIDER_PARAM_INT_WITH_MAX( @@ -2527,9 +2548,7 @@ int spider_parse_connect_info( #endif SPIDER_PARAM_LONGLONG( "direct_order_limit", direct_order_limit, 0); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 19: SPIDER_PARAM_INT("init_sql_alloc_size", init_sql_alloc_size, 0); @@ -2544,9 +2563,7 @@ int spider_parse_connect_info( "load_crd_at_startup", load_crd_at_startup, 0, 1); SPIDER_PARAM_INT_WITH_MAX( "load_sts_at_startup", load_sts_at_startup, 0, 1); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 20: SPIDER_PARAM_LONGLONG_LIST_WITH_MAX( @@ -2555,16 +2572,12 @@ int spider_parse_connect_info( "delete_all_rows_type", delete_all_rows_type, 0, 1); SPIDER_PARAM_INT_WITH_MAX( "skip_parallel_search", skip_parallel_search, 0, 3); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 21: SPIDER_PARAM_LONGLONG( "semi_split_read_limit", semi_split_read_limit, 0); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 22: SPIDER_PARAM_LONG_LIST_WITH_MAX( @@ -2577,46 +2590,38 @@ int spider_parse_connect_info( "skip_default_condition", skip_default_condition, 0, 1); SPIDER_PARAM_LONGLONG( "static_mean_rec_length", static_mean_rec_length, 0); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 23: SPIDER_PARAM_INT_WITH_MAX( "internal_optimize_local", internal_optimize_local, 0, 1); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 25: SPIDER_PARAM_LONGLONG("static_records_for_status", static_records_for_status, 0); SPIDER_PARAM_NUMHINT("static_key_cardinality", static_key_cardinality, 3, (int) table_share->keys, spider_set_ll_value); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 26: SPIDER_PARAM_INT_WITH_MAX( "semi_table_lock_connection", semi_table_lock_conn, 0, 1); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; case 32: SPIDER_PARAM_LONG_LIST_WITH_MAX("monitoring_binlog_pos_at_failing", monitoring_binlog_pos_at_failing, 0, 2); - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; default: - error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; - my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, - MYF(0), tmp_ptr); + error_num = connect_string_parse.print_param_error(); goto error; } + + /* Verify that the remainder of the parameter value is whitespace */ + if ((error_num = connect_string_parse.has_extra_parameter_values())) + goto error; } } diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h index 7165c4504f8..43958ca6e78 100644 --- a/storage/spider/spd_table.h +++ b/storage/spider/spd_table.h @@ -13,6 +13,210 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* + Structure used to manage Spider parameter string parsing. Types of + parameters include: + - connection strings + - UDF parameters + + A parameter string consists of one or more parameter definitions using + the following syntax: + <parameter title> <parameter value> + A comma is the separator character between multiple parameter definitions. + Parameter titles must not be quoted. Parameter values must be quoted with + single or double quotes. +*/ + +typedef struct st_spider_param_string_parse +{ + char *start_ptr; /* Pointer to the start of the parameter string */ + char *end_ptr; /* Pointer to the end of the parameter string */ + char *start_title_ptr; /* Pointer to the start of the current parameter + title */ + char *end_title_ptr; /* Pointer to the end of the current parameter + title */ + char *start_value_ptr; /* Pointer to the start of the current parameter + value */ + char *end_value_ptr; /* Pointer to the end of the current parameter + value */ + int error_num; /* Error code of the error message to print when + an error is detected */ + uint delim_title_len; /* Length of the paramater title's delimiter */ + uint delim_value_len; /* Length of the paramater value's delimiter */ + char delim_title; /* Current parameter title's delimiter character */ + char delim_value; /* Current parameter value's delimiter character */ + + /** + Initialize the parameter string parse information. + + @param param_string Pointer to the parameter string being parsed. + @param error_code Error code of the error message to print when + an error is detected. + */ + + inline void init(char *param_string, int error_code) + { + start_ptr = param_string; + end_ptr = start_ptr + strlen(start_ptr); + + init_param_title(); + init_param_value(); + + error_num = error_code; + } + + /** + Initialize the current parameter title. + */ + + inline void init_param_title() + { + start_title_ptr = end_title_ptr = NULL; + delim_title_len = 0; + delim_title = '\0'; + } + + /** + Save pointers to the start and end positions of the current parameter + title in the parameter string. Also save the parameter title's + delimiter character. + + @param start_value Pointer to the start position of the current + parameter title. + @param end_value Pointer to the end position of the current + parameter title. + */ + + inline void set_param_title(char *start_title, char *end_title) + { + start_title_ptr = start_title; + end_title_ptr = end_title; + + if (*start_title == '"' || + *start_title == '\'') + { + delim_title = *start_title; + + if (start_title >= start_ptr && *--start_title == '\\') + delim_title_len = 2; + else + delim_title_len = 1; + } + } + + /** + Initialize the current parameter value. + */ + + inline void init_param_value() + { + start_value_ptr = end_value_ptr = NULL; + delim_value_len = 0; + delim_value = '\0'; + } + + /** + Save pointers to the start and end positions of the current parameter + value in the parameter string. Also save the parameter value's + delimiter character. + + @param start_value Pointer to the start position of the current + parameter value. + @param end_value Pointer to the end position of the current + parameter value. + */ + + inline void set_param_value(char *start_value, char *end_value) + { + start_value_ptr = start_value--; + end_value_ptr = end_value; + + if (*start_value == '"' || + *start_value == '\'') + { + delim_value = *start_value; + + if (*--start_value == '\\') + delim_value_len = 2; + else + delim_value_len = 1; + } + } + + /** + Determine whether the current parameter in the parameter string has + extra parameter values. + + @return 0 Current parameter value in the parameter string + does not have extra parameter values. + <> 0 Error code indicating that the current parameter + value in the parameter string has extra + parameter values. + */ + + inline int has_extra_parameter_values() + { + int error_num = 0; + DBUG_ENTER("has_extra_parameter_values"); + + if (end_value_ptr) + { + /* There is a current parameter value */ + char *end_param_ptr = end_value_ptr; + + while (end_param_ptr < end_ptr && + (*end_param_ptr == ' ' || *end_param_ptr == '\r' || + *end_param_ptr == '\n' || *end_param_ptr == '\t')) + end_param_ptr++; + + if (end_param_ptr < end_ptr && *end_param_ptr != '\0') + { + /* Extra values in parameter definition */ + error_num = print_param_error(); + } + } + + DBUG_RETURN(error_num); + } + + /** + Restore the current parameter's input delimiter characters in the + parameter string. They were NULLed during parameter parsing. + */ + + inline void restore_delims() + { + char *end = end_title_ptr - 1; + + switch (delim_title_len) + { + case 2: + *end++ = '\\'; + /* Fall through */ + case 1: + *end = delim_title; + } + + end = end_value_ptr - 1; + switch (delim_value_len) + { + case 2: + *end++ = '\\'; + /* Fall through */ + case 1: + *end = delim_value; + } + } + + /** + Print a parameter string error message. + + @return Error code. + */ + + int print_param_error(); +} SPIDER_PARAM_STRING_PARSE; + uchar *spider_tbl_get_key( SPIDER_SHARE *share, size_t *length, @@ -60,7 +264,8 @@ void spider_free_tmp_share_alloc( char *spider_get_string_between_quote( char *ptr, - bool alloc + bool alloc, + SPIDER_PARAM_STRING_PARSE *param_string_parse = NULL ); int spider_create_string_list( @@ -68,7 +273,8 @@ int spider_create_string_list( uint **string_length_list, uint *list_length, char *str, - uint length + uint length, + SPIDER_PARAM_STRING_PARSE *param_string_parse ); int spider_create_long_list( @@ -77,7 +283,8 @@ int spider_create_long_list( char *str, uint length, long min_val, - long max_val + long max_val, + SPIDER_PARAM_STRING_PARSE *param_string_parse ); int spider_create_longlong_list( @@ -86,7 +293,8 @@ int spider_create_longlong_list( char *str, uint length, longlong min_val, - longlong max_val + longlong max_val, + SPIDER_PARAM_STRING_PARSE *param_string_parse ); int spider_increase_string_list( |