📄 mysqltest.c
字号:
dynstr_append_mem(query_eval, v->str_val, v->str_val_len); } break; case '\\': next_c= *(p+1); if (escaped) { escaped = 0; dynstr_append_mem(query_eval, p, 1); } else if (next_c == '\\' || next_c == '$') { /* Set escaped only if next char is \ or $ */ escaped = 1; if (pass_through_escape_chars) { /* The escape char should be added to the output string. */ dynstr_append_mem(query_eval, p, 1); } } else dynstr_append_mem(query_eval, p, 1); break; default: dynstr_append_mem(query_eval, p, 1); break; } } DBUG_VOID_RETURN;}static void close_cons(){ DBUG_ENTER("close_cons"); for (--next_con; next_con >= cons; --next_con) { if (next_con->stmt) mysql_stmt_close(next_con->stmt); next_con->stmt= 0; mysql_close(&next_con->mysql); if (next_con->util_mysql) mysql_close(next_con->util_mysql); my_free(next_con->name, MYF(MY_ALLOW_ZERO_PTR)); } DBUG_VOID_RETURN;}static void close_files(){ DBUG_ENTER("close_files"); for (; cur_file >= file_stack; cur_file--) { DBUG_PRINT("info", ("file_name: %s", cur_file->file_name)); if (cur_file->file && cur_file->file != stdin) my_fclose(cur_file->file, MYF(0)); my_free((gptr)cur_file->file_name, MYF(MY_ALLOW_ZERO_PTR)); cur_file->file_name= 0; } DBUG_VOID_RETURN;}static void free_used_memory(){ uint i; DBUG_ENTER("free_used_memory");#ifndef EMBEDDED_LIBRARY if (manager) mysql_manager_close(manager);#endif close_cons(); close_files(); hash_free(&var_hash); for (i=0 ; i < q_lines.elements ; i++) { struct st_query **q= dynamic_element(&q_lines, i, struct st_query**); my_free((gptr) (*q)->query_buf,MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) (*q),MYF(0)); } for (i=0; i < 10; i++) { if (var_reg[i].alloced_len) my_free(var_reg[i].str_val, MYF(MY_WME)); } while (embedded_server_arg_count > 1) my_free(embedded_server_args[--embedded_server_arg_count],MYF(0)); delete_dynamic(&q_lines); dynstr_free(&ds_res); free_replace(); free_replace_column(); my_free(pass,MYF(MY_ALLOW_ZERO_PTR)); free_defaults(default_argv); mysql_server_end(); free_re();#ifdef __WIN__ free_tmp_sh_file(); free_win_path_patterns();#endif DBUG_VOID_RETURN;}static void die(const char *fmt, ...){ va_list args; DBUG_ENTER("die"); /* Print the error message */ va_start(args, fmt); if (fmt) { fprintf(stderr, "mysqltest: "); if (cur_file && cur_file != file_stack) fprintf(stderr, "In included file \"%s\": ", cur_file->file_name); if (start_lineno != 0) fprintf(stderr, "At line %u: ", start_lineno); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); fflush(stderr); } va_end(args); /* Dump the result that has been accumulated so far to .log file */ if (result_file && ds_res.length) dump_result_to_log_file(result_file, ds_res.str, ds_res.length); /* Clean up and exit */ free_used_memory(); my_end(MY_CHECK_ERROR); if (!silent) printf("not ok\n"); exit(1);}/* Note that we will get some memory leaks when calling this! */static void abort_not_supported_test(){ DBUG_ENTER("abort_not_supported_test"); fprintf(stderr, "This test is not supported by this installation\n"); if (!silent) printf("skipped\n"); free_used_memory(); my_end(MY_CHECK_ERROR); exit(62);}static void verbose_msg(const char *fmt, ...){ va_list args; DBUG_ENTER("verbose_msg"); if (!verbose) DBUG_VOID_RETURN; va_start(args, fmt); fprintf(stderr, "mysqltest: "); if (start_lineno != 0) fprintf(stderr, "At line %u: ", start_lineno); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args); DBUG_VOID_RETURN;}void init_parser(){ parser.current_line= parser.read_lines= 0; memset(&var_reg, 0, sizeof(var_reg));}static int dyn_string_cmp(DYNAMIC_STRING* ds, const char *fname){ MY_STAT stat_info; char *tmp, *res_ptr; char eval_file[FN_REFLEN]; int res; uint res_len; int fd; DYNAMIC_STRING res_ds; DBUG_ENTER("dyn_string_cmp"); if (!test_if_hard_path(fname)) { strxmov(eval_file, opt_basedir, fname, NullS); fn_format(eval_file, eval_file,"","",4); } else fn_format(eval_file, fname,"","",4); if (!my_stat(eval_file, &stat_info, MYF(MY_WME))) die(NullS); if (!eval_result && (uint) stat_info.st_size != ds->length) { DBUG_PRINT("info",("Size differs: result size: %u file size: %u", ds->length, stat_info.st_size)); DBUG_PRINT("info",("result: '%s'", ds->str)); DBUG_RETURN(RESULT_LENGTH_MISMATCH); } if (!(tmp = (char*) my_malloc(stat_info.st_size + 1, MYF(MY_WME)))) die(NullS); if ((fd = my_open(eval_file, O_RDONLY, MYF(MY_WME))) < 0) die(NullS); if (my_read(fd, (byte*)tmp, stat_info.st_size, MYF(MY_WME|MY_NABP))) die(NullS); tmp[stat_info.st_size] = 0; init_dynamic_string(&res_ds, "", 0, 65536); if (eval_result) { do_eval(&res_ds, tmp, FALSE); res_ptr = res_ds.str; if ((res_len = res_ds.length) != ds->length) { res= RESULT_LENGTH_MISMATCH; goto err; } } else { res_ptr = tmp; res_len = stat_info.st_size; } res= (memcmp(res_ptr, ds->str, res_len)) ? RESULT_CONTENT_MISMATCH : RESULT_OK;err: if (res && eval_result) str_to_file(fn_format(eval_file, fname, "", ".eval",2), res_ptr, res_len); my_free((gptr) tmp, MYF(0)); my_close(fd, MYF(MY_WME)); dynstr_free(&res_ds); DBUG_RETURN(res);}/* Check the content of ds against content of file fname SYNOPSIS check_result ds - content to be checked fname - name of file to check against require_option - if set and check fails, the test will be aborted with the special exit code "not supported test" RETURN VALUES error - the function will not return*/static void check_result(DYNAMIC_STRING* ds, const char *fname, my_bool require_option){ int res= dyn_string_cmp(ds, fname); DBUG_ENTER("check_result"); if (res && require_option) abort_not_supported_test(); switch (res) { case RESULT_OK: break; /* ok */ case RESULT_LENGTH_MISMATCH: dump_result_to_reject_file(fname, ds->str, ds->length); die("Result length mismatch"); break; case RESULT_CONTENT_MISMATCH: dump_result_to_reject_file(fname, ds->str, ds->length); die("Result content mismatch"); break; default: /* impossible */ die("Unknown error code from dyn_string_cmp()"); } DBUG_VOID_RETURN;}VAR* var_get(const char *var_name, const char** var_name_end, my_bool raw, my_bool ignore_not_existing){ int digit; VAR* v; DBUG_ENTER("var_get"); DBUG_PRINT("enter",("var_name: %s",var_name)); if (*var_name != '$') goto err; digit = *++var_name - '0'; if (digit < 0 || digit >= 10) { const char *save_var_name = var_name, *end; uint length; end = (var_name_end) ? *var_name_end : 0; while (my_isvar(charset_info,*var_name) && var_name != end) var_name++; if (var_name == save_var_name) { if (ignore_not_existing) DBUG_RETURN(0); die("Empty variable"); } length= (uint) (var_name - save_var_name); if (length >= MAX_VAR_NAME) die("Too long variable name: %s", save_var_name); if (!(v = (VAR*) hash_search(&var_hash, save_var_name, length))) { char buff[MAX_VAR_NAME+1]; strmake(buff, save_var_name, length); v= var_from_env(buff, ""); } var_name--; /* Point at last character */ } else v = var_reg + digit; if (!raw && v->int_dirty) { sprintf(v->str_val, "%d", v->int_val); v->int_dirty = 0; v->str_val_len = strlen(v->str_val); } if (var_name_end) *var_name_end = var_name ; DBUG_RETURN(v);err: if (var_name_end) *var_name_end = 0; die("Unsupported variable name: %s", var_name); DBUG_RETURN(0);}static VAR *var_obtain(const char *name, int len){ VAR* v; if ((v = (VAR*)hash_search(&var_hash, name, len))) return v; v = var_init(0, name, len, "", 0); my_hash_insert(&var_hash, (byte*)v); return v;}int var_set(const char *var_name, const char *var_name_end, const char *var_val, const char *var_val_end){ int digit; VAR* v; DBUG_ENTER("var_set"); DBUG_PRINT("enter", ("var_name: '%.*s' = '%.*s' (length: %d)", (int) (var_name_end - var_name), var_name, (int) (var_val_end - var_val), var_val, (int) (var_val_end - var_val))); if (*var_name++ != '$') { var_name--; die("Variable name in %s does not start with '$'", var_name); } digit = *var_name - '0'; if (!(digit < 10 && digit >= 0)) { v = var_obtain(var_name, (uint) (var_name_end - var_name)); } else v = var_reg + digit; DBUG_RETURN(eval_expr(v, var_val, (const char**)&var_val_end));}int open_file(const char *name){ char buff[FN_REFLEN]; DBUG_ENTER("open_file"); DBUG_PRINT("enter", ("name: %s", name)); if (!test_if_hard_path(name)) { strxmov(buff, opt_basedir, name, NullS); name=buff; } fn_format(buff,name,"","",4); if (cur_file == file_stack_end) die("Source directives are nesting too deep"); cur_file++; if (!(cur_file->file = my_fopen(buff, O_RDONLY | FILE_BINARY, MYF(0)))) { cur_file--; die("Could not open file %s", buff); } cur_file->file_name= my_strdup(buff, MYF(MY_FAE)); cur_file->lineno=1; DBUG_RETURN(0);}/* Check for unexpected "junk" after the end of query This is normally caused by missing delimiters*/int check_eol_junk(const char *eol){ const char *p= eol; DBUG_ENTER("check_eol_junk"); DBUG_PRINT("enter", ("eol: %s", eol)); /* Remove all spacing chars except new line */ while (*p && my_isspace(charset_info, *p) && (*p != '\n')) p++; /* Check for extra delimiter */ if (*p && !strncmp(p, delimiter, delimiter_length)) die("Extra delimiter \"%s\" found", delimiter); /* Allow trailing # comment */ if (*p && *p != '#') { if (*p == '\n') die("Missing delimiter"); die("End of line junk detected: \"%s\"", p); } DBUG_RETURN(0);}/* ugly long name, but we are following the convention */int do_wait_for_slave_to_stop(struct st_query *q __attribute__((unused))){ MYSQL* mysql = &cur_con->mysql; for (;;) { MYSQL_RES *res; MYSQL_ROW row; int done; LINT_INIT(res); if (mysql_query(mysql,"show status like 'Slave_running'") || !(res=mysql_store_result(mysql))) die("Query failed while probing slave for stop: %s", mysql_error(mysql)); if (!(row=mysql_fetch_row(res)) || !row[1]) { mysql_free_result(res); die("Strange result from query while probing slave for stop"); } done = !strcmp(row[1],"OFF"); mysql_free_result(res); if (done) break; my_sleep(SLAVE_POLL_INTERVAL); } return 0;}int do_require_manager(struct st_query *query __attribute__((unused)) ){ if (!manager) abort_not_supported_test(); return 0;}#ifndef EMBEDDED_LIBRARYstatic int do_server_op(struct st_query *q, const char *op){ char *p= q->first_argument; char com_buf[256], *com_p; if (!manager) { die("Manager is not initialized, manager commands are not possible"); } com_p= strmov(com_buf,op); com_p= strmov(com_p,"_exec "); if (!*p) die("Missing server name in server_%s", op); while (*p && !my_isspace(charset_info, *p)) *com_p++= *p++; *com_p++= ' '; com_p= int10_to_str(manager_wait_timeout, com_p, 10); *com_p++= '\n'; *com_p= 0; if (mysql_manager_command(manager, com_buf, (int)(com_p-com_buf))) die("Error in command: %s(%d)", manager->last_error, manager->last_errno); while (!manager->eof) { if (mysql_manager_fetch_line(manager, com_buf, sizeof(com_buf))) die("Error fetching result line: %s(%d)", manager->last_error, manager->last_errno); } q->last_argument= p; return 0;}int do_server_start(struct st_query *q){ return do_server_op(q, "start");}int do_server_stop(struct st_query *q){ return do_server_op(q, "stop");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -