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

📄 libmysql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
      mysql->protocol_version != PROTOCOL_VERSION-1)  {    net->last_errno= CR_VERSION_ERROR;    sprintf(net->last_error, ER(CR_VERSION_ERROR), mysql->protocol_version,	    PROTOCOL_VERSION);    goto error;  }  end=strend((char*) net->read_pos+1);  mysql->thread_id=uint4korr(end+1);  end+=5;  strmake(mysql->scramble_buff,end,8);  end+=9;  if (pkt_length >= (uint) (end+1 - (char*) net->read_pos))    mysql->server_capabilities=uint2korr(end);  if (pkt_length >= (uint) (end+18 - (char*) net->read_pos))  {    /* New protocol with 16 bytes to describe server characteristics */    mysql->server_language=end[2];    mysql->server_status=uint2korr(end+3);  }  /* Set character set */  if ((charset_name=mysql->options.charset_name))  {    const char *save=charsets_dir;    if (mysql->options.charset_dir)      charsets_dir=mysql->options.charset_dir;    mysql->charset=get_charset_by_name(mysql->options.charset_name,                                       MYF(MY_WME));    charsets_dir=save;  }  else if (mysql->server_language)  {    charset_name=charset_name_buff;    sprintf(charset_name,"%d",mysql->server_language);	/* In case of errors */    if (!(mysql->charset =	  get_charset((uint8) mysql->server_language, MYF(MY_WME))))      mysql->charset = default_charset_info; /* shouldn't be fatal */  }  else    mysql->charset=default_charset_info;  if (!mysql->charset)  {    net->last_errno=CR_CANT_READ_CHARSET;    if (mysql->options.charset_dir)      sprintf(net->last_error,ER(net->last_errno),              charset_name ? charset_name : "unknown",              mysql->options.charset_dir);    else    {      char cs_dir_name[FN_REFLEN];      get_charsets_dir(cs_dir_name);      sprintf(net->last_error,ER(net->last_errno),              charset_name ? charset_name : "unknown",              cs_dir_name);    }    goto error;  }  /* Save connection information */  if (!user) user="";  if (!passwd) passwd="";  if (!my_multi_malloc(MYF(0),		       &mysql->host_info, (uint) strlen(host_info)+1,		       &mysql->host,      (uint) strlen(host)+1,		       &mysql->unix_socket,unix_socket ?		       (uint) strlen(unix_socket)+1 : (uint) 1,		       &mysql->server_version,		       (uint) (end - (char*) net->read_pos),		       NullS) ||      !(mysql->user=my_strdup(user,MYF(0))) ||      !(mysql->passwd=my_strdup(passwd,MYF(0))))  {    strmov(net->last_error, ER(net->last_errno=CR_OUT_OF_MEMORY));    goto error;  }  strmov(mysql->host_info,host_info);  strmov(mysql->host,host);  if (unix_socket)    strmov(mysql->unix_socket,unix_socket);  else    mysql->unix_socket=0;  strmov(mysql->server_version,(char*) net->read_pos+1);  mysql->port=port;  client_flag|=mysql->options.client_flag;  /* Send client information for access check */  client_flag|=CLIENT_CAPABILITIES;#ifdef HAVE_OPENSSL  if (mysql->options.use_ssl)    client_flag|=CLIENT_SSL;#endif /* HAVE_OPENSSL */  if (db)    client_flag|=CLIENT_CONNECT_WITH_DB;#ifdef HAVE_COMPRESS  if ((mysql->server_capabilities & CLIENT_COMPRESS) &&      (mysql->options.compress || (client_flag & CLIENT_COMPRESS)))    client_flag|=CLIENT_COMPRESS;		/* We will use compression */  else#endif    client_flag&= ~CLIENT_COMPRESS;#ifdef HAVE_OPENSSL  if ((mysql->server_capabilities & CLIENT_SSL) &&      (mysql->options.use_ssl || (client_flag & CLIENT_SSL)))  {    DBUG_PRINT("info", ("Changing IO layer to SSL"));    client_flag |= CLIENT_SSL;  }  else  {    if (client_flag & CLIENT_SSL)    {      DBUG_PRINT("info", ("Leaving IO layer intact because server doesn't support SSL"));    }    client_flag &= ~CLIENT_SSL;  }#endif /* HAVE_OPENSSL */  int2store(buff,client_flag);  mysql->client_flag=client_flag;#ifdef HAVE_OPENSSL  /* Oops.. are we careful enough to not send ANY information */  /* without encryption? */  if (client_flag & CLIENT_SSL)  {    if (my_net_write(net,buff,(uint) (2)) || my_net_flush(net))      goto error;    /* Do the SSL layering. */    DBUG_PRINT("info", ("IO layer change in progress..."));    VioSSLConnectorFd* connector_fd = (VioSSLConnectorFd*)      (mysql->connector_fd);    VioSocket*	vio_socket = (VioSocket*)(mysql->net.vio);    VioSSL*	vio_ssl =    connector_fd->connect(vio_socket);    mysql->net.vio =         (NetVio*)(vio_ssl);  }#endif /* HAVE_OPENSSL */  DBUG_PRINT("info",("Server version = '%s'  capabilites: %ld  status: %d  client_flag: %d",		     mysql->server_version,mysql->server_capabilities,		     mysql->server_status, client_flag));  int3store(buff+2,max_allowed_packet);  if (user && user[0])    strmake(buff+5,user,32);			/* Max user name */  else    read_user_name((char*) buff+5);#ifdef _CUSTOMCONFIG_#include "_cust_libmysql.h";#endif  DBUG_PRINT("info",("user: %s",buff+5));  end=scramble(strend(buff+5)+1, mysql->scramble_buff, passwd,	       (my_bool) (mysql->protocol_version == 9));  if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))  {    end=strmake(end+1,db,NAME_LEN);    mysql->db=my_strdup(db,MYF(MY_WME));    db=0;  }  if (my_net_write(net,buff,(uint) (end-buff)) || my_net_flush(net) ||      net_safe_read(mysql) == packet_error)    goto error;  if (client_flag & CLIENT_COMPRESS)		/* We will use compression */    net->compress=1;  if (db && mysql_select_db(mysql,db))    goto error;  if (mysql->options.init_command)  {    my_bool reconnect=mysql->reconnect;    mysql->reconnect=0;    if (mysql_query(mysql,mysql->options.init_command))      goto error;    mysql_free_result(mysql_use_result(mysql));    mysql->reconnect=reconnect;  }  DBUG_PRINT("exit",("Mysql handler: %lx",mysql));  reset_sigpipe(mysql);  DBUG_RETURN(mysql);error:  reset_sigpipe(mysql);  DBUG_PRINT("error",("message: %u (%s)",net->last_errno,net->last_error));  {    /* Free alloced memory */    my_bool free_me=mysql->free_me;    end_server(mysql);    mysql->free_me=0;    mysql_close(mysql);    mysql->free_me=free_me;  }  DBUG_RETURN(0);}static my_bool mysql_reconnect(MYSQL *mysql){  MYSQL tmp_mysql;  DBUG_ENTER("mysql_reconnect");  if (!mysql->reconnect ||      (mysql->server_status & SERVER_STATUS_IN_TRANS) || !mysql->host_info)  {   /* Allov reconnect next time */    mysql->server_status&= ~SERVER_STATUS_IN_TRANS;    DBUG_RETURN(1);  }  mysql_init(&tmp_mysql);  tmp_mysql.options=mysql->options;  bzero((char*) &mysql->options,sizeof(mysql->options));  if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd,			  mysql->db, mysql->port, mysql->unix_socket,			  mysql->client_flag))    DBUG_RETURN(1);  tmp_mysql.free_me=mysql->free_me;  mysql->free_me=0;  mysql_close(mysql);  *mysql=tmp_mysql;  net_clear(&mysql->net);  mysql->affected_rows= ~(my_ulonglong) 0;  DBUG_RETURN(0);}/**************************************************************************** Change user and database **************************************************************************/my_bool	STDCALL mysql_change_user(MYSQL *mysql, const char *user, 				  const char *passwd, const char *db){  char buff[512],*pos=buff;  DBUG_ENTER("mysql_change_user");  if (!user)    user="";  if (!passwd)    passwd="";  pos=strmov(pos,user)+1;  pos=scramble(pos, mysql->scramble_buff, passwd,	       (my_bool) (mysql->protocol_version == 9));  pos=strmov(pos+1,db ? db : "");  if (simple_command(mysql,COM_CHANGE_USER, buff,(uint) (pos-buff),0))    DBUG_RETURN(1);  my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));  my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));  my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));  mysql->user=  my_strdup(user,MYF(MY_WME));  mysql->passwd=my_strdup(passwd,MYF(MY_WME));  mysql->db=    db ? my_strdup(db,MYF(MY_WME)) : 0;  DBUG_RETURN(0);}/**************************************************************************** Set current database**************************************************************************/int STDCALLmysql_select_db(MYSQL *mysql, const char *db){  int error;  DBUG_ENTER("mysql_select_db");  DBUG_PRINT("enter",("db: '%s'",db));  if ((error=simple_command(mysql,COM_INIT_DB,db,(uint) strlen(db),0)))    DBUG_RETURN(error);  my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));  mysql->db=my_strdup(db,MYF(MY_WME));  DBUG_RETURN(0);}/*************************************************************************** Send a QUIT to the server and close the connection** If handle is alloced by mysql connect free it.*************************************************************************/void STDCALLmysql_close(MYSQL *mysql){  DBUG_ENTER("mysql_close");  if (mysql)					/* Some simple safety */  {    if (mysql->net.vio != 0)    {      free_old_query(mysql);      mysql->status=MYSQL_STATUS_READY; /* Force command */      mysql->reconnect=0;      simple_command(mysql,COM_QUIT,NullS,0,1);      end_server(mysql);    }    my_free((gptr) mysql->host_info,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.init_command,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.user,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.host,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.password,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.unix_socket,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.db,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));    my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));    /* Clear pointers for better safety */    mysql->host_info=mysql->user=mysql->passwd=mysql->db=0;    bzero((char*) &mysql->options,sizeof(mysql->options));    mysql->net.vio = 0;#ifdef HAVE_OPENSSL    ((VioConnectorFd*)(mysql->connector_fd))->delete();    mysql->connector_fd = 0;#endif /* HAVE_OPENSSL */    if (mysql->free_me)      my_free((gptr) mysql,MYF(0));  }  DBUG_VOID_RETURN;}/**************************************************************************** Do a query. If query returned rows, free old rows.** Read data by mysql_store_result or by repeat call of mysql_fetch_row**************************************************************************/int STDCALLmysql_query(MYSQL *mysql, const char *query){  return mysql_real_query(mysql,query, (uint) strlen(query));}/*  Send the query and return so we can do something else.  Needs to be followed by mysql_read_query_result() when we want to  finish processing it.*/  int STDCALLmysql_send_query(MYSQL* mysql, const char* query, uint length){  return simple_command(mysql, COM_QUERY, query, length, 1);}int STDCALL mysql_read_query_result(MYSQL *mysql){  uchar *pos;  ulong field_count;  MYSQL_DATA *fields;  uint length;  DBUG_ENTER("mysql_read_query_result");  if ((length = net_safe_read(mysql)) == packet_error)    DBUG_RETURN(-1);  free_old_query(mysql);			/* Free old result */get_info:  pos=(uchar*) mysql->net.read_pos;  if ((field_count= net_field_length(&pos)) == 0)  {    mysql->affected_rows= net_field_length_ll(&pos);    mysql->insert_id=	  net_field_length_ll(&pos);    if (mysql->server_capabilities & CLIENT_TRANSACTIONS)    {      mysql->server_status=uint2korr(pos); pos+=2;    }    if (pos < mysql->net.read_pos+length && net_field_length(&pos))      mysql->info=(char*) pos;    DBUG_RETURN(0);  }  if (field_count == NULL_LENGTH)		/* LOAD DATA LOCAL INFILE */  {    int error=send_file_to_server(mysql,(char*) pos);    if ((length=net_safe_read(mysql)) == packet_error || error)      DBUG_RETURN(-1);    goto get_info;				/* Get info packet */  }  if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT))    mysql->server_status|= SERVER_STATUS_IN_TRANS;  mysql->extra_info= net_field_length_ll(&pos); /* Maybe number of rec */  if (!(fields=read_rows(mysql,(MYSQL_FIELD*) 0,5)))    DBUG_RETURN(-1);  if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,				    (uint) field_count,0,				    (my_bool) test(mysql->server_capabilities &						   CLIENT_LONG_FLAG))))    DBUG_RETURN(-1);  mysql->status=MYSQL_STATUS_GET_RESULT;  mysql->field_count=field_count;  DBUG_RETURN(0);}int STDCALLmysql_real_query(MYSQL *mysql, const char *query, uint length){  DBUG_ENTER("mysql_real_query");  DBUG_PRINT("enter",("handle: %lx",mysql));  DBUG_PRINT("query",("Query = \"%s\"",query));  if (simple_command(mysql,COM_QUERY,query,length,1))    DBUG_RETURN(-1);  DBUG_RETURN(mysql_read_query_result(mysql));}static intsend_file_to_server(MYSQL *mysql, const char *filename){  int fd, readcount;  char buf[IO_SIZE*15],*tmp_name;  DBUG_ENTER("send_file_to_server");  fn_format(buf,filename,"","",4);		/* Convert to client format */  if (!(tmp_name=my_strdup(buf,MYF(0))))  {    strmov(mysql->net.last_error, ER(mysql->net.last_errno=CR_OUT_OF_MEMORY));    DBUG_RETURN(-1);  }  if ((fd = my_open(tmp_name,O_RDONLY, MYF(0))) < 0)  {    mysql->net.last_errno=EE_FILENOTFOUND;    sprintf(buf,EE(mysql->net.last_errno),tmp_name,errno);    strmake(mysql->net.last_error,buf,sizeof(mysql->net.last_error)-1);    my_net_write(&mysql->net,"",0); my_net_flush(&mysql->net);    my_free(tmp_name,MYF(0));    DBUG_RETURN(-1);  }  while ((readcount = (int) my_read(fd,buf,sizeof(buf),MYF(0))) > 0)  {    if (my_net_write(&mysql->net,buf,readcount))    {      mysql->net.last_errno=CR_SERVER_LOST;      strmov(mysql->net.last_error,ER(mysql->net.last_errno));      DBUG_PRINT("error",("Lost connection to MySQL server during LOAD DATA of local file"));      (void) my_close(fd,MYF(0));      my_free(tmp_name,MYF(0));      DBUG_RETURN(-1);    }  }  (void) my_close(fd,MYF(0));  /* Send empty packet to mark end of file */  if (my_net_write(&mysql->net,"",0) || my_net_flush(&mysql->net))  {    mysql->net.last_errno=CR_SERVER_LOST;    sprintf(mysql->net.last_error,ER(mysql->net.last_errno),socket_errno);    my_free(tmp_name,MYF(0));    DBUG_RETURN(-1);  }  if (readcount < 0)  {    mysql->net.last_errno=EE_READ; /* the errmsg for not entire file read */    sprintf(buf,EE(mysql->net.last_errno),tmp_name,errno);    strmake(mysql->net.last_error,buf,sizeof(mysql->net.last_error)-1);    my_free(tmp_name,MYF(0));    DBUG_RETURN(-1);  }

⌨️ 快捷键说明

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