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

📄 mysqltest.c

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