int mrn_parse_table_param(MRN_SHARE *share, TABLE *table) { int i, error = 0; int title_length; const char *sprit_ptr[2]; const char *tmp_ptr, *start_ptr; char *params_string = NULL; #ifdef WITH_PARTITION_STORAGE_ENGINE partition_element *part_elem; partition_element *sub_elem; #endif MRN_DBUG_ENTER_FUNCTION(); #ifdef WITH_PARTITION_STORAGE_ENGINE mrn_get_partition_info(share->table_name, share->table_name_length, table, &part_elem, &sub_elem); #endif #ifdef WITH_PARTITION_STORAGE_ENGINE for (i = 4; i > 0; i--) #else for (i = 2; i > 0; i--) #endif { const char *params_string_value = NULL; uint params_string_length = 0; switch (i) { #ifdef WITH_PARTITION_STORAGE_ENGINE case 4: if (!sub_elem || !sub_elem->part_comment) continue; DBUG_PRINT("info", ("mroonga create sub comment string")); params_string_value = sub_elem->part_comment; params_string_length = strlen(params_string_value); DBUG_PRINT("info", ("mroonga sub comment string=%s", params_string_value)); break; case 3: if (!part_elem || !part_elem->part_comment) continue; DBUG_PRINT("info", ("mroonga create part comment string")); params_string_value = part_elem->part_comment; params_string_length = strlen(params_string_value); DBUG_PRINT("info", ("mroonga part comment string=%s", params_string_value)); break; #endif case 2: if (LEX_STRING_IS_EMPTY(table->s->comment)) continue; DBUG_PRINT("info", ("mroonga create comment string")); params_string_value = table->s->comment.str; params_string_length = table->s->comment.length; DBUG_PRINT("info", ("mroonga comment string=%.*s", params_string_length, params_string_value)); break; default: if (LEX_STRING_IS_EMPTY(table->s->connect_string)) continue; DBUG_PRINT("info", ("mroonga create connect_string string")); params_string_value = table->s->connect_string.str; params_string_length = table->s->connect_string.length; DBUG_PRINT("info", ("mroonga connect_string=%.*s", params_string_length, params_string_value)); break; } if (!params_string_value) { continue; } { params_string = mrn_my_strndup(params_string_value, params_string_length, MYF(MY_WME)); if (!params_string) { error = HA_ERR_OUT_OF_MEM; goto error; } sprit_ptr[0] = params_string; while (sprit_ptr[0]) { if ((sprit_ptr[1] = strchr(sprit_ptr[0], ','))) { sprit_ptr[1]++; } tmp_ptr = sprit_ptr[0]; sprit_ptr[0] = sprit_ptr[1]; while (*tmp_ptr == ' ' || *tmp_ptr == '\r' || *tmp_ptr == '\n' || *tmp_ptr == '\t') tmp_ptr++; if (*tmp_ptr == '\0') continue; DBUG_PRINT("info", ("mroonga title_str=%s", tmp_ptr)); title_length = 0; start_ptr = tmp_ptr; while (*start_ptr != ' ' && *start_ptr != '\'' && *start_ptr != '"' && *start_ptr != '\0' && *start_ptr != '\r' && *start_ptr != '\n' && *start_ptr != '\t' && *start_ptr != ',') { title_length++; start_ptr++; } DBUG_PRINT("info", ("mroonga title_length=%u", title_length)); switch (title_length) { case 6: MRN_PARAM_STR("engine", engine); break; case 10: MRN_PARAM_STR("normalizer", normalizer); break; case 13: MRN_PARAM_STR("token_filters", token_filters); break; case 17: MRN_PARAM_STR("default_tokenizer", default_tokenizer); break; default: break; } } my_free(params_string); params_string = NULL; } } if (!share->engine && mrn_default_wrapper_engine) { share->engine_length = strlen(mrn_default_wrapper_engine); if ( !(share->engine = mrn_my_strndup(mrn_default_wrapper_engine, share->engine_length, MYF(MY_WME))) ) { error = HA_ERR_OUT_OF_MEM; goto error; } } if (share->engine) { LEX_STRING engine_name; if ( ( share->engine_length == MRN_DEFAULT_LEN && !strncasecmp(share->engine, MRN_DEFAULT_STR, MRN_DEFAULT_LEN) ) || ( share->engine_length == MRN_GROONGA_LEN && !strncasecmp(share->engine, MRN_GROONGA_STR, MRN_GROONGA_LEN) ) ) { my_free(share->engine); share->engine = NULL; share->engine_length = 0; } else { engine_name.str = share->engine; engine_name.length = share->engine_length; if (!(share->plugin = MRN_HA_RESOLVE_BY_NAME(&engine_name))) { my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), share->engine); error = ER_UNKNOWN_STORAGE_ENGINE; goto error; } share->hton = MRN_PLUGIN_DATA(share->plugin, handlerton *); share->wrapper_mode = TRUE; } }
int mrn_parse_table_param(MRN_SHARE *share, TABLE *table) { int i, error; int title_length; char *param_string = NULL; char *sprit_ptr[2]; char *tmp_ptr, *start_ptr; #ifdef WITH_PARTITION_STORAGE_ENGINE partition_element *part_elem; partition_element *sub_elem; #endif DBUG_ENTER("mrn_parse_table_param"); #ifdef WITH_PARTITION_STORAGE_ENGINE mrn_get_partition_info(share->table_name, share->table_name_length, table, &part_elem, &sub_elem); #endif #ifdef WITH_PARTITION_STORAGE_ENGINE for (i = 4; i > 0; i--) #else for (i = 2; i > 0; i--) #endif { if (param_string) { my_free(param_string, MYF(0)); param_string = NULL; } switch (i) { #ifdef WITH_PARTITION_STORAGE_ENGINE case 4: if (!sub_elem || !sub_elem->part_comment) continue; DBUG_PRINT("info", ("mroonga create sub comment string")); if ( !(param_string = mrn_create_string( sub_elem->part_comment, strlen(sub_elem->part_comment))) ) { error = HA_ERR_OUT_OF_MEM; goto error_alloc_param_string; } DBUG_PRINT("info", ("mroonga sub comment string=%s", param_string)); break; case 3: if (!part_elem || !part_elem->part_comment) continue; DBUG_PRINT("info", ("mroonga create part comment string")); if ( !(param_string = mrn_create_string( part_elem->part_comment, strlen(part_elem->part_comment))) ) { error = HA_ERR_OUT_OF_MEM; goto error_alloc_param_string; } DBUG_PRINT("info", ("mroonga part comment string=%s", param_string)); break; #endif case 2: if (LEX_STRING_IS_EMPTY(table->s->comment)) continue; DBUG_PRINT("info", ("mroonga create comment string")); if ( !(param_string = mrn_create_string( table->s->comment.str, table->s->comment.length)) ) { error = HA_ERR_OUT_OF_MEM; goto error_alloc_param_string; } DBUG_PRINT("info", ("mroonga comment string=%s", param_string)); break; default: if (LEX_STRING_IS_EMPTY(table->s->connect_string)) continue; DBUG_PRINT("info", ("mroonga create connect_string string")); if ( !(param_string = mrn_create_string( table->s->connect_string.str, table->s->connect_string.length)) ) { error = HA_ERR_OUT_OF_MEM; goto error_alloc_param_string; } DBUG_PRINT("info", ("mroonga connect_string=%s", param_string)); break; } sprit_ptr[0] = param_string; while (sprit_ptr[0]) { if ((sprit_ptr[1] = strchr(sprit_ptr[0], ','))) { *sprit_ptr[1] = '\0'; sprit_ptr[1]++; } tmp_ptr = sprit_ptr[0]; sprit_ptr[0] = sprit_ptr[1]; while (*tmp_ptr == ' ' || *tmp_ptr == '\r' || *tmp_ptr == '\n' || *tmp_ptr == '\t') tmp_ptr++; if (*tmp_ptr == '\0') continue; title_length = 0; start_ptr = tmp_ptr; while (*start_ptr != ' ' && *start_ptr != '\'' && *start_ptr != '"' && *start_ptr != '\0' && *start_ptr != '\r' && *start_ptr != '\n' && *start_ptr != '\t') { title_length++; start_ptr++; } switch (title_length) { case 0: continue; case 6: MRN_PARAM_STR("engine", engine); error = ER_MRN_INVALID_TABLE_PARAM_NUM; my_printf_error(error, ER_MRN_INVALID_TABLE_PARAM_STR, MYF(0), tmp_ptr); goto error; default: error = ER_MRN_INVALID_TABLE_PARAM_NUM; my_printf_error(error, ER_MRN_INVALID_TABLE_PARAM_STR, MYF(0), tmp_ptr); goto error; } } } if (!share->engine && mrn_default_wrapper_engine) { share->engine_length = strlen(mrn_default_wrapper_engine); if ( !(share->engine = mrn_create_string( mrn_default_wrapper_engine, share->engine_length)) ) { error = HA_ERR_OUT_OF_MEM; goto error; } } if (share->engine) { LEX_STRING engine_name; if ( ( share->engine_length == MRN_DEFAULT_LEN && !strncasecmp(share->engine, MRN_DEFAULT_STR, MRN_DEFAULT_LEN) ) || ( share->engine_length == MRN_GROONGA_LEN && !strncasecmp(share->engine, MRN_GROONGA_STR, MRN_GROONGA_LEN) ) ) { my_free(share->engine, MYF(0)); share->engine = NULL; share->engine_length = 0; } else { engine_name.str = share->engine; engine_name.length = share->engine_length; if (!(share->plugin = MRN_HA_RESOLVE_BY_NAME(&engine_name))) { my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), share->engine); error = ER_UNKNOWN_STORAGE_ENGINE; goto error; } share->hton = plugin_data(share->plugin, handlerton *); share->wrapper_mode = TRUE; } }