diff options
author | unknown <petr@mysql.com> | 2004-11-18 14:53:21 +0300 |
---|---|---|
committer | unknown <petr@mysql.com> | 2004-11-18 14:53:21 +0300 |
commit | e1f5b3f926ec7b2f582f975c867d2cc1877c1844 (patch) | |
tree | b70c2bfed5cff7af70738e97f5524c8afa7e34c8 /sql/sql_show.cc | |
parent | cd2edd171396ba8041f4e0109e0f339b9b99ee0c (diff) | |
parent | 4dac69eb11839d9c996669f88aba0230916efcbc (diff) | |
download | mariadb-git-e1f5b3f926ec7b2f582f975c867d2cc1877c1844.tar.gz |
Merge mysql.com:/home/cps/mysql/trees/mysql-5.0
into mysql.com:/home/cps/mysql/devel/innotask/mysql-5.0-inno-final
sql/ha_innodb.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/structs.h:
Auto merged
Diffstat (limited to 'sql/sql_show.cc')
-rw-r--r-- | sql/sql_show.cc | 581 |
1 files changed, 309 insertions, 272 deletions
diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 97fc6c2e138..b3cd9be2eaf 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1401,311 +1401,348 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) Status functions *****************************************************************************/ -bool mysqld_show(THD *thd, const char *wild, show_var_st *variables, - enum enum_var_type value_type, - pthread_mutex_t *mutex, - struct system_status_var *status_var) + +static bool show_status_array(THD *thd, const char *wild, + show_var_st *variables, + enum enum_var_type value_type, + struct system_status_var *status_var, + const char *prefix) { - char buff[1024]; - List<Item> field_list; + char buff[1024], *prefix_end; + /* the variable name should not be longer then 80 characters */ + char name_buffer[80]; + int len; Protocol *protocol= thd->protocol; LEX_STRING null_lex_str; - DBUG_ENTER("mysqld_show"); + DBUG_ENTER("show_status_array"); - field_list.push_back(new Item_empty_string("Variable_name",30)); - field_list.push_back(new Item_empty_string("Value",256)); - if (protocol->send_fields(&field_list, - Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) - DBUG_RETURN(TRUE); /* purecov: inspected */ null_lex_str.str= 0; // For sys_var->value_ptr() null_lex_str.length= 0; - pthread_mutex_lock(mutex); + prefix_end=strnmov(name_buffer, prefix, sizeof(name_buffer)-1); + len=name_buffer + sizeof(name_buffer) - prefix_end; + for (; variables->name; variables++) { - if (!(wild && wild[0] && wild_case_compare(system_charset_info, - variables->name,wild))) + strnmov(prefix_end, variables->name, len); + name_buffer[sizeof(name_buffer)-1]=0; /* Safety */ + SHOW_TYPE show_type=variables->type; + if (show_type == SHOW_VARS) + { + show_status_array(thd, wild, (show_var_st *) variables->value, + value_type, status_var, variables->name); + } + else { - protocol->prepare_for_resend(); - protocol->store(variables->name, system_charset_info); - SHOW_TYPE show_type=variables->type; - char *value=variables->value; - const char *pos, *end; - long nr; - - if (show_type == SHOW_SYS) + if (!(wild && wild[0] && wild_case_compare(system_charset_info, + name_buffer, wild))) { - show_type= ((sys_var*) value)->type(); - value= (char*) ((sys_var*) value)->value_ptr(thd, value_type, - &null_lex_str); - } + char *value=variables->value; + const char *pos, *end; + long nr; - pos= end= buff; - switch (show_type) { - case SHOW_LONG_STATUS: - case SHOW_LONG_CONST_STATUS: - value= ((char *) status_var + (ulong) value); - /* fall through */ - case SHOW_LONG: - case SHOW_LONG_CONST: - end= int10_to_str(*(long*) value, buff, 10); - break; - case SHOW_LONGLONG: - end= longlong10_to_str(*(longlong*) value, buff, 10); - break; - case SHOW_HA_ROWS: - end= longlong10_to_str((longlong) *(ha_rows*) value, buff, 10); - break; - case SHOW_BOOL: - end= strmov(buff, *(bool*) value ? "ON" : "OFF"); - break; - case SHOW_MY_BOOL: - end= strmov(buff, *(my_bool*) value ? "ON" : "OFF"); - break; - case SHOW_INT_CONST: - case SHOW_INT: - end= int10_to_str((long) *(uint32*) value, buff, 10); - break; - case SHOW_HAVE: - { - SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) value; - pos= show_comp_option_name[(int) tmp]; - end= strend(pos); - break; - } - case SHOW_CHAR: - { - if (!(pos= value)) - pos= ""; - end= strend(pos); - break; - } - case SHOW_STARTTIME: - nr= (long) (thd->query_start() - start_time); - end= int10_to_str(nr, buff, 10); - break; - case SHOW_QUESTION: - end= int10_to_str((long) thd->query_id, buff, 10); - break; + protocol->prepare_for_resend(); + protocol->store(name_buffer, system_charset_info); + + if (show_type == SHOW_SYS) + { + show_type= ((sys_var*) value)->type(); + value= (char*) ((sys_var*) value)->value_ptr(thd, value_type, + &null_lex_str); + } + + pos= end= buff; + switch (show_type) { + case SHOW_LONG_STATUS: + case SHOW_LONG_CONST_STATUS: + value= ((char *) status_var + (ulong) value); + /* fall through */ + case SHOW_LONG: + case SHOW_LONG_CONST: + end= int10_to_str(*(long*) value, buff, 10); + break; + case SHOW_LONGLONG: + end= longlong10_to_str(*(longlong*) value, buff, 10); + break; + case SHOW_HA_ROWS: + end= longlong10_to_str((longlong) *(ha_rows*) value, buff, 10); + break; + case SHOW_BOOL: + end= strmov(buff, *(bool*) value ? "ON" : "OFF"); + break; + case SHOW_MY_BOOL: + end= strmov(buff, *(my_bool*) value ? "ON" : "OFF"); + break; + case SHOW_INT_CONST: + case SHOW_INT: + end= int10_to_str((long) *(uint32*) value, buff, 10); + break; + case SHOW_HAVE: + { + SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) value; + pos= show_comp_option_name[(int) tmp]; + end= strend(pos); + break; + } + case SHOW_CHAR: + { + if (!(pos= value)) + pos= ""; + end= strend(pos); + break; + } + case SHOW_STARTTIME: + nr= (long) (thd->query_start() - start_time); + end= int10_to_str(nr, buff, 10); + break; + case SHOW_QUESTION: + end= int10_to_str((long) thd->query_id, buff, 10); + break; #ifdef HAVE_REPLICATION - case SHOW_RPL_STATUS: - end= strmov(buff, rpl_status_type[(int)rpl_status]); - break; - case SHOW_SLAVE_RUNNING: - { - pthread_mutex_lock(&LOCK_active_mi); - end= strmov(buff, (active_mi->slave_running && - active_mi->rli.slave_running) ? "ON" : "OFF"); - pthread_mutex_unlock(&LOCK_active_mi); - break; - } + case SHOW_RPL_STATUS: + end= strmov(buff, rpl_status_type[(int)rpl_status]); + break; + case SHOW_SLAVE_RUNNING: + { + pthread_mutex_lock(&LOCK_active_mi); + end= strmov(buff, (active_mi->slave_running && + active_mi->rli.slave_running) ? "ON" : "OFF"); + pthread_mutex_unlock(&LOCK_active_mi); + break; + } #endif /* HAVE_REPLICATION */ - case SHOW_OPENTABLES: - end= int10_to_str((long) cached_tables(), buff, 10); - break; - case SHOW_CHAR_PTR: - { - if (!(pos= *(char**) value)) - pos= ""; - end= strend(pos); - break; - } - case SHOW_DOUBLE: - { - end= buff + sprintf(buff, "%f", *(double*) value); - break; - } + case SHOW_OPENTABLES: + end= int10_to_str((long) cached_tables(), buff, 10); + break; + case SHOW_CHAR_PTR: + { + if (!(pos= *(char**) value)) + pos= ""; + end= strend(pos); + break; + } + case SHOW_DOUBLE: + { + end= buff + sprintf(buff, "%f", *(double*) value); + break; + } #ifdef HAVE_OPENSSL - /* First group - functions relying on CTX */ - case SHOW_SSL_CTX_SESS_ACCEPT: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_accept(ssl_acceptor_fd-> - ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_ACCEPT_GOOD: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_accept_good(ssl_acceptor_fd-> - ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_CONNECT_GOOD: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_connect_good(ssl_acceptor_fd-> - ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_ACCEPT_RENEGOTIATE: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_accept_renegotiate(ssl_acceptor_fd->ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_CONNECT_RENEGOTIATE: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_connect_renegotiate(ssl_acceptor_fd-> ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_CB_HITS: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_cb_hits(ssl_acceptor_fd-> - ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_HITS: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_hits(ssl_acceptor_fd-> - ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_CACHE_FULL: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_cache_full(ssl_acceptor_fd-> - ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_MISSES: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_misses(ssl_acceptor_fd-> - ssl_context)), - buff, 10); - break; - case SHOW_SSL_CTX_SESS_TIMEOUTS: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_timeouts(ssl_acceptor_fd->ssl_context)), - buff,10); - break; - case SHOW_SSL_CTX_SESS_NUMBER: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_number(ssl_acceptor_fd->ssl_context)), - buff,10); - break; - case SHOW_SSL_CTX_SESS_CONNECT: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_connect(ssl_acceptor_fd->ssl_context)), - buff,10); - break; - case SHOW_SSL_CTX_SESS_GET_CACHE_SIZE: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_sess_get_cache_size(ssl_acceptor_fd->ssl_context)), - buff,10); - break; - case SHOW_SSL_CTX_GET_VERIFY_MODE: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_get_verify_mode(ssl_acceptor_fd->ssl_context)), - buff,10); - break; - case SHOW_SSL_CTX_GET_VERIFY_DEPTH: - end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : - SSL_CTX_get_verify_depth(ssl_acceptor_fd->ssl_context)), - buff,10); - break; - case SHOW_SSL_CTX_GET_SESSION_CACHE_MODE: - if (!ssl_acceptor_fd) - { - pos= "NONE"; - end= pos+4; - break; - } - switch (SSL_CTX_get_session_cache_mode(ssl_acceptor_fd->ssl_context)) - { + /* First group - functions relying on CTX */ + case SHOW_SSL_CTX_SESS_ACCEPT: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_accept(ssl_acceptor_fd-> + ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_ACCEPT_GOOD: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_accept_good(ssl_acceptor_fd-> + ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_CONNECT_GOOD: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_connect_good(ssl_acceptor_fd-> + ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_ACCEPT_RENEGOTIATE: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_accept_renegotiate(ssl_acceptor_fd->ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_CONNECT_RENEGOTIATE: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_connect_renegotiate(ssl_acceptor_fd-> ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_CB_HITS: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_cb_hits(ssl_acceptor_fd-> + ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_HITS: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_hits(ssl_acceptor_fd-> + ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_CACHE_FULL: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_cache_full(ssl_acceptor_fd-> + ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_MISSES: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_misses(ssl_acceptor_fd-> + ssl_context)), + buff, 10); + break; + case SHOW_SSL_CTX_SESS_TIMEOUTS: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_timeouts(ssl_acceptor_fd->ssl_context)), + buff,10); + break; + case SHOW_SSL_CTX_SESS_NUMBER: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_number(ssl_acceptor_fd->ssl_context)), + buff,10); + break; + case SHOW_SSL_CTX_SESS_CONNECT: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_connect(ssl_acceptor_fd->ssl_context)), + buff,10); + break; + case SHOW_SSL_CTX_SESS_GET_CACHE_SIZE: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_sess_get_cache_size(ssl_acceptor_fd->ssl_context)), + buff,10); + break; + case SHOW_SSL_CTX_GET_VERIFY_MODE: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_get_verify_mode(ssl_acceptor_fd->ssl_context)), + buff,10); + break; + case SHOW_SSL_CTX_GET_VERIFY_DEPTH: + end= int10_to_str((long) (!ssl_acceptor_fd ? 0 : + SSL_CTX_get_verify_depth(ssl_acceptor_fd->ssl_context)), + buff,10); + break; + case SHOW_SSL_CTX_GET_SESSION_CACHE_MODE: + if (!ssl_acceptor_fd) + { + pos= "NONE"; + end= pos+4; + break; + } + switch (SSL_CTX_get_session_cache_mode(ssl_acceptor_fd->ssl_context)) + { case SSL_SESS_CACHE_OFF: pos= "OFF"; - break; + break; case SSL_SESS_CACHE_CLIENT: pos= "CLIENT"; - break; + break; case SSL_SESS_CACHE_SERVER: pos= "SERVER"; - break; + break; case SSL_SESS_CACHE_BOTH: pos= "BOTH"; - break; + break; case SSL_SESS_CACHE_NO_AUTO_CLEAR: pos= "NO_AUTO_CLEAR"; - break; + break; case SSL_SESS_CACHE_NO_INTERNAL_LOOKUP: pos= "NO_INTERNAL_LOOKUP"; - break; - default: + break; + default: pos= "Unknown"; - break; - } - end= strend(pos); - break; - /* First group - functions relying on SSL */ - case SHOW_SSL_GET_VERSION: - pos= (thd->net.vio->ssl_arg ? - SSL_get_version((SSL*) thd->net.vio->ssl_arg) : ""); - end= strend(pos); - break; - case SHOW_SSL_SESSION_REUSED: - end= int10_to_str((long) (thd->net.vio->ssl_arg ? - SSL_session_reused((SSL*) thd->net.vio-> - ssl_arg) : - 0), - buff, 10); - break; - case SHOW_SSL_GET_DEFAULT_TIMEOUT: - end= int10_to_str((long) (thd->net.vio->ssl_arg ? - SSL_get_default_timeout((SSL*) thd->net.vio-> - ssl_arg) : - 0), - buff, 10); - break; - case SHOW_SSL_GET_VERIFY_MODE: - end= int10_to_str((long) (thd->net.vio->ssl_arg ? - SSL_get_verify_mode((SSL*) thd->net.vio-> - ssl_arg): - 0), - buff, 10); - break; - case SHOW_SSL_GET_VERIFY_DEPTH: - end= int10_to_str((long) (thd->net.vio->ssl_arg ? - SSL_get_verify_depth((SSL*) thd->net.vio-> - ssl_arg): - 0), - buff, 10); - break; - case SHOW_SSL_GET_CIPHER: - pos= (thd->net.vio->ssl_arg ? - SSL_get_cipher((SSL*) thd->net.vio->ssl_arg) : "" ); - end= strend(pos); - break; - case SHOW_SSL_GET_CIPHER_LIST: - if (thd->net.vio->ssl_arg) - { - char *to= buff; - for (int i=0 ; i++ ;) - { - const char *p= SSL_get_cipher_list((SSL*) thd->net.vio->ssl_arg,i); - if (p == NULL) - break; - to= strmov(to, p); - *to++= ':'; - } - if (to != buff) - to--; // Remove last ':' - end= to; - } - break; + break; + } + end= strend(pos); + break; + /* First group - functions relying on SSL */ + case SHOW_SSL_GET_VERSION: + pos= (thd->net.vio->ssl_arg ? + SSL_get_version((SSL*) thd->net.vio->ssl_arg) : ""); + end= strend(pos); + break; + case SHOW_SSL_SESSION_REUSED: + end= int10_to_str((long) (thd->net.vio->ssl_arg ? + SSL_session_reused((SSL*) thd->net.vio-> + ssl_arg) : + 0), + buff, 10); + break; + case SHOW_SSL_GET_DEFAULT_TIMEOUT: + end= int10_to_str((long) (thd->net.vio->ssl_arg ? + SSL_get_default_timeout((SSL*) thd->net.vio-> + ssl_arg) : + 0), + buff, 10); + break; + case SHOW_SSL_GET_VERIFY_MODE: + end= int10_to_str((long) (thd->net.vio->ssl_arg ? + SSL_get_verify_mode((SSL*) thd->net.vio-> + ssl_arg): + 0), + buff, 10); + break; + case SHOW_SSL_GET_VERIFY_DEPTH: + end= int10_to_str((long) (thd->net.vio->ssl_arg ? + SSL_get_verify_depth((SSL*) thd->net.vio-> + ssl_arg): + 0), + buff, 10); + break; + case SHOW_SSL_GET_CIPHER: + pos= (thd->net.vio->ssl_arg ? + SSL_get_cipher((SSL*) thd->net.vio->ssl_arg) : "" ); + end= strend(pos); + break; + case SHOW_SSL_GET_CIPHER_LIST: + if (thd->net.vio->ssl_arg) + { + char *to= buff; + for (int i=0 ; i++ ;) + { + const char *p= SSL_get_cipher_list((SSL*) thd->net.vio->ssl_arg,i); + if (p == NULL) + break; + to= strmov(to, p); + *to++= ':'; + } + if (to != buff) + to--; // Remove last ':' + end= to; + } + break; #endif /* HAVE_OPENSSL */ - case SHOW_KEY_CACHE_LONG: - case SHOW_KEY_CACHE_CONST_LONG: - value= (value-(char*) &dflt_key_cache_var)+ (char*) sql_key_cache; - end= int10_to_str(*(long*) value, buff, 10); - break; - case SHOW_UNDEF: // Show never happen - case SHOW_SYS: - break; // Return empty string - default: - break; + case SHOW_KEY_CACHE_LONG: + case SHOW_KEY_CACHE_CONST_LONG: + value= (value-(char*) &dflt_key_cache_var)+ (char*) sql_key_cache; + end= int10_to_str(*(long*) value, buff, 10); + break; + case SHOW_UNDEF: // Show never happen + case SHOW_SYS: + break; // Return empty string + default: + break; + } + if (protocol->store(pos, (uint32) (end - pos), system_charset_info) || + protocol->write()) + DBUG_RETURN(TRUE); /* purecov: inspected */ } - if (protocol->store(pos, (uint32) (end - pos), system_charset_info) || - protocol->write()) - goto err; /* purecov: inspected */ } } + + DBUG_RETURN(FALSE); +} + + +bool mysqld_show(THD *thd, const char *wild, show_var_st *variables, + enum enum_var_type value_type, + pthread_mutex_t *mutex, + struct system_status_var *status_var) +{ + List<Item> field_list; + Protocol *protocol= thd->protocol; + DBUG_ENTER("mysqld_show"); + + ha_update_statistics(); /* Export engines statistics */ + + field_list.push_back(new Item_empty_string("Variable_name",30)); + field_list.push_back(new Item_empty_string("Value",256)); + if (protocol->send_fields(&field_list, + Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) + DBUG_RETURN(TRUE); /* purecov: inspected */ + + pthread_mutex_lock(mutex); + if (show_status_array(thd, wild, variables, value_type, status_var, "")) + goto err; pthread_mutex_unlock(mutex); send_eof(thd); DBUG_RETURN(FALSE); |