⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysqltest.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -