libmysqld.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "embedded_priv.h"
  14. #include <my_sys.h>
  15. #include <mysys_err.h>
  16. #include <m_string.h>
  17. #include <m_ctype.h>
  18. #include "errmsg.h"
  19. #include <violite.h>
  20. #include <sys/stat.h>
  21. #include <signal.h>
  22. #include <time.h>
  23. #include "client_settings.h"
  24. #ifdef  HAVE_PWD_H
  25. #include <pwd.h>
  26. #endif
  27. #if !defined(MSDOS) && !defined(__WIN__)
  28. #include <sys/socket.h>
  29. #include <netinet/in.h>
  30. #include <arpa/inet.h>
  31. #include <netdb.h>
  32. #ifdef HAVE_SELECT_H
  33. #  include <select.h>
  34. #endif
  35. #ifdef HAVE_SYS_SELECT_H
  36. #include <sys/select.h>
  37. #endif
  38. #endif
  39. #ifdef HAVE_SYS_UN_H
  40. #  include <sys/un.h>
  41. #endif
  42. #ifndef INADDR_NONE
  43. #define INADDR_NONE -1
  44. #endif
  45. extern ulong net_buffer_length;
  46. extern ulong max_allowed_packet;
  47. #if defined(MSDOS) || defined(__WIN__)
  48. #define ERRNO WSAGetLastError()
  49. #define perror(A)
  50. #else
  51. #include <errno.h>
  52. #define ERRNO errno
  53. #define SOCKET_ERROR -1
  54. #define closesocket(A) close(A)
  55. #endif
  56. #ifdef HAVE_GETPWUID
  57. struct passwd *getpwuid(uid_t);
  58. char* getlogin(void);
  59. #endif
  60. #ifdef __WIN__
  61. static my_bool is_NT(void)
  62. {
  63.   char *os=getenv("OS");
  64.   return (os && !strcmp(os, "Windows_NT")) ? 1 : 0;
  65. }
  66. #endif
  67. /**************************************************************************
  68. ** Shut down connection
  69. **************************************************************************/
  70. static void end_server(MYSQL *mysql)
  71. {
  72.   DBUG_ENTER("end_server");
  73.   free_old_query(mysql);
  74.   DBUG_VOID_RETURN;
  75. }
  76. static int mysql_init_charset(MYSQL *mysql)
  77. {
  78.   char charset_name_buff[16], *charset_name;
  79.   if ((charset_name=mysql->options.charset_name))
  80.   {
  81.     const char *save=charsets_dir;
  82.     if (mysql->options.charset_dir)
  83.       charsets_dir=mysql->options.charset_dir;
  84.     mysql->charset=get_charset_by_name(mysql->options.charset_name,
  85.                                        MYF(MY_WME));
  86.     charsets_dir=save;
  87.   }
  88.   else if (mysql->server_language)
  89.   {
  90.     charset_name=charset_name_buff;
  91.     sprintf(charset_name,"%d",mysql->server_language); /* In case of errors */
  92.     mysql->charset=get_charset((uint8) mysql->server_language, MYF(MY_WME));
  93.   }
  94.   else
  95.     mysql->charset=default_charset_info;
  96.   if (!mysql->charset)
  97.   {
  98.     mysql->net.last_errno=CR_CANT_READ_CHARSET;
  99.     strmov(mysql->net.sqlstate, "HY0000");
  100.     if (mysql->options.charset_dir)
  101.       sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
  102.               charset_name ? charset_name : "unknown",
  103.               mysql->options.charset_dir);
  104.     else
  105.     {
  106.       char cs_dir_name[FN_REFLEN];
  107.       get_charsets_dir(cs_dir_name);
  108.       sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
  109.               charset_name ? charset_name : "unknown",
  110.               cs_dir_name);
  111.     }
  112.     return mysql->net.last_errno;
  113.   }
  114.   return 0;
  115. }
  116. MYSQL * STDCALL
  117. mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
  118.    const char *passwd, const char *db,
  119.    uint port, const char *unix_socket,ulong client_flag)
  120. {
  121.   char *db_name;
  122.   char name_buff[USERNAME_LENGTH];
  123.   DBUG_ENTER("mysql_real_connect");
  124.   DBUG_PRINT("enter",("host: %s  db: %s  user: %s",
  125.       host ? host : "(Null)",
  126.       db ? db : "(Null)",
  127.       user ? user : "(Null)"));
  128.   if (!host || !host[0])
  129.     host= mysql->options.host;
  130.   if (mysql->options.methods_to_use == MYSQL_OPT_USE_REMOTE_CONNECTION ||
  131.       (mysql->options.methods_to_use == MYSQL_OPT_GUESS_CONNECTION &&
  132.        host && *host && strcmp(host,LOCAL_HOST)))
  133.     DBUG_RETURN(cli_mysql_real_connect(mysql, host, user, 
  134.        passwd, db, port, 
  135.        unix_socket, client_flag));
  136.   mysql->methods= &embedded_methods;
  137.   /* use default options */
  138.   if (mysql->options.my_cnf_file || mysql->options.my_cnf_group)
  139.   {
  140.     mysql_read_default_options(&mysql->options,
  141.        (mysql->options.my_cnf_file ?
  142. mysql->options.my_cnf_file : "my"),
  143.        mysql->options.my_cnf_group);
  144.     my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
  145.     my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
  146.     mysql->options.my_cnf_file=mysql->options.my_cnf_group=0;
  147.   }
  148.   if (!db || !db[0])
  149.     db=mysql->options.db;
  150.   if (!user || !user[0])
  151.     user=mysql->options.user;
  152. #ifndef NO_EMBEDDED_ACCESS_CHECKS
  153.   if (!passwd)
  154.   {
  155.     passwd=mysql->options.password;
  156. #if !defined(DONT_USE_MYSQL_PWD)
  157.     if (!passwd)
  158.       passwd=getenv("MYSQL_PWD"); /* get it from environment */
  159. #endif
  160.   }
  161.   mysql->passwd= passwd ? my_strdup(passwd,MYF(0)) : NULL;
  162. #endif /*!NO_EMBEDDED_ACCESS_CHECKS*/
  163.   if (!user || !user[0])
  164.   {
  165.     read_user_name(name_buff);
  166.     if (name_buff[0])
  167.       user= name_buff;
  168.   }
  169.   if (!user)
  170.     user= "";
  171.   mysql->user=my_strdup(user,MYF(0));
  172.   port=0;
  173.   unix_socket=0;
  174.   db_name = db ? my_strdup(db,MYF(MY_WME)) : NULL;
  175.   mysql->thd= create_embedded_thd(client_flag, db_name);
  176.   init_embedded_mysql(mysql, client_flag, db_name);
  177.   if (check_embedded_connection(mysql))
  178.     goto error;
  179.   if (mysql_init_charset(mysql))
  180.     goto error;
  181.   /* Send client information for access check */
  182.   client_flag|=CLIENT_CAPABILITIES;
  183.   client_flag&= ~CLIENT_COMPRESS;
  184.   if (db)
  185.     client_flag|=CLIENT_CONNECT_WITH_DB;
  186.   mysql->server_status= SERVER_STATUS_AUTOCOMMIT;
  187.   if (mysql->options.init_commands)
  188.   {
  189.     DYNAMIC_ARRAY *init_commands= mysql->options.init_commands;
  190.     char **ptr= (char**)init_commands->buffer;
  191.     char **end= ptr + init_commands->elements;
  192.     for (; ptr<end; ptr++)
  193.     {
  194.       MYSQL_RES *res;
  195.       if (mysql_query(mysql,*ptr))
  196. goto error;
  197.       if (mysql->fields)
  198.       {
  199. if (!(res= (*mysql->methods->use_result)(mysql)))
  200.   goto error;
  201. mysql_free_result(res);
  202.       }
  203.     }
  204.   }
  205.   DBUG_PRINT("exit",("Mysql handler: %lx",mysql));
  206.   DBUG_RETURN(mysql);
  207. error:
  208.   embedded_get_error(mysql);
  209.   DBUG_PRINT("error",("message: %u (%s)", mysql->net.last_errno,
  210.       mysql->net.last_error));
  211.   {
  212.     /* Free alloced memory */
  213.     my_bool free_me=mysql->free_me;
  214.     end_server(mysql);
  215.     mysql->free_me=0;
  216.     mysql_close(mysql);
  217.     mysql->free_me=free_me;
  218.   }
  219.   DBUG_RETURN(0);
  220. }