📄 mysqltest.c
字号:
It may be that the slave SQL thread has not started yet, though START SLAVE has been issued ? */ if (tries++ == 3) die("could not sync with master ('%s' returned NULL)", query_buf); sleep(1); /* So at most we will wait 3 seconds and make 4 tries */ mysql_free_result(res); goto wait_for_position; } mysql_free_result(res); if (rpl_parse) mysql_enable_rpl_parse(mysql); return 0;}int do_sync_with_master(struct st_query *query){ long offset= 0; char *p= query->first_argument; const char *offset_start= p; if (*offset_start) { for (; my_isdigit(charset_info, *p); p++) offset = offset * 10 + *p - '0'; if(*p && !my_isspace(charset_info, *p)) die("Invalid integer argument \"%s\"", offset_start); query->last_argument= p; } return do_sync_with_master2(offset);}int do_save_master_pos(){ MYSQL_RES* res; MYSQL_ROW row; MYSQL* mysql = &cur_con->mysql; const char *query; int rpl_parse; rpl_parse = mysql_rpl_parse_enabled(mysql); mysql_disable_rpl_parse(mysql); if (mysql_query(mysql, query= "show master status")) die("failed in show master status: %d: %s", mysql_errno(mysql), mysql_error(mysql)); if (!(res = mysql_store_result(mysql))) die("mysql_store_result() retuned NULL for '%s'", query); if (!(row = mysql_fetch_row(res))) die("empty result in show master status"); strnmov(master_pos.file, row[0], sizeof(master_pos.file)-1); master_pos.pos = strtoul(row[1], (char**) 0, 10); mysql_free_result(res); if (rpl_parse) mysql_enable_rpl_parse(mysql); return 0;}/* Assign the variable <var_name> with <var_val> SYNOPSIS do_let() query called command DESCRIPTION let $<var_name>=<var_val><delimiter> <var_name> - is the string string found between the $ and = <var_val> - is the content between the = and <delimiter>, it may span multiple line and contain any characters except <delimiter> <delimiter> - is a string containing of one or more chars, default is ; RETURN VALUES Program will die if error detected*/int do_let(struct st_query *query){ char *p= query->first_argument; char *var_name, *var_name_end, *var_val_start; /* Find <var_name> */ if (!*p) die("Missing arguments to let"); var_name= p; while (*p && (*p != '=') && !my_isspace(charset_info,*p)) p++; var_name_end= p; if (var_name+1 == var_name_end) die("Missing variable name in let"); while (my_isspace(charset_info,*p)) p++; if (*p++ != '=') die("Missing assignment operator in let"); /* Find start of <var_val> */ while (*p && my_isspace(charset_info,*p)) p++; var_val_start= p; query->last_argument= query->end; /* Assign var_val to var_name */ return var_set(var_name, var_name_end, var_val_start, query->end);}/* Store an integer (typically the returncode of the last SQL) statement in the mysqltest builtin variable $mysql_errno, by simulating of a user statement "let $mysql_errno= <integer>"*/int var_set_errno(int sql_errno){ const char *var_name= "$mysql_errno"; char var_val[21]; uint length= my_sprintf(var_val, (var_val, "%d", sql_errno)); return var_set(var_name, var_name + 12, var_val, var_val + length);}int do_rpl_probe(struct st_query *query __attribute__((unused))){ DBUG_ENTER("do_rpl_probe"); if (mysql_rpl_probe(&cur_con->mysql)) die("Failed in mysql_rpl_probe(): '%s'", mysql_error(&cur_con->mysql)); DBUG_RETURN(0);}int do_enable_rpl_parse(struct st_query *query __attribute__((unused))){ mysql_enable_rpl_parse(&cur_con->mysql); return 0;}int do_disable_rpl_parse(struct st_query *query __attribute__((unused))){ mysql_disable_rpl_parse(&cur_con->mysql); return 0;}/* Sleep the number of specifed seconds SYNOPSIS do_sleep() q called command real_sleep use the value from opt_sleep as number of seconds to sleep if real_sleep is false DESCRIPTION sleep <seconds> real_sleep <seconds> The difference between the sleep and real_sleep commands is that sleep uses the delay from the --sleep command-line option if there is one. (If the --sleep option is not given, the sleep command uses the delay specified by its argument.) The real_sleep command always uses the delay specified by its argument. The logic is that sometimes delays are cpu-dependent, and --sleep can be used to set this delay. real_sleep is used for cpu-independent delays.*/int do_sleep(struct st_query *query, my_bool real_sleep){ int error= 0; char *p= query->first_argument; char *sleep_start, *sleep_end= query->end; double sleep_val; while (my_isspace(charset_info, *p)) p++; if (!*p) die("Missing argument to %.*s", query->first_word_len, query->query); sleep_start= p; /* Check that arg starts with a digit, not handled by my_strtod */ if (!my_isdigit(charset_info, *sleep_start)) die("Invalid argument to %.*s \"%s\"", query->first_word_len, query->query, query->first_argument); sleep_val= my_strtod(sleep_start, &sleep_end, &error); if (error) die("Invalid argument to %.*s \"%s\"", query->first_word_len, query->query, query->first_argument); /* Fixed sleep time selected by --sleep option */ if (opt_sleep && !real_sleep) sleep_val= opt_sleep; DBUG_PRINT("info", ("sleep_val: %f", sleep_val)); my_sleep((ulong) (sleep_val * 1000000L)); query->last_argument= sleep_end; return 0;}static void get_file_name(char *filename, struct st_query *q){ char *p= q->first_argument, *name; if (!*p) die("Missing file name argument"); name= p; while (*p && !my_isspace(charset_info,*p)) p++; if (*p) *p++= 0; q->last_argument= p; strmake(filename, name, FN_REFLEN);}static void set_charset(struct st_query *q){ char *charset_name= q->first_argument; char *p; if (!charset_name || !*charset_name) die("Missing charset name in 'character_set'"); /* Remove end space */ p= charset_name; while (*p && !my_isspace(charset_info,*p)) p++; if(*p) *p++= 0; q->last_argument= p; charset_info= get_charset_by_csname(charset_name,MY_CS_PRIMARY,MYF(MY_WME)); if (!charset_info) abort_not_supported_test();}static uint get_errcodes(match_err *to,struct st_query *q){ char *p= q->first_argument; uint count= 0; DBUG_ENTER("get_errcodes"); if (!*p) die("Missing argument in %s", q->query); do { if (*p == 'S') { /* SQLSTATE string */ char *end= ++p + SQLSTATE_LENGTH; char *to_ptr= to[count].code.sqlstate; for (; my_isalnum(charset_info, *p) && p != end; p++) *to_ptr++= *p; *to_ptr= 0; to[count].type= ERR_SQLSTATE; } else if (*p == 'E') { /* SQL error as string */ st_error *e= global_error; char *start= p++; for (; *p == '_' || my_isalnum(charset_info, *p); p++) ; for (; e->name; e++) { if (!strncmp(start, e->name, (int) (p - start))) { to[count].code.errnum= (uint) e->code; to[count].type= ERR_ERRNO; break; } } if (!e->name) die("Unknown SQL error '%s'", start); } else { long val; if (!(p= str2int(p,10,(long) INT_MIN, (long) INT_MAX, &val))) die("Invalid argument in %s", q->query); to[count].code.errnum= (uint) val; to[count].type= ERR_ERRNO; } count++; } while (*(p++) == ','); q->last_argument= (p - 1); to[count].type= ERR_EMPTY; /* End of data */ DBUG_RETURN(count);}/* Get a string; Return ptr to end of string Strings may be surrounded by " or ' If string is a '$variable', return the value of the variable.*/static char *get_string(char **to_ptr, char **from_ptr, struct st_query *q){ reg1 char c,sep; char *to= *to_ptr, *from= *from_ptr, *start=to; DBUG_ENTER("get_string"); /* Find separator */ if (*from == '"' || *from == '\'') sep= *from++; else sep=' '; /* Separated with space */ for ( ; (c=*from) ; from++) { if (c == '\\' && from[1]) { /* Escaped character */ /* We can't translate \0 -> ASCII 0 as replace can't handle ASCII 0 */ switch (*++from) { case 'n': *to++= '\n'; break; case 't': *to++= '\t'; break; case 'r': *to++ = '\r'; break; case 'b': *to++ = '\b'; break; case 'Z': /* ^Z must be escaped on Win32 */ *to++='\032'; break; default: *to++ = *from; break; } } else if (c == sep) { if (c == ' ' || c != *++from) break; /* Found end of string */ *to++=c; /* Copy duplicated separator */ } else *to++=c; } if (*from != ' ' && *from) die("Wrong string argument in %s", q->query); while (my_isspace(charset_info,*from)) /* Point to next string */ from++; *to =0; /* End of string marker */ *to_ptr= to+1; /* Store pointer to end */ *from_ptr= from; /* Check if this was a variable */ if (*start == '$') { const char *end= to; VAR *var=var_get(start, &end, 0, 1); if (var && to == (char*) end+1) { DBUG_PRINT("info",("var: '%s' -> '%s'", start, var->str_val)); DBUG_RETURN(var->str_val); /* return found variable value */ } } DBUG_RETURN(start);}/* Get arguments for replace. The syntax is: replace from to [from to ...] Where each argument may be quoted with ' or " A argument may also be a variable, in which case the value of the variable is replaced.*/static void get_replace(struct st_query *q){ uint i; char *from= q->first_argument; char *buff,*start; char word_end_chars[256],*pos; POINTER_ARRAY to_array,from_array; DBUG_ENTER("get_replace"); free_replace(); bzero((char*) &to_array,sizeof(to_array)); bzero((char*) &from_array,sizeof(from_array)); if (!*from) die("Missing argument in %s", q->query); start=buff=my_malloc(strlen(from)+1,MYF(MY_WME | MY_FAE)); while (*from) { char *to=buff; to=get_string(&buff, &from, q); if (!*from) die("Wrong number of arguments to replace_result in '%s'", q->query); insert_pointer_name(&from_array,to); to=get_string(&buff, &from, q); insert_pointer_name(&to_array,to); } for (i=1,pos=word_end_chars ; i < 256 ; i++) if (my_isspace(charset_info,i)) *pos++= i; *pos=0; /* End pointer */ if (!(glob_replace=init_replace((char**) from_array.typelib.type_names, (char**) to_array.typelib.type_names, (uint) from_array.typelib.count, word_end_chars))) die("Can't initialize replace from '%s'", q->query); free_pointer_array(&from_array); free_pointer_array(&to_array); my_free(start, MYF(0)); q->last_argument= q->end; DBUG_VOID_RETURN;}void free_replace(){ DBUG_ENTER("free_replace"); if (glob_replace) { my_free((char*) glob_replace,MYF(0)); glob_replace=0; } DBUG_VOID_RETURN;}struct connection * find_connection_by_name(const char *name){ struct connection *con; for (con= cons; con < next_con; con++) { if (!strcmp(con->name, name)) { return con; } } return 0; /* Connection not found */}int select_connection_name(const char *name){ DBUG_ENTER("select_connection2"); DBUG_PRINT("enter",("name: '%s'", name)); if (!(cur_con= find_connection_by_name(name))) die("connection '%s' not found in connection pool", name); DBUG_RETURN(0);}int select_connection(struct st_query *query){ char *name; char *p= query->first_argument; DBUG_ENTER("select_connection"); if (!*p) die("Missing connection name in connect"); name= p; while (*p && !my_isspace(charset_info,*p)) p++; if (*p) *p++= 0; query->last_argument= p; return select_connection_name(name);}int close_connection(struct st_query *q){ char *p= q->first_argument, *name; struct connection *con; DBUG_ENTER("close_connection"); DBUG_PRINT("enter",("name: '%s'",p)); if (!*p) die("Missing connection name in disconnect"); name= p; while (*p && !my_isspace(charset_info,*p)) p++; if (*p) *p++= 0; q->last_argument= p; for (con= cons; con < next_con; con++) { if (!strcmp(con->name, name)) {#ifndef EMBEDDED_LIBRARY if (q->type == Q_DIRTY_CLOSE) { if (con->mysql.net.vio) { vio_delete(con->mysql.net.vio); con->mysql.net.vio = 0; } }#endif mysql_close(&con->mysql);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -