diff options
author | unknown <hf@deer.mysql.r18.ru> | 2002-12-16 17:33:29 +0400 |
---|---|---|
committer | unknown <hf@deer.mysql.r18.ru> | 2002-12-16 17:33:29 +0400 |
commit | 632717fd8d70ff187621df8a0839678ceae19ab5 (patch) | |
tree | ac62ff3cde5a13932e6d512787093827232af630 /libmysqld | |
parent | e9525947d4eaf19e2edb17d8c688fe6ffba02502 (diff) | |
download | mariadb-git-632717fd8d70ff187621df8a0839678ceae19ab5.tar.gz |
Big purge about embedded library (scrum)
client/mysql.cc:
#ifdef EMBEDDED_LIBRARY added
client/mysqltest.c:
#ifdef EMBEDDED_LIBRARY added
include/mysql.h:
MYSQL structure changed for embedded case
include/mysql_com.h:
NET structure changed for embedded case
include/violite.h:
no need to special vio types
libmysqld/embedded_priv.h:
superfluous functions removed
libmysqld/lib_sql.cc:
several modifications
libmysqld/lib_vio.c:
file should be removed
libmysqld/libmysqld.c:
several modifications
sql/ha_berkeley.cc:
modification for embedded case
sql/ha_innodb.cc:
modifications for embedded case
sql/ha_myisam.cc:
modifications for embedded case
sql/item_func.cc:
modifications for embedded case
sql/log.cc:
#ifdef-ed parts of file which don't work in embedded case
sql/log_event.cc:
#ifdef-ed parts of file which don't work in embedded case
sql/log_event.h:
#ifdef-ed parts of file which don't work in embedded case
sql/mf_iocache.cc:
file doesn't work in embedded case
sql/mini_client.cc:
file should be removed from embedded library
sql/mysqld.cc:
several modifications
sql/net_pkg.cc:
#ifdef-ed functions which can't work in embedded case
sql/net_serv.cc:
file doesn't work in embedded case
sql/repl_failsafe.cc:
no replication in embedded case
sql/repl_failsafe.h:
no replication in embedded case
sql/set_var.cc:
#ifdef-ed variables which have no sense in embedded library
sql/set_var.h:
#ifdef-ed variables which have no sense in embedded library
sql/slave.cc:
no replication in embedded library
sql/slave.h:
no replication in embedded library
sql/sql_acl.cc:
modifications for embedded case
sql/sql_cache.cc:
modifications for embedded case
sql/sql_class.cc:
modifications for embedded case
sql/sql_class.h:
THD structure modified for embedded case
sql/sql_db.cc:
modification for embedded case
sql/sql_error.cc:
modification for embedded case
sql/sql_help.cc:
modification for embedded case
sql/sql_load.cc:
#ifdef-ed code which doesn't work in embedded case
sql/sql_parse.cc:
#ifdef-ed code which doesn't work in embedded case
sql/sql_prepare.cc:
#ifdef-ed code which doesn't work in embedded case
sql/sql_repl.cc:
no replication in embedded library
sql/sql_repl.h:
no replication in embedded library
sql/sql_select.cc:
query cache don't work now in embedded library
sql/sql_show.cc:
modifications for embedded case
Diffstat (limited to 'libmysqld')
-rw-r--r-- | libmysqld/embedded_priv.h | 5 | ||||
-rw-r--r-- | libmysqld/lib_sql.cc | 884 | ||||
-rw-r--r-- | libmysqld/lib_vio.c | 5 | ||||
-rw-r--r-- | libmysqld/libmysqld.c | 579 |
4 files changed, 85 insertions, 1388 deletions
diff --git a/libmysqld/embedded_priv.h b/libmysqld/embedded_priv.h index d1c44a8d160..abbebec2aaa 100644 --- a/libmysqld/embedded_priv.h +++ b/libmysqld/embedded_priv.h @@ -23,12 +23,9 @@ #include <my_pthread.h> C_MODE_START -extern void start_embedded_connection(NET * net); -extern void end_embedded_connection(NET * net); extern void lib_connection_phase(NET *net, int phase); extern void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db); -extern void *create_embedded_thd(Vio *vio, unsigned char *buff, int client_flag, char *db); -extern NET *get_mysql_net(MYSQL *mysql); +extern void *create_embedded_thd(int client_flag, char *db); extern my_bool simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, ulong length, my_bool skipp_check); C_MODE_END diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index d764aefa210..a6029ccc3c1 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -36,7 +36,7 @@ static char inited, org_my_init_done; #define SCRAMBLE_LENGTH 8 C_MODE_START -#include "lib_vio.c" +#include <mysql.h> #include "errmsg.h" static int check_connections1(THD * thd); @@ -50,199 +50,41 @@ char * get_mysql_real_data_home(){ return mysql_real_data_home;}; my_bool simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, ulong length, my_bool skipp_check) { - NET *net= &mysql->net; my_bool result= 1; - THD *thd=(THD *) net->vio->dest_thd; + THD *thd=(THD *) mysql->thd; /* Check that we are calling the client functions in right order */ if (mysql->status != MYSQL_STATUS_READY) { - strmov(net->last_error,ER(mysql->net.last_errno=CR_COMMANDS_OUT_OF_SYNC)); + strmov(thd->net.last_error,ER(thd->net.last_errno=CR_COMMANDS_OUT_OF_SYNC)); return 1; } /* Clear result variables */ - mysql->net.last_error[0]=0; - mysql->net.last_errno=0; - mysql->info=0; + thd->net.last_error[0]=0; + thd->net.last_errno=0; mysql->affected_rows= ~(my_ulonglong) 0; - /* Clear receive buffer and vio packet list */ - net_clear(net); - vio_reset(net->vio); - thd->store_globals(); // Fix if more than one connect -// thd->net.last_error[0]=0; // Clear error message -// thd->net.last_errno=0; - - net_new_transaction(net); result= dispatch_command(command, thd, (char *) arg, length + 1); if (!skipp_check) - result= net->last_errno ? -1 : 0; + result= thd->net.last_errno ? -1 : 0; + mysql->last_error= thd->net.last_error; + mysql->last_errno= thd->net.last_errno; return result; } -#ifdef _DUMMY -void lib_connection_phase(NET * net, int phase) -{ - THD * thd; - thd = (THD *)(net->vio->dest_thd); - if (thd) - { - switch (phase) - { - case 2: - check_connections2(thd); - break; - } - } -} C_MODE_END - -void start_embedded_conn1(NET * net) +void THD::clear_error() { - THD * thd = new THD; - my_net_init(&thd->net,NULL); - /* if (protocol_version>9) */ - thd->net.return_errno=1; - thd->thread_id = thread_id++; - - Vio * v = net->vio; - if (!v) - { - v = vio_new(0,VIO_BUFFER,0); - net->vio = v; - } - if (v) - { - v -> dest_thd = thd; - } - thd->net.vio = v; - if (thd->store_globals()) - { - fprintf(stderr,"store_globals failed.\n"); - return; - } - - thd->mysys_var=my_thread_var; - thd->dbug_thread_id=my_thread_id(); - thd->thread_stack= (char*) &thd; - - if (thd->variables.max_join_size == (ulong) HA_POS_ERROR) - thd->options |= OPTION_BIG_SELECTS; - - thd->proc_info=0; // Remove 'login' - thd->command=COM_SLEEP; - thd->version=refresh_version; - thd->set_time(); - bzero(thd->scramble, sizeof(thd->scramble)); - init_sql_alloc(&thd->mem_root,8192,8192); - - check_connections1(thd); -} - -static int -check_connections1(THD *thd) -{ - uint connect_errors=0; - NET *net= &thd->net; - /* - ** store the connection details - */ - DBUG_PRINT("info", (("check_connections called by thread %d"), - thd->thread_id)); - DBUG_PRINT("general",("New connection received on %s", - vio_description(net->vio))); - if (!thd->host) // If TCP/IP connection - { - thd->host=(char*) localhost; - } - else /* Hostname given means that the connection was on a socket */ - { - DBUG_PRINT("general",("Host: %s",thd->host)); - thd->ip=0; - bzero((char*) &thd->remote,sizeof(struct sockaddr)); - } - //vio_keepalive(net->vio, TRUE); - - /* nasty, but any other way? */ - uint pkt_len = 0; - - char buff[80],*end; - int client_flags = CLIENT_LONG_FLAG | CLIENT_CONNECT_WITH_DB | - CLIENT_TRANSACTIONS; - LINT_INIT(pkt_len); - - end=strmov(buff,server_version)+1; - int4store((uchar*) end,thd->thread_id); - end+=4; - memcpy(end,thd->scramble,SCRAMBLE_LENGTH+1); - end+=SCRAMBLE_LENGTH +1; - int2store(end,client_flags); - end[2]=MY_CHARSET_CURRENT; - int2store(end+3,thd->server_status); - bzero(end+5,13); - end+=18; - if (net_write_command(net,protocol_version, - NullS, 0, - buff, (uint) (end-buff))) - { - inc_host_errors(&thd->remote.sin_addr); - return(ER_HANDSHAKE_ERROR); - } - return 0; + net.last_error[0]= 0; + net.last_errno= 0; + net.report_error= 0; } -#define MIN_HANDSHAKE_SIZE 6 - -static int -check_connections2(THD * thd) -{ - uint connect_errors=0; - uint pkt_len = 0; - NET * net = &thd -> net; - if (protocol_version>9) net -> return_errno=1; - - if ( (pkt_len=my_net_read(net)) == packet_error || - pkt_len < MIN_HANDSHAKE_SIZE) - { - inc_host_errors(&thd->remote.sin_addr); - return(ER_HANDSHAKE_ERROR); - } - -#ifdef _CUSTOMCONFIG_ -#include "_cust_sql_parse.h" -#endif - if (connect_errors) - reset_host_errors(&thd->remote.sin_addr); - if (thd->packet.alloc(thd->variables.net_buffer_length)) - return(ER_OUT_OF_RESOURCES); - - thd->client_capabilities=uint2korr(net->read_pos); - - thd->max_client_packet_length=uint3korr(net->read_pos+2); - char *user= (char*) net->read_pos+5; - char *passwd= strend(user)+1; - char *db=0; - if (passwd[0] && strlen(passwd) != SCRAMBLE_LENGTH) - return ER_HANDSHAKE_ERROR; - if (thd->client_capabilities & CLIENT_CONNECT_WITH_DB) - db=strend(passwd)+1; - if (thd->client_capabilities & CLIENT_TRANSACTIONS) - thd->net.return_status= &thd->server_status; - net->read_timeout=thd->variables.net_read_timeout; - if (check_user(thd,COM_CONNECT, user, passwd, db, 1)) - return (-1); - thd->password=test(passwd[0]); - return 0; -} -#else -C_MODE_END -#endif /* _DUMMY */ - static bool check_user(THD *thd,enum_server_command command, const char *user, const char *passwd, const char *db, bool check_count) { @@ -430,581 +272,6 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) return 0; } - -#ifdef __DUMMY -int STDCALL mysql_server_init(int argc, char **argv, char **groups) -{ - char glob_hostname[FN_REFLEN]; - - /* This mess is to allow people to call the init function without - * having to mess with a fake argv */ - int *argcp; - char ***argvp; - int fake_argc = 1; - char *fake_argv[] = { (char *)"", 0 }; - const char *fake_groups[] = { "server", "embedded", 0 }; - if (argc) - { - argcp = &argc; - argvp = (char***) &argv; - } - else - { - argcp = &fake_argc; - argvp = (char ***) &fake_argv; - } - if (!groups) - groups = (char**) fake_groups; - - my_umask=0660; // Default umask for new files - my_umask_dir=0700; // Default umask for new directories - - /* Only call MY_INIT() if it hasn't been called before */ - if (!inited) - { - inited=1; - org_my_init_done=my_init_done; - } - if (!org_my_init_done) - { - MY_INIT((char *)"mysql_embedded"); // init my_sys library & pthreads - } - - /* - Make a copy of the arguments to guard against applications that - may change or move the initial arguments. - */ - if (argvp == &argv) - if (!(copy_arguments_ptr= argv= copy_arguments(argc, argv))) - return 1; - - tzset(); // Set tzname - - start_time=time((time_t*) 0); -#ifdef HAVE_TZNAME -#if defined(HAVE_LOCALTIME_R) && defined(_REENTRANT) - { - struct tm tm_tmp; - localtime_r(&start_time,&tm_tmp); - strmov(time_zone,tzname[tm_tmp.tm_isdst != 0 ? 1 : 0]); - } -#else - { - struct tm *start_tm; - start_tm=localtime(&start_time); - strmov(time_zone,tzname[start_tm->tm_isdst != 0 ? 1 : 0]); - } -#endif -#endif - - if (gethostname(glob_hostname,sizeof(glob_hostname)-4) < 0) - strmov(glob_hostname,"mysql"); -#ifndef DBUG_OFF - strxmov(strend(server_version),MYSQL_SERVER_SUFFIX,"-debug",NullS); -#else - strmov(strend(server_version),MYSQL_SERVER_SUFFIX); -#endif - load_defaults("my", (const char **) groups, argcp, argvp); - defaults_argv=*argvp; - - /* Get default temporary directory */ - opt_mysql_tmpdir=getenv("TMPDIR"); /* Use this if possible */ -#if defined( __WIN__) || defined(OS2) - if (!opt_mysql_tmpdir) - opt_mysql_tmpdir=getenv("TEMP"); - if (!opt_mysql_tmpdir) - opt_mysql_tmpdir=getenv("TMP"); -#endif - if (!opt_mysql_tmpdir || !opt_mysql_tmpdir[0]) - opt_mysql_tmpdir=(char*) P_tmpdir; /* purecov: inspected */ - - set_options(); - get_options(*argcp, *argvp); - - if (opt_log || opt_update_log || opt_slow_log || opt_bin_log) - strcat(server_version,"-log"); - DBUG_PRINT("info",("%s Ver %s for %s on %s\n",my_progname, - server_version, SYSTEM_TYPE,MACHINE_TYPE)); - - /* These must be set early */ - - (void) pthread_mutex_init(&LOCK_mysql_create_db,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_Acl,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_open,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_thread_count,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_mapped_file,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_status,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_error_log,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_delayed_insert,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_delayed_status,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_delayed_create,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_manager,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_crypt,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_timezone,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_user_conn, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST); - (void) my_rwlock_init(&LOCK_grant, NULL); - (void) pthread_cond_init(&COND_thread_count,NULL); - (void) pthread_cond_init(&COND_refresh,NULL); - (void) pthread_cond_init(&COND_thread_cache,NULL); - (void) pthread_cond_init(&COND_flush_thread_cache,NULL); - (void) pthread_cond_init(&COND_manager,NULL); - (void) pthread_cond_init(&COND_rpl_status, NULL); - - if (set_default_charset_by_name(sys_charset.value, MYF(MY_WME))) - { - mysql_server_end(); - return 1; - } - charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG)); - - /* Parameter for threads created for connections */ - (void) pthread_attr_init(&connection_attrib); - (void) pthread_attr_setdetachstate(&connection_attrib, - PTHREAD_CREATE_DETACHED); - pthread_attr_setstacksize(&connection_attrib,thread_stack); - pthread_attr_setscope(&connection_attrib, PTHREAD_SCOPE_SYSTEM); - -#if defined( SET_RLIMIT_NOFILE) || defined( OS2) - /* connections and databases needs lots of files */ - { - uint wanted_files=10+(uint) max(max_connections*5, - max_connections+table_cache_size*2); - set_if_bigger(wanted_files, open_files_limit); - // Note that some system returns 0 if we succeed here: - uint files=set_maximum_open_files(wanted_files); - if (files && files < wanted_files && ! open_files_limit) - { - max_connections= (ulong) min((files-10),max_connections); - table_cache_size= (ulong) max((files-10-max_connections)/2,64); - DBUG_PRINT("warning", - ("Changed limits: max_connections: %ld table_cache: %ld", - max_connections,table_cache_size)); - sql_print_error("Warning: Changed limits: max_connections: %ld table_cache: %ld",max_connections,table_cache_size); - } - } -#endif - unireg_init(opt_specialflag); /* Set up extern variabels */ - init_errmessage(); /* Read error messages from file */ - lex_init(); - item_init(); - set_var_init(); - mysys_uses_curses=0; -#ifdef USE_REGEX - regex_init(); -#endif - if (use_temp_pool && bitmap_init(&temp_pool,1024,1)) - { - mysql_server_end(); - return 1; - } - - /* - We have enough space for fiddling with the argv, continue - */ - umask(((~my_umask) & 0666)); - table_cache_init(); - hostname_cache_init(); - query_cache_result_size_limit(query_cache_limit); - query_cache_resize(query_cache_size); - randominit(&sql_rand,(ulong) start_time,(ulong) start_time/2); - reset_floating_point_exceptions(); - init_thr_lock(); - init_slave_list(); - - /* Setup log files */ - if (opt_log) - open_log(&mysql_log, glob_hostname, opt_logname, ".log", NullS, - LOG_NORMAL); - if (opt_update_log) - { - open_log(&mysql_update_log, glob_hostname, opt_update_logname, "", - NullS, LOG_NEW); - using_update_log=1; - } - - if (opt_slow_log) - open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log", - NullS, LOG_NORMAL); - if (ha_init()) - { - sql_print_error("Can't init databases"); - exit(1); - } - ha_key_cache(); -#if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT) - if (locked_in_memory && !geteuid()) - { - if (mlockall(MCL_CURRENT)) - { - sql_print_error("Warning: Failed to lock memory. Errno: %d\n",errno); - } - else - locked_in_memory=1; - } -#else - locked_in_memory=0; -#endif - - if (opt_myisam_log) - (void) mi_log( 1 ); - ft_init_stopwords(ft_precompiled_stopwords); - - /* - init signals & alarm - After this we can't quit by a simple unireg_abort - */ - error_handler_hook = my_message_sql; - if (pthread_key_create(&THR_THD,NULL) || - pthread_key_create(&THR_MALLOC,NULL)) - { - sql_print_error("Can't create thread-keys"); - exit(1); - } - opt_noacl = 1; // No permissions - if (acl_init(opt_noacl)) - { - mysql_server_end(); - return 1; - } - if (!opt_noacl) - (void) grant_init(); - init_max_user_conn(); - init_update_queries(); - -#ifdef HAVE_DLOPEN - if (!opt_noacl) - udf_init(); -#endif - - if (opt_bin_log) - { - if (!opt_bin_logname) - { - char tmp[FN_REFLEN]; - /* TODO: The following should be using fn_format(); We just need to - first change fn_format() to cut the file name if it's too long. - */ - strmake(tmp,glob_hostname,FN_REFLEN-5); - strmov(strcend(tmp,'.'),"-bin"); - opt_bin_logname=my_strdup(tmp,MYF(MY_WME)); - } - open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin", - opt_binlog_index_name, LOG_BIN); - using_update_log=1; - } - - (void) thr_setconcurrency(concurrency); // 10 by default - - if ( -#ifdef HAVE_BERKELEY_DB - !berkeley_skip || -#endif - (flush_time && flush_time != ~(ulong) 0L)) - { - pthread_t hThread; - if (pthread_create(&hThread,&connection_attrib,handle_manager,0)) - sql_print_error("Warning: Can't create thread to manage maintenance"); - } - - /* - Update mysqld variables from client variables if set - The client variables are set also by get_one_option() in mysqld.cc - */ - if (max_allowed_packet) - global_system_variables.max_allowed_packet= max_allowed_packet; - if (net_buffer_length) - global_system_variables.net_buffer_length= net_buffer_length; - return 0; -} - -int STDCALL mysql_server_init(int argc, char **argv, char **groups) -{ - char glob_hostname[FN_REFLEN]; - - /* This mess is to allow people to call the init function without - * having to mess with a fake argv */ - int *argcp; - char ***argvp; - int fake_argc = 1; - char *fake_argv[] = { (char *)"", 0 }; - const char *fake_groups[] = { "server", "embedded", 0 }; - if (argc) - { - argcp = &argc; - argvp = (char***) &argv; - } - else - { - argcp = &fake_argc; - argvp = (char ***) &fake_argv; - } - if (!groups) - groups = (char**) fake_groups; - - my_umask=0660; // Default umask for new files - my_umask_dir=0700; // Default umask for new directories - - /* Only call MY_INIT() if it hasn't been called before */ - if (!inited) - { - inited=1; - org_my_init_done=my_init_done; - } - if (!org_my_init_done) - { - MY_INIT((char *)"mysql_embedded"); // init my_sys library & pthreads - } - - tzset(); // Set tzname - - start_time=time((time_t*) 0); -#ifdef HAVE_TZNAME -#if defined(HAVE_LOCALTIME_R) && defined(_REENTRANT) - { - struct tm tm_tmp; - localtime_r(&start_time,&tm_tmp); - strmov(time_zone,tzname[tm_tmp.tm_isdst != 0 ? 1 : 0]); - } -#else - { - struct tm *start_tm; - start_tm=localtime(&start_time); - strmov(time_zone,tzname[start_tm->tm_isdst != 0 ? 1 : 0]); - } -#endif -#endif - - if (gethostname(glob_hostname,sizeof(glob_hostname)-4) < 0) - strmov(glob_hostname,"mysql"); -#ifndef DBUG_OFF - strxmov(strend(server_version),MYSQL_SERVER_SUFFIX,"-debug",NullS); -#else - strmov(strend(server_version),MYSQL_SERVER_SUFFIX); -#endif - load_defaults("my", (const char **) groups, argcp, argvp); - defaults_argv=*argvp; - - /* Get default temporary directory */ - opt_mysql_tmpdir=getenv("TMPDIR"); /* Use this if possible */ -#if defined( __WIN__) || defined(OS2) - if (!opt_mysql_tmpdir) - opt_mysql_tmpdir=getenv("TEMP"); - if (!opt_mysql_tmpdir) - opt_mysql_tmpdir=getenv("TMP"); -#endif - if (!opt_mysql_tmpdir || !opt_mysql_tmpdir[0]) - opt_mysql_tmpdir=(char*) P_tmpdir; /* purecov: inspected */ - - set_options(); - get_options(*argcp, *argvp); - - if (opt_log || opt_update_log || opt_slow_log || opt_bin_log) - strcat(server_version,"-log"); - DBUG_PRINT("info",("%s Ver %s for %s on %s\n",my_progname, - server_version, SYSTEM_TYPE,MACHINE_TYPE)); - - /* These must be set early */ - - (void) pthread_mutex_init(&LOCK_mysql_create_db,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_Acl,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_open,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_thread_count,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_mapped_file,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_status,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_error_log,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_delayed_insert,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_delayed_status,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_delayed_create,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_manager,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_crypt,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_timezone,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_user_conn, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST); - (void) my_rwlock_init(&LOCK_grant, NULL); - (void) pthread_cond_init(&COND_thread_count,NULL); - (void) pthread_cond_init(&COND_refresh,NULL); - (void) pthread_cond_init(&COND_thread_cache,NULL); - (void) pthread_cond_init(&COND_flush_thread_cache,NULL); - (void) pthread_cond_init(&COND_manager,NULL); - (void) pthread_cond_init(&COND_rpl_status, NULL); - - if (set_default_charset_by_name(sys_charset.value, MYF(MY_WME))) - { - mysql_server_end(); - return 1; - } - charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG)); - - /* Parameter for threads created for connections */ - (void) pthread_attr_init(&connection_attrib); - (void) pthread_attr_setdetachstate(&connection_attrib, - PTHREAD_CREATE_DETACHED); - pthread_attr_setstacksize(&connection_attrib,thread_stack); - pthread_attr_setscope(&connection_attrib, PTHREAD_SCOPE_SYSTEM); - -#if defined( SET_RLIMIT_NOFILE) || defined( OS2) - /* connections and databases needs lots of files */ - { - uint wanted_files=10+(uint) max(max_connections*5, - max_connections+table_cache_size*2); - set_if_bigger(wanted_files, open_files_limit); - // Note that some system returns 0 if we succeed here: - uint files=set_maximum_open_files(wanted_files); - if (files && files < wanted_files && ! open_files_limit) - { - max_connections= (ulong) min((files-10),max_connections); - table_cache_size= (ulong) max((files-10-max_connections)/2,64); - DBUG_PRINT("warning", - ("Changed limits: max_connections: %ld table_cache: %ld", - max_connections,table_cache_size)); - sql_print_error("Warning: Changed limits: max_connections: %ld table_cache: %ld",max_connections,table_cache_size); - } - } -#endif - unireg_init(opt_specialflag); /* Set up extern variabels */ - init_errmessage(); /* Read error messages from file */ - lex_init(); - item_init(); - set_var_init(); - mysys_uses_curses=0; -#ifdef USE_REGEX - regex_init(); -#endif - if (use_temp_pool && bitmap_init(&temp_pool,1024,1)) - { - mysql_server_end(); - return 1; - } - - /* - We have enough space for fiddling with the argv, continue - */ - umask(((~my_umask) & 0666)); - table_cache_init(); - hostname_cache_init(); - query_cache_result_size_limit(query_cache_limit); - query_cache_resize(query_cache_size); - randominit(&sql_rand,(ulong) start_time,(ulong) start_time/2); - reset_floating_point_exceptions(); - init_thr_lock(); - init_slave_list(); - - /* Setup log files */ - if (opt_log) - open_log(&mysql_log, glob_hostname, opt_logname, ".log", NullS, - LOG_NORMAL); - if (opt_update_log) - { - open_log(&mysql_update_log, glob_hostname, opt_update_logname, "", - NullS, LOG_NEW); - using_update_log=1; - } - - if (opt_slow_log) - open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log", - NullS, LOG_NORMAL); - if (ha_init()) - { - sql_print_error("Can't init databases"); - exit(1); - } - ha_key_cache(); -#if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT) - if (locked_in_memory && !geteuid()) - { - if (mlockall(MCL_CURRENT)) - { - sql_print_error("Warning: Failed to lock memory. Errno: %d\n",errno); - } - else - locked_in_memory=1; - } -#else - locked_in_memory=0; -#endif - - if (opt_myisam_log) - (void) mi_log( 1 ); - ft_init_stopwords(ft_precompiled_stopwords); - - /* - init signals & alarm - After this we can't quit by a simple unireg_abort - */ - error_handler_hook = my_message_sql; - if (pthread_key_create(&THR_THD,NULL) || - pthread_key_create(&THR_MALLOC,NULL)) - { - sql_print_error("Can't create thread-keys"); - exit(1); - } - opt_noacl = 1; // No permissions - if (acl_init(opt_noacl)) - { - mysql_server_end(); - return 1; - } - if (!opt_noacl) - (void) grant_init(); - init_max_user_conn(); - init_update_queries(); - -#ifdef HAVE_DLOPEN - if (!opt_noacl) - udf_init(); -#endif - - if (opt_bin_log) - { - if (!opt_bin_logname) - { - char tmp[FN_REFLEN]; - /* TODO: The following should be using fn_format(); We just need to - first change fn_format() to cut the file name if it's too long. - */ - strmake(tmp,glob_hostname,FN_REFLEN-5); - strmov(strcend(tmp,'.'),"-bin"); - opt_bin_logname=my_strdup(tmp,MYF(MY_WME)); - } - open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin", - opt_binlog_index_name, LOG_BIN); - using_update_log=1; - } - - (void) thr_setconcurrency(concurrency); // 10 by default - - if ( -#ifdef HAVE_BERKELEY_DB - !berkeley_skip || -#endif - (flush_time && flush_time != ~(ulong) 0L)) - { - pthread_t hThread; - if (pthread_create(&hThread,&connection_attrib,handle_manager,0)) - sql_print_error("Warning: Can't create thread to manage maintenance"); - } - - /* - Update mysqld variables from client variables if set - The client variables are set also by get_one_option() in mysqld.cc - */ - if (max_allowed_packet) - global_system_variables.max_allowed_packet= max_allowed_packet; - if (net_buffer_length) - global_system_variables.net_buffer_length= net_buffer_length; - return 0; -} -#endif - void STDCALL mysql_server_end() { my_free((char*) copy_arguments_ptr, MYF(MY_ALLOW_ZERO_PTR)); @@ -1035,75 +302,19 @@ void STDCALL mysql_thread_end() my_thread_end(); #endif } - -void start_embedded_connection(NET * net) -{ -// start_embedded_conn1(net); -} - -void end_embedded_connection(NET * net) -{ - THD *thd = (THD *) net->vio->dest_thd; - delete thd; -} - } /* extern "C" */ C_MODE_START -NET *get_mysql_net(MYSQL *mysql) -{ - return &((THD *)mysql->net.vio->dest_thd)->net; -} - void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db) { - THD *thd = (THD *)mysql->net.vio->dest_thd; - mysql->reconnect= 1; /* Reconnect as default */ - mysql->server_status= SERVER_STATUS_AUTOCOMMIT; - - mysql->protocol_version= ::protocol_version; - mysql->thread_id= thd->thread_id; - strmake(mysql->scramble_buff, thd->scramble, 8); - mysql->server_capabilities= CLIENT_LONG_FLAG | CLIENT_CONNECT_WITH_DB | - CLIENT_TRANSACTIONS; - mysql->server_language= MY_CHARSET_CURRENT; - mysql->server_status= thd->server_status; - mysql->client_flag= client_flag | mysql->options.client_flag; - mysql->db= db; + THD *thd = (THD *)mysql->thd; thd->mysql= mysql; + mysql->last_error= thd->net.last_error; } -C_MODE_END - -static int embedded_thd_net_init(NET *net, unsigned char *buff) -{ - net->buff = buff; - if (net_buffer_length > max_allowed_packet) - max_allowed_packet= net_buffer_length; - net->buff_end= net->buff+(net->max_packet=net_buffer_length); - net->vio= NULL; - net->no_send_ok= 0; - net->error=0; net->return_errno=0; net->return_status=0; -// net->timeout=(uint) net_read_timeout; /* Timeout for read */ - net->pkt_nr= net->compress_pkt_nr=0; - net->write_pos= net->read_pos = net->buff; - net->last_error[0]= 0; - net->compress= 0; - net->reading_or_writing= 0; - net->where_b = net->remain_in_buf= 0; - net->last_errno= 0; - net->query_cache_query= 0; - return 0; -} - -C_MODE_START -void *create_embedded_thd(Vio *vio, unsigned char *buff, int client_flag, char *db) +void *create_embedded_thd(int client_flag, char *db) { THD * thd= new THD; - embedded_thd_net_init(&thd->net, buff); - - /* if (protocol_version>9) */ - thd->net.return_errno=1; thd->thread_id= thread_id++; if (thd->store_globals()) @@ -1116,30 +327,22 @@ void *create_embedded_thd(Vio *vio, unsigned char *buff, int client_flag, char * thd->dbug_thread_id= my_thread_id(); thd->thread_stack= (char*) &thd; -// if (thd->max_join_size == HA_POS_ERROR) -// thd->options |= OPTION_BIG_SELECTS; - thd->proc_info=0; // Remove 'login' thd->command=COM_SLEEP; thd->version=refresh_version; thd->set_time(); init_sql_alloc(&thd->mem_root,8192,8192); thd->client_capabilities= client_flag; -// thd->max_packet_length= max_allowed_packet; - thd->net.vio = vio; - -// if (thd->client_capabilities & CLIENT_INTERACTIVE) -// thd->inactive_timeout= net_interactive_timeout; - if (thd->client_capabilities & CLIENT_TRANSACTIONS) - thd->net.return_status= &thd->server_status; thd->db= db; thd->db_length= db ? strip_sp(db) : 0; thd->db_access= DB_ACLS; thd->master_access= ~NO_ACCESS; + thd->net.query_cache_query= 0; return thd; } + C_MODE_END bool send_fields(THD *thd, List<Item> &list, uint flag) @@ -1295,63 +498,16 @@ bool select_send::send_data(List<Item> &items) DBUG_RETURN(0); } -bool do_command(THD *thd) -{ - MYSQL *mysql= thd->mysql; - - char *packet; - uint old_timeout; - ulong packet_length; - NET *net; - enum enum_server_command command; - DBUG_ENTER("do_command"); - - net= &thd->net; - thd->current_tablenr=0; - - packet=0; -// old_timeout=net->timeout; -// net->timeout=(uint) thd->inactive_timeout; // Wait max for 8 hours - net->last_error[0]=0; // Clear error message - net->last_errno=0; - - net_new_transaction(net); - if ((packet_length=my_net_read(net)) == packet_error) - { - DBUG_PRINT("info",("Got error reading command from socket %s", - vio_description(net->vio) )); - return TRUE; - } - else - { - packet=(char*) net->read_pos; - - command = (enum enum_server_command) (uchar) packet[0]; - DBUG_PRINT("info",("Command on %s = %d (%s)", - vio_description(net->vio), command, - command_name[command])); - } -// net->timeout=old_timeout; // Timeout for writing - DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length)); -} - void send_ok(THD *thd,ha_rows affected_rows,ulonglong id,const char *message) { - NET *net= &thd->net; - if (net->no_send_ok) // hack for re-parsing queries - return; - DBUG_ENTER("send_ok"); MYSQL *mysql= current_thd->mysql; mysql->affected_rows= affected_rows; mysql->insert_id= id; - if (net->return_status) - mysql->server_status= *net->return_status; if (message) { - strmake(net->last_error, message, sizeof(net->last_error)); - mysql->info= net->last_error; + strmake(thd->net.last_error, message, sizeof(thd->net.last_error)-1); } DBUG_VOID_RETURN; } @@ -1438,3 +594,7 @@ int embedded_send_row(THD *thd, int n_fields, char *data, int data_len) DBUG_RETURN(0); } +uint STDCALL mysql_warning_count(MYSQL *mysql) +{ + return ((THD *)mysql->thd)->total_warn_count; +} diff --git a/libmysqld/lib_vio.c b/libmysqld/lib_vio.c index 128857018fd..e9f86cead80 100644 --- a/libmysqld/lib_vio.c +++ b/libmysqld/lib_vio.c @@ -20,6 +20,7 @@ we are working on. In this case we should just return read errors from the file descriptior. */ +#ifdef DUMMY #include <my_global.h> #include "mysql_embed.h" @@ -219,7 +220,7 @@ int create_vio(NET *net, int separate_thread) Vio * v = net->vio; if (!v) { - v = vio_new(0, separate_thread ? VIO_TYPE_SHARED_MEMORY : VIO_TYPE_BUFFER, 0); + v = vio_new(0, separate_thread ? VIO_CLOSED : VIO_TYPE_TCPIP, 0); net->vio = v; } return !v; @@ -233,3 +234,5 @@ void set_thd(Vio *v, void *thd) } } #endif /* HAVE_VIO */ +#endif /* DUMMY */ + diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 68f4fa707d7..8654a9a2dd1 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -67,15 +67,8 @@ TYPELIB sql_protocol_typelib = {array_elements(sql_protocol_names_lib)-1,"", #endif static void mysql_once_init(void); -static MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields, - uint field_count); -static int read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, - ulong *lengths); static void end_server(MYSQL *mysql); -/*static void read_user_name(char *name); -*/ static void append_wild(char *to,char *end,const char *wild); -static int send_file_to_server(MYSQL *mysql,const char *filename); static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to, const char *from, ulong length); @@ -83,130 +76,6 @@ static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to, #define set_sigpipe(mysql) #define reset_sigpipe(mysql) -/***************************************************************************** -** read a packet from server. Give error message if socket was down -** or packet is an error message -*****************************************************************************/ - -ulong -net_safe_read(MYSQL *mysql) -{ - NET *net= &mysql->net; - uint len=0; - //init_sigpipe_variables - /* Don't give sigpipe errors if the client doesn't want them */ - set_sigpipe(mysql); - if (net->vio != 0) - len=my_net_read(net); - reset_sigpipe(mysql); - if (len == packet_error || len == 0) - { - DBUG_PRINT("error",("Wrong connection or packet. fd: %s len: %d", - vio_description(net->vio),len)); - end_server(mysql); - net->last_errno=(net->last_errno == ER_NET_PACKET_TOO_LARGE ? - CR_NET_PACKET_TOO_LARGE: - CR_SERVER_LOST); - strmov(net->last_error,ER(net->last_errno)); - return(packet_error); - } - if (net->read_pos[0] == 255) - { - - if (len > 3) - { - char *pos=(char*) net->read_pos+1; - if (mysql->protocol_version > 9) - { /* New client protocol */ - net->last_errno=uint2korr(pos); - pos+=2; - len-=2; - } - else - { - net->last_errno=CR_UNKNOWN_ERROR; - len--; - } - (void) strmake(net->last_error,(char*) pos, - min(len,sizeof(net->last_error)-1)); - } - else - { - net->last_errno=CR_UNKNOWN_ERROR; - (void) strmov(net->last_error,ER(net->last_errno)); - } - DBUG_PRINT("error",("Got error: %d (%s)", net->last_errno, - net->last_error)); - return(packet_error); - } - return len; -} - - -/* Get the length of next field. Change parameter to point at fieldstart */ -static ulong -net_field_length(uchar **packet) -{ - reg1 uchar *pos= *packet; - if (*pos < 251) - { - (*packet)++; - return (ulong) *pos; - } - if (*pos == 251) - { - (*packet)++; - return NULL_LENGTH; - } - if (*pos == 252) - { - (*packet)+=3; - return (ulong) uint2korr(pos+1); - } - if (*pos == 253) - { - (*packet)+=4; - return (ulong) uint3korr(pos+1); - } - (*packet)+=9; /* Must be 254 when here */ - return (ulong) uint4korr(pos+1); -} - -/* Same as above, but returns ulonglong values */ - -static my_ulonglong -net_field_length_ll(uchar **packet) -{ - reg1 uchar *pos= *packet; - if (*pos < 251) - { - (*packet)++; - return (my_ulonglong) *pos; - } - if (*pos == 251) - { - (*packet)++; - return (my_ulonglong) NULL_LENGTH; - } - if (*pos == 252) - { - (*packet)+=3; - return (my_ulonglong) uint2korr(pos+1); - } - if (*pos == 253) - { - (*packet)+=4; - return (my_ulonglong) uint3korr(pos+1); - } - (*packet)+=9; /* Must be 254 when here */ -#ifdef NO_CLIENT_LONGLONG - return (my_ulonglong) uint4korr(pos+1); -#else - return (my_ulonglong) uint8korr(pos+1); -#endif -} - - static void free_rows(MYSQL_DATA *cur) { if (cur) @@ -232,56 +101,6 @@ struct passwd *getpwuid(uid_t); char* getlogin(void); #endif -#ifdef _DUMMY - -#if !defined(MSDOS) && ! defined(VMS) && !defined(__WIN__) -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; -/*#ifdef __cplusplus - extern "C" struct passwd *getpwuid(uid_t); - extern "C" { char* getlogin(void); } -#else - char * getlogin(); - struct passwd *getpwuid(uid_t); -#endif -*/ - 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"); - strmov(name,str ? str : "ODBC"); /* ODBC will send user variable */ -} - -#endif -#endif /*_DUMMY */ - #ifdef __WIN__ static my_bool is_NT(void) { @@ -360,17 +179,10 @@ static void end_server(MYSQL *mysql) { DBUG_ENTER("end_server"); - if (mysql->net.vio != 0) - { - end_embedded_connection(&mysql->net); - mysql->net.vio= 0; /* Marker */ - } - mysql->net.buff = NULL; free_old_query(mysql); DBUG_VOID_RETURN; } - void STDCALL mysql_free_result(MYSQL_RES *result) { @@ -378,19 +190,6 @@ mysql_free_result(MYSQL_RES *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 <= 8 && 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)); @@ -401,7 +200,6 @@ mysql_free_result(MYSQL_RES *result) DBUG_VOID_RETURN; } - /**************************************************************************** ** Get options from my.cnf ****************************************************************************/ @@ -550,174 +348,6 @@ static void mysql_read_default_options(struct st_mysql_options *options, } -/*************************************************************************** -** 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; - 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 >= 8) - { - 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); - for (field=0 ; field < fields ; field++) - { - if ((len=(ulong) net_field_length(&cp)) == NULL_LENGTH) - { /* null field */ - cur->data[field] = 0; - } - else - { - cur->data[field] = to; - memcpy(to,(char*) cp,len); to[len]=0; - to+=len+1; - cp+=len; - if (mysql_fields) - { - if (mysql_fields[field].max_length < len) - mysql_fields[field].max_length=len; - } - } - } - cur->data[field]=to; /* End of last field */ - if ((pkt_len=net_safe_read(mysql)) == packet_error) - { - free_rows(result); - DBUG_RETURN(0); - } - } - *prev_ptr=0; /* last pointer is null */ - mysql->warning_count= uint2korr(cp+1); - DBUG_PRINT("info",("warning_count: %ld", mysql->warning_count)); - DBUG_PRINT("exit",("Got %d rows",result->rows)); - DBUG_RETURN(result); -} - - -/* -** Read one row. Uses packet buffer as storage for fields. -** When next packet is read, the previous field values are destroyed -*/ - - -static int -read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths) -{ - uint field; - ulong pkt_len,len; - uchar *pos,*prev_pos; - - if ((pkt_len=net_safe_read(mysql)) == packet_error) - return -1; - if (pkt_len <= 8 && mysql->net.read_pos[0] == 254) - { - mysql->warning_count= uint2korr(mysql->net.read_pos+1); - return 1; /* End of data */ - } - prev_pos= 0; /* allowed to write at packet[-1] */ - pos=mysql->net.read_pos; - for (field=0 ; field < fields ; field++) - { - if ((len=(ulong) net_field_length(&pos)) == NULL_LENGTH) - { /* null field */ - row[field] = 0; - *lengths++=0; - } - else - { - row[field] = (char*) pos; - pos+=len; - *lengths++=len; - } - if (prev_pos) - *prev_pos=0; /* Terminate prev field */ - prev_pos=pos; - } - row[field]=(char*) prev_pos+1; /* End of last field */ - *prev_pos=0; /* Terminate last field */ - return 0; -} /**************************************************************************** ** Init MySQL structure or allocate one @@ -732,7 +362,6 @@ mysql_init(MYSQL *mysql) if (!(mysql=(MYSQL*) my_malloc(sizeof(*mysql),MYF(MY_WME | MY_ZEROFILL)))) return 0; mysql->free_me=1; - mysql->net.vio = 0; } else bzero((char*) (mysql),sizeof(*(mysql))); @@ -779,12 +408,6 @@ mysql_connect(MYSQL *mysql,const char *host, } } - -int create_vio(NET *net, int separate_thread); -void set_thd(Vio *vio, void *thd); - -/************/ - static inline int mysql_init_charset(MYSQL *mysql) { char charset_name_buff[16], *charset_name; @@ -809,20 +432,20 @@ static inline int mysql_init_charset(MYSQL *mysql) if (!mysql->charset) { - mysql->net.last_errno=CR_CANT_READ_CHARSET; + mysql->last_errno=CR_CANT_READ_CHARSET; if (mysql->options.charset_dir) - sprintf(mysql->net.last_error,ER(mysql->net.last_errno), + sprintf(mysql->last_error,ER(mysql->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(mysql->net.last_error,ER(mysql->net.last_errno), + sprintf(mysql->last_error,ER(mysql->last_errno), charset_name ? charset_name : "unknown", cs_dir_name); } - return mysql->net.last_errno; + return mysql->last_errno; } return 0; } @@ -837,8 +460,6 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, const char *passwd __attribute__((unused)), const char *db, uint port, const char *unix_socket,uint client_flag) { - ulong max_allowed_packet; - NET *net= &mysql->net; char *db_name; DBUG_ENTER("mysql_real_connect"); DBUG_PRINT("enter",("host: %s db: %s user: %s", @@ -865,17 +486,8 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, unix_socket=0; db_name = db ? my_strdup(db,MYF(MY_WME)) : NULL; - create_vio(net, mysql->options.separate_thread); - if (my_net_init(net, net->vio)) - { - vio_delete(net->vio); - net->last_errno=CR_OUT_OF_MEMORY; - strmov(net->last_error,ER(net->last_errno)); - goto error; - } + mysql->thd= create_embedded_thd(client_flag, db_name); - set_thd(net->vio, create_embedded_thd(net->vio, net->buff, client_flag, db_name)); - init_embedded_mysql(mysql, client_flag, db_name); if (mysql_init_charset(mysql)) @@ -886,25 +498,12 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, client_flag&= ~CLIENT_COMPRESS; if (db) client_flag|=CLIENT_CONNECT_WITH_DB; - max_allowed_packet=net->max_packet_size; - if (db) - { - mysql->db=my_strdup(db,MYF(MY_WME)); - db=0; - } - -/**** - net->timeout=net_read_timeout; -*/ 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)); @@ -913,7 +512,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, error: reset_sigpipe(mysql); - DBUG_PRINT("error",("message: %u (%s)",net->last_errno,net->last_error)); + DBUG_PRINT("error",("message: %u (%s)",mysql->last_errno,mysql->last_error)); { /* Free alloced memory */ my_bool free_me=mysql->free_me; @@ -930,9 +529,10 @@ error: ** Change user and database **************************************************************************/ -my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, - const char *passwd, const char *db) +my_bool STDCALL mysql_change_user(MYSQL *mysql __attribute__((unused)), const char *user __attribute__((unused)), + const char *passwd __attribute__((unused)), const char *db __attribute__((unused))) { +#ifdef DUMMY char buff[512],*pos=buff; DBUG_ENTER("mysql_change_user"); @@ -956,6 +556,8 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, mysql->passwd=my_strdup(passwd,MYF(MY_WME)); mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0; DBUG_RETURN(0); +#endif + return 0; } @@ -972,8 +574,6 @@ mysql_select_db(MYSQL *mysql, const char *db) if ((error=simple_command(mysql,COM_INIT_DB,db,(ulong) 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); } @@ -989,17 +589,6 @@ mysql_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 */ - simple_command(mysql,COM_QUIT,"",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)); @@ -1011,9 +600,7 @@ mysql_close(MYSQL *mysql) 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; @@ -1039,9 +626,7 @@ mysql_query(MYSQL *mysql, const char *query) my_bool STDCALL mysql_read_query_result(MYSQL *mysql) { - NET *net= get_mysql_net(mysql); - - if (net->last_errno) + if (mysql->last_errno) return -1; if (mysql->field_count) @@ -1155,11 +740,9 @@ my_bool my_connect(my_socket s, const struct sockaddr *name, uint namelen, } int STDCALL -mysql_real_query(MYSQL *mysql, const char *query, ulong length) +mysql_send_query(MYSQL* mysql, const char* query, ulong length) { - DBUG_ENTER("mysql_real_query"); - DBUG_PRINT("enter",("handle: %lx",mysql)); - DBUG_PRINT("query",("Query = \"%s\"",query)); + DBUG_ENTER("mysql_send_query"); if (mysql->options.separate_thread) { @@ -1170,68 +753,30 @@ mysql_real_query(MYSQL *mysql, const char *query, ulong length) free_old_query(mysql); /* Free old result */ - if (simple_command(mysql, COM_QUERY, query, length, 1)) - DBUG_RETURN(-1); - - DBUG_RETURN(mysql_read_query_result(mysql)); + DBUG_RETURN(simple_command(mysql, COM_QUERY, query, length, 1)); } - -static int -send_file_to_server(MYSQL *mysql, const char *filename) +int STDCALL +mysql_real_query(MYSQL *mysql, const char *query, ulong length) { - int fd, readcount; - char buf[IO_SIZE*15],*tmp_name; - DBUG_ENTER("send_file_to_server"); + DBUG_ENTER("mysql_real_query"); + DBUG_PRINT("enter",("handle: %lx",mysql)); + DBUG_PRINT("query",("Query = \"%s\"",query)); - 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) + if (mysql->options.separate_thread) { - 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); net_flush(&mysql->net); - my_free(tmp_name,MYF(0)); - DBUG_RETURN(-1); + 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) || net_flush(&mysql->net)) - { - mysql->net.last_errno=CR_SERVER_LOST; - sprintf(mysql->net.last_error,ER(mysql->net.last_errno),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)); + mysql->result= NULL; + + free_old_query(mysql); /* Free old result */ + + if (simple_command(mysql, COM_QUERY, query, length, 1)) DBUG_RETURN(-1); - } - DBUG_RETURN(0); -} + DBUG_RETURN(mysql_read_query_result(mysql)); +} /************************************************************************** ** Alloc result struct for buffered results. All rows are read to buffer. @@ -1296,24 +841,6 @@ MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *res) { DBUG_ENTER("mysql_fetch_row"); - if (!res->data) - { /* Unbufferred fetch */ - if (!res->eof) - { - if (!(read_one_row(res->handle,res->field_count,res->row, res->lengths))) - { - res->row_count++; - DBUG_RETURN(res->current_row=res->row); - } - else - { - DBUG_PRINT("info",("end of data")); - res->eof=1; - res->handle->status=MYSQL_STATUS_READY; - } - } - DBUG_RETURN((MYSQL_ROW) NULL); - } { MYSQL_ROW tmp; if (!res->data_cursor) @@ -1327,6 +854,7 @@ mysql_fetch_row(MYSQL_RES *res) } } + /************************************************************************** ** Get column lengths of the current row ** If one uses mysql_use_result, res->lengths contains the length information, @@ -1434,8 +962,9 @@ mysql_list_tables(MYSQL *mysql, const char *wild) **************************************************************************/ MYSQL_RES * STDCALL -mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) +mysql_list_fields(MYSQL *mysql __attribute__((unused)), const char *table __attribute__((unused)), const char *wild __attribute__((unused))) { +#ifdef DUMMY MYSQL_RES *result; MYSQL_DATA *query; char buff[257],*end; @@ -1465,9 +994,12 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) CLIENT_LONG_FLAG)); result->eof=1; DBUG_RETURN(result); +#endif + return 0; } /* List all running processes (threads) in server */ +#ifdef DUMMY MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql) @@ -1492,7 +1024,9 @@ mysql_list_processes(MYSQL *mysql) mysql->status=MYSQL_STATUS_GET_RESULT; mysql->field_count=field_count; DBUG_RETURN(mysql_store_result(mysql)); + return (MYSQL_RES*)mysql; } +#endif /*DUMMY*/ int STDCALL @@ -1550,9 +1084,10 @@ mysql_dump_debug_info(MYSQL *mysql) const char * STDCALL mysql_stat(MYSQL *mysql) { +#ifdef DUMMY DBUG_ENTER("mysql_stat"); if (simple_command(mysql,COM_STATISTICS,"",0,0)) - return mysql->net.last_error; + return mysql->last_error; mysql->net.read_pos[mysql->packet_length]=0; /* End of stat string */ if (!mysql->net.read_pos[0]) { @@ -1561,6 +1096,8 @@ mysql_stat(MYSQL *mysql) return mysql->net.last_error; } DBUG_RETURN((char*) mysql->net.read_pos); +#endif + return (char *)mysql; } @@ -1573,23 +1110,23 @@ mysql_ping(MYSQL *mysql) const char * STDCALL -mysql_get_server_info(MYSQL *mysql) +mysql_get_server_info(MYSQL *mysql __attribute__((unused))) { - return((char*) mysql->server_version); + return MYSQL_SERVER_VERSION; } const char * STDCALL -mysql_get_host_info(MYSQL *mysql) +mysql_get_host_info(MYSQL *mysql __attribute__((unused))) { - return(mysql->host_info); + return "localhost"; } uint STDCALL -mysql_get_proto_info(MYSQL *mysql) +mysql_get_proto_info(MYSQL *mysql __attribute__((unused))) { - return (mysql->protocol_version); + return PROTOCOL_VERSION; } const char * STDCALL @@ -1714,27 +1251,28 @@ my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql) uint STDCALL mysql_errno(MYSQL *mysql) { - return get_mysql_net(mysql)->last_errno; + return mysql->last_errno; } const char * STDCALL mysql_error(MYSQL *mysql) { - return get_mysql_net(mysql)->last_error; + return mysql->last_error; } -uint STDCALL mysql_warning_count(MYSQL *mysql) -{ - return mysql->warning_count; -} - -const char *STDCALL mysql_info(MYSQL *mysql) +const char *STDCALL mysql_info(MYSQL *mysql __attribute__((unused))) { +#ifdef DUMMY return (mysql)->info; +#endif + return 0; } -ulong STDCALL mysql_thread_id(MYSQL *mysql) +ulong STDCALL mysql_thread_id(MYSQL *mysql __attribute__((unused))) { +#ifdef DUMMY return (mysql)->thread_id; +#endif + return 0; } const char * STDCALL mysql_character_set_name(MYSQL *mysql) @@ -1757,10 +1295,9 @@ MYSQL_RES *STDCALL mysql_warnings(MYSQL *mysql) uint warning_count; DBUG_ENTER("mysql_warnings"); /* Save warning count as mysql_real_query may change this */ - warning_count= mysql->warning_count; + warning_count= mysql_warning_count(mysql); if (mysql_real_query(mysql, "SHOW WARNINGS", 13)) DBUG_RETURN(0); - mysql->warning_count= warning_count; DBUG_RETURN(mysql_store_result(mysql)); } |