summaryrefslogtreecommitdiff
path: root/sql/sql_show.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_show.cc')
-rw-r--r--sql/sql_show.cc316
1 files changed, 170 insertions, 146 deletions
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 5899fe86024..fb9db707c16 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+/* Copyright (C) 2000 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -76,6 +76,8 @@ mysqld_show_dbs(THD *thd,const char *wild)
if (mysql_find_files(thd,&files,NullS,mysql_data_home,wild,1))
DBUG_RETURN(1);
List_iterator_fast<char> it(files);
+
+ String *packet= &thd->packet;
while ((file_name=it++))
{
if (thd->master_access & (DB_ACLS | SHOW_DB_ACL) ||
@@ -83,19 +85,20 @@ mysqld_show_dbs(THD *thd,const char *wild)
thd->priv_user, file_name) ||
(grant_option && !check_grant_db(thd, file_name)))
{
- thd->packet.length(0);
- net_store_data(&thd->packet, thd->variables.convert_set, file_name);
- if (my_net_write(&thd->net, (char*) thd->packet.ptr(),
- thd->packet.length()))
+ packet->length(0);
+ net_store_data(packet, thd->variables.convert_set, file_name);
+ if (my_net_write(&thd->net, (char*) packet->ptr(),
+ packet->length()))
DBUG_RETURN(-1);
}
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
+
/***************************************************************************
-** List all open tables in a database
+ List all open tables in a database
***************************************************************************/
int mysqld_show_open_tables(THD *thd,const char *wild)
@@ -116,19 +119,20 @@ int mysqld_show_open_tables(THD *thd,const char *wild)
if (!(open_list=list_open_tables(thd,wild)) && thd->fatal_error)
DBUG_RETURN(-1);
+ String *packet= &thd->packet;
for (; open_list ; open_list=open_list->next)
{
- thd->packet.length(0);
- net_store_data(&thd->packet,convert, open_list->db);
- net_store_data(&thd->packet,convert, open_list->table);
- net_store_data(&thd->packet,open_list->in_use);
- net_store_data(&thd->packet,open_list->locked);
- if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
+ packet->length(0);
+ net_store_data(packet,convert, open_list->db);
+ net_store_data(packet,convert, open_list->table);
+ net_store_data(packet,open_list->in_use);
+ net_store_data(packet,open_list->locked);
+ if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
{
DBUG_RETURN(-1);
}
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
@@ -160,14 +164,15 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild)
if (mysql_find_files(thd,&files,db,path,wild,0))
DBUG_RETURN(-1);
List_iterator_fast<char> it(files);
+ String *packet= &thd->packet;
while ((file_name=it++))
{
- thd->packet.length(0);
- net_store_data(&thd->packet, thd->variables.convert_set, file_name);
- if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
+ packet->length(0);
+ net_store_data(packet, thd->variables.convert_set, file_name);
+ if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
DBUG_RETURN(-1);
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
@@ -175,15 +180,33 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild)
** List all table types supported
***************************************************************************/
-static struct show_table_type_st sys_table_types[]= {
- {"MyISAM", (char *)"YES", "Default type from 3.23 with great performance"},
- {"HEAP" , (char *)"YES", "Hash based, stored in memory, useful for temporary tables"},
- {"MERGE", (char *)"YES", "Collection of identical MyISAM tables"},
- {"ISAM", (char*) &have_isam,"Obsolete table type"},
- {"InnoDB", (char*) &have_innodb,"Supports transactions, row-level locking and foreign keys"},
- {"BDB", (char*) &have_berkeley_db, "Supports transactions and page-level locking"},
+struct show_table_type_st {
+ const char *type;
+ SHOW_COMP_OPTION *value;
+ const char *comment;
+};
+
+
+SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
+
+static struct show_table_type_st sys_table_types[]=
+{
+ {"MyISAM", &have_yes,
+ "Default type from 3.23 with great performance"},
+ {"HEAP" , &have_yes,
+ "Hash based, stored in memory, useful for temporary tables"},
+ {"MERGE", &have_yes,
+ "Collection of identical MyISAM tables"},
+ {"ISAM", &have_isam,
+ "Obsolete table type; Is replaced by MyISAM"},
+ {"InnoDB", &have_innodb,
+ "Supports transactions, row-level locking and foreign keys"},
+ {"BDB", &have_berkeley_db,
+ "Supports transactions and page-level locking"},
+ {NullS, NULL, NullS}
};
+
int mysqld_show_table_types(THD *thd)
{
List<Item> field_list;
@@ -191,76 +214,68 @@ int mysqld_show_table_types(THD *thd)
field_list.push_back(new Item_empty_string("Type",10));
field_list.push_back(new Item_empty_string("Support",10));
- field_list.push_back(new Item_empty_string("Comment",NAME_LEN));
+ field_list.push_back(new Item_empty_string("Comment",80));
if (send_fields(thd,field_list,1))
DBUG_RETURN(1);
- const char *default_type_name=ha_table_typelib.type_names[default_table_type-1];
- show_table_type_st *types = sys_table_types;
-
- uint i;
- for (i = 0; i < 3; i++)
- {
- thd->packet.length(0);
- net_store_data(&thd->packet,types[i].type);
- if (!strcasecmp(default_type_name,types[i].type))
- net_store_data(&thd->packet,"DEFAULT");
- else
- net_store_data(&thd->packet,types[i].value);
- net_store_data(&thd->packet,types[i].comment);
- if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
- DBUG_RETURN(-1);
- }
+ const char *default_type_name= ha_table_typelib.type_names[thd->variables.table_type];
- for (; i < sizeof(sys_table_types)/sizeof(sys_table_types[0]); i++)
+ show_table_type_st *types;
+ String *packet= &thd->packet;
+ for (types= sys_table_types; types->type; types++)
{
- thd->packet.length(0);
- net_store_data(&thd->packet,types[i].type);
- SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) types[i].value;
-
- if (tmp == SHOW_OPTION_NO)
- net_store_data(&thd->packet,"NO");
- else
- {
- if (tmp == SHOW_OPTION_YES)
- {
- if (!strcasecmp(default_type_name,types[i].type))
- net_store_data(&thd->packet,"DEFAULT");
- else
- net_store_data(&thd->packet,"YES");
- }
- else net_store_data(&thd->packet,"DISABLED");
- }
- net_store_data(&thd->packet,types[i].comment);
- if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
+ packet->length(0);
+ net_store_data(packet, types->type);
+ const char *option_name= show_comp_option_name[(int) *types->value];
+
+ if (*types->value == SHOW_OPTION_YES &&
+ !strcasecmp(default_type_name, types->type))
+ option_name= "DEFAULT";
+ net_store_data(packet, option_name);
+ net_store_data(packet, types->comment);
+ if (my_net_write(&thd->net, (char*) packet->ptr(), packet->length()))
DBUG_RETURN(-1);
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
+
/***************************************************************************
-** List all privileges supported
+ List all privileges supported
***************************************************************************/
-static struct show_table_type_st sys_privileges[]= {
- {"Select", (char *)"Tables", "To retrieve rows from table"},
- {"Insert", (char *)"Tables", "To insert data into tables"},
- {"Update", (char *)"Tables", "To update existing rows "},
- {"Delete", (char *)"Tables", "To delete existing rows"},
- {"Index", (char *)"Tables", "To create or drop indexes"},
- {"Alter", (char *)"Tables", "To alter the table"},
- {"Create", (char *)"Databases,Tables,Indexes", "To create new databases and tables"},
- {"Drop", (char *)"Databases,Tables", "To drop databases and tables"},
- {"Grant", (char *)"Databases,Tables", "To give to other users those privileges you possesed"},
- {"References", (char *)"Databases,Tables", "To have references on tables"},
- {"Reload", (char *)"Server Admin", "To reload or refresh tables, logs and privileges"},
- {"Shutdown",(char *)"Server Admin", "To shutdown the server"},
- {"Process", (char *)"Server Admin", "To view the plain text of currently executing queries"},
- {"File", (char *)"File access on server", "To read and write files on the server"},
+struct show_privileges_st {
+ const char *privilege;
+ const char *context;
+ const char *comment;
};
+
+/*
+ TODO: Update with new privileges
+*/
+static struct show_privileges_st sys_privileges[]=
+{
+ {"Select", "Tables", "To retrieve rows from table"},
+ {"Insert", "Tables", "To insert data into tables"},
+ {"Update", "Tables", "To update existing rows "},
+ {"Delete", "Tables", "To delete existing rows"},
+ {"Index", "Tables", "To create or drop indexes"},
+ {"Alter", "Tables", "To alter the table"},
+ {"Create", "Databases,Tables,Indexes", "To create new databases and tables"},
+ {"Drop", "Databases,Tables", "To drop databases and tables"},
+ {"Grant", "Databases,Tables", "To give to other users those privileges you possess"},
+ {"References", "Databases,Tables", "To have references on tables"},
+ {"Reload", "Server Admin", "To reload or refresh tables, logs and privileges"},
+ {"Shutdown","Server Admin", "To shutdown the server"},
+ {"Process", "Server Admin", "To view the plain text of currently executing queries"},
+ {"File", "File access on server", "To read and write files on the server"},
+ {NullS, NullS, NullS}
+};
+
+
int mysqld_show_privileges(THD *thd)
{
List<Item> field_list;
@@ -273,43 +288,48 @@ int mysqld_show_privileges(THD *thd)
if (send_fields(thd,field_list,1))
DBUG_RETURN(1);
- for (uint i=0; i < sizeof(sys_privileges)/sizeof(sys_privileges[0]); i++)
+ show_privileges_st *privilege= sys_privileges;
+ String *packet= &thd->packet;
+ for (privilege= sys_privileges; privilege->privilege ; privilege++)
{
- thd->packet.length(0);
- net_store_data(&thd->packet,sys_privileges[i].type);
- net_store_data(&thd->packet,sys_privileges[i].value);
- net_store_data(&thd->packet,sys_privileges[i].comment);
- if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
+ packet->length(0);
+ net_store_data(packet,privilege->privilege);
+ net_store_data(packet,privilege->context);
+ net_store_data(packet,privilege->comment);
+ if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
DBUG_RETURN(-1);
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
/***************************************************************************
-** List all column types
+ List all column types
***************************************************************************/
-#if 0
-struct show_column_type_st {
+struct show_column_type_st
+{
const char *type;
uint size;
- char *min_value;
- char *max_value;
- uint precision,
- uint scale,
- char *nullable;
- char *auto_increment;
- char *unsigned_attr;
- char *zerofill;
- char *searchable;
- char *case_sensitivity;
- char *default_value;
- char *comment;
+ const char *min_value;
+ const char *max_value;
+ uint precision;
+ uint scale;
+ const char *nullable;
+ const char *auto_increment;
+ const char *unsigned_attr;
+ const char *zerofill;
+ const char *searchable;
+ const char *case_sensitivity;
+ const char *default_value;
+ const char *comment;
};
-#endif
-static struct show_column_type_st sys_column_types[]= {
+
+/* TODO: Add remaning types */
+
+static struct show_column_type_st sys_column_types[]=
+{
{"tinyint",
1, "-128", "127", 0, 0, "YES", "YES",
"NO", "YES", "YES", "NO", "NULL,0",
@@ -343,30 +363,33 @@ int mysqld_show_column_types(THD *thd)
if (send_fields(thd,field_list,1))
DBUG_RETURN(1);
+ /* TODO: Change the loop to not use 'i' */
+ String *packet= &thd->packet;
for (uint i=0; i < sizeof(sys_column_types)/sizeof(sys_column_types[0]); i++)
{
- thd->packet.length(0);
- net_store_data(&thd->packet,sys_column_types[i].type);
- net_store_data(&thd->packet,(longlong)sys_column_types[i].size);
- net_store_data(&thd->packet,sys_column_types[i].min_value);
- net_store_data(&thd->packet,sys_column_types[i].max_value);
- net_store_data(&thd->packet,(uint32)sys_column_types[i].precision);
- net_store_data(&thd->packet,(uint32)sys_column_types[i].scale);
- net_store_data(&thd->packet,sys_column_types[i].nullable);
- net_store_data(&thd->packet,sys_column_types[i].auto_increment);
- net_store_data(&thd->packet,sys_column_types[i].unsigned_attr);
- net_store_data(&thd->packet,sys_column_types[i].zerofill);
- net_store_data(&thd->packet,sys_column_types[i].searchable);
- net_store_data(&thd->packet,sys_column_types[i].case_sensitivity);
- net_store_data(&thd->packet,sys_column_types[i].default_value);
- net_store_data(&thd->packet,sys_column_types[i].comment);
- if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
+ packet->length(0);
+ net_store_data(packet,sys_column_types[i].type);
+ net_store_data(packet,(longlong)sys_column_types[i].size);
+ net_store_data(packet,sys_column_types[i].min_value);
+ net_store_data(packet,sys_column_types[i].max_value);
+ net_store_data(packet,(uint32)sys_column_types[i].precision);
+ net_store_data(packet,(uint32)sys_column_types[i].scale);
+ net_store_data(packet,sys_column_types[i].nullable);
+ net_store_data(packet,sys_column_types[i].auto_increment);
+ net_store_data(packet,sys_column_types[i].unsigned_attr);
+ net_store_data(packet,sys_column_types[i].zerofill);
+ net_store_data(packet,sys_column_types[i].searchable);
+ net_store_data(packet,sys_column_types[i].case_sensitivity);
+ net_store_data(packet,sys_column_types[i].default_value);
+ net_store_data(packet,sys_column_types[i].comment);
+ if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
DBUG_RETURN(-1);
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
+
static int
mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path,
const char *wild, bool dir)
@@ -441,8 +464,9 @@ mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path,
DBUG_RETURN(0);
}
+
/***************************************************************************
-** Extended version of mysqld_show_tables
+ Extended version of mysqld_show_tables
***************************************************************************/
int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
@@ -459,7 +483,6 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
(void) sprintf(path,"%s/%s",mysql_data_home,db);
(void) unpack_dirname(path,path);
-//,default_charset_info
field_list.push_back(item=new Item_empty_string("Name",NAME_LEN));
item->maybe_null=1;
field_list.push_back(item=new Item_empty_string("Type",10));
@@ -612,14 +635,13 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
packet->length()))
DBUG_RETURN(-1);
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
-
/***************************************************************************
-** List all columns in a table
+ List all columns in a table
***************************************************************************/
int
@@ -637,7 +659,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
if (!(table = open_ltable(thd, table_list, TL_UNLOCK)))
{
- send_error(&thd->net);
+ send_error(thd);
DBUG_RETURN(1);
}
file=table->file;
@@ -742,10 +764,11 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
}
}
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
+
int
mysqld_show_create(THD *thd, TABLE_LIST *table_list)
{
@@ -758,7 +781,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
/* Only one table for now */
if (!(table = open_ltable(thd, table_list, TL_UNLOCK)))
{
- send_error(&thd->net);
+ send_error(thd);
DBUG_RETURN(1);
}
@@ -809,7 +832,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
if (my_net_write(&thd->net, (char*)packet->ptr(), packet->length()))
DBUG_RETURN(1);
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
@@ -832,7 +855,7 @@ mysqld_show_logs(THD *thd)
DBUG_RETURN(-1);
#endif
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
@@ -849,7 +872,7 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list)
if (!(table = open_ltable(thd, table_list, TL_UNLOCK)))
{
- send_error(&thd->net);
+ send_error(thd);
DBUG_RETURN(1);
}
@@ -933,14 +956,14 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list)
DBUG_RETURN(1); /* purecov: inspected */
}
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
}
/****************************************************************************
-** Return only fields for API mysql_list_fields
-** Use "show table wildcard" in mysql instead of this
+ Return only fields for API mysql_list_fields
+ Use "show table wildcard" in mysql instead of this
****************************************************************************/
void
@@ -952,7 +975,7 @@ mysqld_list_fields(THD *thd, TABLE_LIST *table_list, const char *wild)
if (!(table = open_ltable(thd, table_list, TL_UNLOCK)))
{
- send_error(&thd->net);
+ send_error(thd);
DBUG_VOID_RETURN;
}
List<Item> field_list;
@@ -971,6 +994,7 @@ mysqld_list_fields(THD *thd, TABLE_LIST *table_list, const char *wild)
DBUG_VOID_RETURN;
}
+
int
mysqld_dump_create_info(THD *thd, TABLE *table, int fd)
{
@@ -978,7 +1002,7 @@ mysqld_dump_create_info(THD *thd, TABLE *table, int fd)
DBUG_ENTER("mysqld_dump_create_info");
DBUG_PRINT("enter",("table: %s",table->real_name));
- String* packet = &thd->packet;
+ String *packet = &thd->packet;
packet->length(0);
if (store_create_info(thd,table,packet))
DBUG_RETURN(-1);
@@ -1000,6 +1024,7 @@ mysqld_dump_create_info(THD *thd, TABLE *table, int fd)
DBUG_RETURN(0);
}
+
static void
append_identifier(THD *thd, String *packet, const char *name)
{
@@ -1015,6 +1040,7 @@ append_identifier(THD *thd, String *packet, const char *name)
}
}
+
static int
store_create_info(THD *thd, TABLE *table, String *packet)
{
@@ -1215,8 +1241,8 @@ store_create_info(THD *thd, TABLE *table, String *packet)
/****************************************************************************
-** Return info about all processes
-** returns for each thread: thread id, user, host, db, command, info
+ Return info about all processes
+ returns for each thread: thread id, user, host, db, command, info
****************************************************************************/
class thread_info :public ilink {
@@ -1357,7 +1383,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
break; /* purecov: inspected */
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_VOID_RETURN;
}
@@ -1372,7 +1398,7 @@ int mysqld_show_charsets(THD *thd, const char *wild)
char buff[8192];
String packet2(buff,sizeof(buff),default_charset_info);
List<Item> field_list;
- CONVERT *convert=thd->convert_set;
+ CONVERT *convert=thd->variables.convert_set;
CHARSET_INFO *cs;
DBUG_ENTER("mysqld_show_charsets");
@@ -1401,7 +1427,7 @@ int mysqld_show_charsets(THD *thd, const char *wild)
goto err;
}
}
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
err:
DBUG_RETURN(1);
@@ -1428,7 +1454,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
for (; variables->name; variables++)
{
if (!(wild && wild[0] && wild_case_compare(system_charset_info,
- variables[i].name,wild)))
+ variables->name,wild)))
{
packet2.length(0);
net_store_data(&packet2,convert,variables->name);
@@ -1461,9 +1487,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
case SHOW_HAVE:
{
SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) value;
- net_store_data(&packet2, (tmp == SHOW_OPTION_NO ? "NO" :
- tmp == SHOW_OPTION_YES ? "YES" :
- "DISABLED"));
+ net_store_data(&packet2, show_comp_option_name[(int) tmp]);
break;
}
case SHOW_CHAR:
@@ -1663,7 +1687,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
}
pthread_mutex_unlock(&LOCK_status);
/* pthread_mutex_unlock(&THR_LOCK_keycache); */
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_RETURN(0);
err: