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

📄 libmysql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
static void free_old_query(MYSQL *mysql){  DBUG_ENTER("free_old_query");  if (mysql->fields)    free_root(&mysql->field_alloc,MYF(0));  init_alloc_root(&mysql->field_alloc,8192,0);	/* Assume rowlength < 8192 */  mysql->fields=0;  mysql->field_count=0;				/* For API */  DBUG_VOID_RETURN;}#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)struct passwd *getpwuid(uid_t);char* getlogin(void);#endif#if !defined(MSDOS) && ! defined(VMS) && !defined(__WIN__) && !defined(OS2)static void read_user_name(char *name){  DBUG_ENTER("read_user_name");  if (geteuid() == 0)    (void) strmov(name,"root");		/* allow use of surun */  else  {#ifdef HAVE_GETPWUID    struct passwd *skr;    const char *str;    if ((str=getlogin()) == NULL)    {      if ((skr=getpwuid(geteuid())) != NULL)	str=skr->pw_name;      else if (!(str=getenv("USER")) && !(str=getenv("LOGNAME")) &&	       !(str=getenv("LOGIN")))	str="UNKNOWN_USER";    }    (void) strmake(name,str,USERNAME_LENGTH);#elif HAVE_CUSERID    (void) cuserid(name);#else    strmov(name,"UNKNOWN_USER");#endif  }  DBUG_VOID_RETURN;}#else /* If MSDOS || VMS */static void read_user_name(char *name){  char *str=getenv("USER");		/* ODBC will send user variable */  strmake(name,str ? str : "ODBC", USERNAME_LENGTH);}#endif#ifdef __WIN__static my_bool is_NT(void){  char *os=getenv("OS");  return (os && !strcmp(os, "Windows_NT")) ? 1 : 0;}#endif/*** Expand wildcard to a sql string*/static voidappend_wild(char *to, char *end, const char *wild){  end-=5;					/* Some extra */  if (wild && wild[0])  {    to=strmov(to," like '");    while (*wild && to < end)    {      if (*wild == '\\' || *wild == '\'')	*to++='\\';      *to++= *wild++;    }    if (*wild)					/* Too small buffer */      *to++='%';				/* Nicer this way */    to[0]='\'';    to[1]=0;  }}/**************************************************************************** Init debugging if MYSQL_DEBUG environment variable is found**************************************************************************/void STDCALLmysql_debug(const char *debug __attribute__((unused))){#ifndef DBUG_OFF  char	*env;  if (_db_on_)    return;					/* Already using debugging */  if (debug)  {    DEBUGGER_ON;    DBUG_PUSH(debug);  }  else if ((env = getenv("MYSQL_DEBUG")))  {    DEBUGGER_ON;    DBUG_PUSH(env);#if !defined(_WINVER) && !defined(WINVER)    puts("\n-------------------------------------------------------");    puts("MYSQL_DEBUG found. libmysql started with the following:");    puts(env);    puts("-------------------------------------------------------\n");#else    {      char buff[80];      strmov(strmov(buff,"libmysql: "),env);      MessageBox((HWND) 0,"Debugging variable MYSQL_DEBUG used",buff,MB_OK);    }#endif  }#endif}/**************************************************************************** Close the server connection if we get a SIGPIPE   ARGSUSED**************************************************************************/static sig_handlerpipe_sig_handler(int sig __attribute__((unused))){  DBUG_PRINT("info",("Hit by signal %d",sig));#ifdef DONT_REMEMBER_SIGNAL  (void) signal(SIGPIPE,pipe_sig_handler);#endif}/**************************************************************************** Shut down connection**************************************************************************/static voidend_server(MYSQL *mysql){  DBUG_ENTER("end_server");  if (mysql->net.vio != 0)  {    init_sigpipe_variables    DBUG_PRINT("info",("Net: %s", vio_description(mysql->net.vio)));    set_sigpipe(mysql);    vio_delete(mysql->net.vio);    reset_sigpipe(mysql);    mysql->net.vio= 0;          /* Marker */  }  net_end(&mysql->net);  free_old_query(mysql);  DBUG_VOID_RETURN;}void STDCALLmysql_free_result(MYSQL_RES *result){  DBUG_ENTER("mysql_free_result");  DBUG_PRINT("enter",("mysql_res: %lx",result));  if (result)  {    if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT)    {      DBUG_PRINT("warning",("Not all rows in set were read; Ignoring rows"));      for (;;)      {	uint pkt_len;	if ((pkt_len=(uint) net_safe_read(result->handle)) == packet_error)	  break;	if (pkt_len == 1 && result->handle->net.read_pos[0] == 254)	  break;				/* End of data */      }      result->handle->status=MYSQL_STATUS_READY;    }    free_rows(result->data);    if (result->fields)      free_root(&result->field_alloc,MYF(0));    if (result->row)      my_free((gptr) result->row,MYF(0));    my_free((gptr) result,MYF(0));  }  DBUG_VOID_RETURN;}/****************************************************************************** Get options from my.cnf****************************************************************************/static const char *default_options[]={  "port","socket","compress","password","pipe", "timeout", "user",  "init-command", "host", "database", "debug", "return-found-rows",  "ssl-key" ,"ssl-cert" ,"ssl-ca" ,"ssl-capath",  "character-set-dir", "default-character-set", "interactive-timeout",  "connect-timeout", "local-infile", "disable-local-infile", NullS};static TYPELIB option_types={array_elements(default_options)-1,			     "options",default_options};static void mysql_read_default_options(struct st_mysql_options *options,				       const char *filename,const char *group){  int argc;  char *argv_buff[1],**argv;  const char *groups[3];  DBUG_ENTER("mysql_read_default_options");  DBUG_PRINT("enter",("file: %s  group: %s",filename,group ? group :"NULL"));  argc=1; argv=argv_buff; argv_buff[0]= (char*) "client";  groups[0]= (char*) "client"; groups[1]= (char*) group; groups[2]=0;  load_defaults(filename, groups, &argc, &argv);  if (argc != 1)				/* If some default option */  {    char **option=argv;    while (*++option)    {      /* DBUG_PRINT("info",("option: %s",option[0])); */      if (option[0][0] == '-' && option[0][1] == '-')      {	char *end=strcend(*option,'=');	char *opt_arg=0;	if (*end)	{	  opt_arg=end+1;	  *end=0;				/* Remove '=' */	}	/* Change all '_' in variable name to '-' */	for (end= *option ; (end= strcend(end,'_')) ; )	  *end= '-';	switch (find_type(*option+2,&option_types,2)) {	case 1:				/* port */	  if (opt_arg)	    options->port=atoi(opt_arg);	  break;	case 2:				/* socket */	  if (opt_arg)	  {	    my_free(options->unix_socket,MYF(MY_ALLOW_ZERO_PTR));	    options->unix_socket=my_strdup(opt_arg,MYF(MY_WME));	  }	  break;	case 3:				/* compress */	  options->compress=1;	  break;	case 4:				/* password */	  if (opt_arg)	  {	    my_free(options->password,MYF(MY_ALLOW_ZERO_PTR));	    options->password=my_strdup(opt_arg,MYF(MY_WME));	  }	  break;	case 5:				/* pipe */	  options->named_pipe=1;	/* Force named pipe */	  break;	case 20:			/* connect_timeout */	case 6:				/* timeout */	  if (opt_arg)	    options->connect_timeout=atoi(opt_arg);	  break;	case 7:				/* user */	  if (opt_arg)	  {	    my_free(options->user,MYF(MY_ALLOW_ZERO_PTR));	    options->user=my_strdup(opt_arg,MYF(MY_WME));	  }	  break;	case 8:				/* init-command */	  if (opt_arg)	  {	    my_free(options->init_command,MYF(MY_ALLOW_ZERO_PTR));	    options->init_command=my_strdup(opt_arg,MYF(MY_WME));	  }	  break;	case 9:				/* host */	  if (opt_arg)	  {	    my_free(options->host,MYF(MY_ALLOW_ZERO_PTR));	    options->host=my_strdup(opt_arg,MYF(MY_WME));	  }	  break;	case 10:			/* database */	  if (opt_arg)	  {	    my_free(options->db,MYF(MY_ALLOW_ZERO_PTR));	    options->db=my_strdup(opt_arg,MYF(MY_WME));	  }	  break;	case 11:			/* debug */	  mysql_debug(opt_arg ? opt_arg : "d:t:o,/tmp/client.trace");	  break;	case 12:			/* return-found-rows */	  options->client_flag|=CLIENT_FOUND_ROWS;	  break;#ifdef HAVE_OPENSSL	case 13:			/* ssl_key */	  my_free(options->ssl_key, MYF(MY_ALLOW_ZERO_PTR));          options->ssl_key = my_strdup(opt_arg, MYF(MY_WME));          break;	case 14:			/* ssl_cert */	  my_free(options->ssl_cert, MYF(MY_ALLOW_ZERO_PTR));          options->ssl_cert = my_strdup(opt_arg, MYF(MY_WME));          break;	case 15:			/* ssl_ca */	  my_free(options->ssl_ca, MYF(MY_ALLOW_ZERO_PTR));          options->ssl_ca = my_strdup(opt_arg, MYF(MY_WME));          break;	case 16:			/* ssl_capath */	  my_free(options->ssl_capath, MYF(MY_ALLOW_ZERO_PTR));          options->ssl_capath = my_strdup(opt_arg, MYF(MY_WME));          break;#else	case 13:				/* Ignore SSL options */	case 14:	case 15:	case 16:	  break;#endif /* HAVE_OPENSSL */	case 17:			/* charset-lib */	  my_free(options->charset_dir,MYF(MY_ALLOW_ZERO_PTR));          options->charset_dir = my_strdup(opt_arg, MYF(MY_WME));	  break;	case 18:	  my_free(options->charset_name,MYF(MY_ALLOW_ZERO_PTR));          options->charset_name = my_strdup(opt_arg, MYF(MY_WME));	  break;	case 19:				/* Interactive-timeout */	  options->client_flag|= CLIENT_INTERACTIVE;	  break;	case 21:	  if (!opt_arg || atoi(opt_arg) != 0)	    options->client_flag|= CLIENT_LOCAL_FILES;	  else	    options->client_flag&= ~CLIENT_LOCAL_FILES;	  break;	case 22:	  options->client_flag&= CLIENT_LOCAL_FILES;	  break;	default:	  DBUG_PRINT("warning",("unknown option: %s",option[0]));	}      }    }  }  free_defaults(argv);  DBUG_VOID_RETURN;}/***************************************************************************** Change field rows to field structs***************************************************************************/static MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,	      my_bool default_value, my_bool long_flag_protocol){  MYSQL_ROWS	*row;  MYSQL_FIELD	*field,*result;  DBUG_ENTER("unpack_fields");  field=result=(MYSQL_FIELD*) alloc_root(alloc,sizeof(MYSQL_FIELD)*fields);  if (!result)    DBUG_RETURN(0);  for (row=data->data; row ; row = row->next,field++)  {    field->table=  strdup_root(alloc,(char*) row->data[0]);    field->name=   strdup_root(alloc,(char*) row->data[1]);    field->length= (uint) uint3korr(row->data[2]);    field->type=   (enum enum_field_types) (uchar) row->data[3][0];    if (long_flag_protocol)    {      field->flags=   uint2korr(row->data[4]);      field->decimals=(uint) (uchar) row->data[4][2];    }    else    {      field->flags=   (uint) (uchar) row->data[4][0];      field->decimals=(uint) (uchar) row->data[4][1];    }    if (INTERNAL_NUM_FIELD(field))      field->flags|= NUM_FLAG;    if (default_value && row->data[5])      field->def=strdup_root(alloc,(char*) row->data[5]);    else      field->def=0;    field->max_length= 0;  }  free_rows(data);				/* Free old data */  DBUG_RETURN(result);}/* Read all rows (fields or data) from server */static MYSQL_DATA *read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,			     uint fields){  uint	field,pkt_len;  ulong len;  uchar *cp;  char	*to, *end_to;  MYSQL_DATA *result;  MYSQL_ROWS **prev_ptr,*cur;  NET *net = &mysql->net;  DBUG_ENTER("read_rows");  if ((pkt_len=(uint) net_safe_read(mysql)) == packet_error)    DBUG_RETURN(0);  if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),				       MYF(MY_WME | MY_ZEROFILL))))  {    net->last_errno=CR_OUT_OF_MEMORY;    strmov(net->last_error,ER(net->last_errno));    DBUG_RETURN(0);  }  init_alloc_root(&result->alloc,8192,0);	/* Assume rowlength < 8192 */  result->alloc.min_malloc=sizeof(MYSQL_ROWS);  prev_ptr= &result->data;  result->rows=0;  result->fields=fields;  while (*(cp=net->read_pos) != 254 || pkt_len != 1)  {    result->rows++;    if (!(cur= (MYSQL_ROWS*) alloc_root(&result->alloc,					    sizeof(MYSQL_ROWS))) ||	!(cur->data= ((MYSQL_ROW)		      alloc_root(&result->alloc,				     (fields+1)*sizeof(char *)+pkt_len))))    {      free_rows(result);      net->last_errno=CR_OUT_OF_MEMORY;      strmov(net->last_error,ER(net->last_errno));      DBUG_RETURN(0);    }    *prev_ptr=cur;    prev_ptr= &cur->next;    to= (char*) (cur->data+fields+1);    end_to = to + pkt_len - 1;    for (field=0 ; field < fields ; field++)    {      if ((len=(ulong) net_field_length(&cp)) == NULL_LENGTH)      {						/* null field */	cur->data[field] = 0;      }      else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -