summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorunknown <vva@genie.(none)>2002-10-28 17:44:19 +0400
committerunknown <vva@genie.(none)>2002-10-28 17:44:19 +0400
commitfc4c9c01ee8105888b75f01728f651c4c496cc22 (patch)
tree79f4355d0503e7a386a562644189da5ab9c08b60 /client
parentd2c7f44ff638ab28970f25baccc87210388588cd (diff)
downloadmariadb-git-fc4c9c01ee8105888b75f01728f651c4c496cc22.tar.gz
add help command on server side
include/mysqld_error.h: add error for corrupt help db scripts/Makefile.am: add script for fill help db scripts/mysql_install_db.sh: modify for add help db sql/Makefile.am: modify for add sql_help.cc sql/lex.h: add help command sql/mysql_priv.h: add mysqld_help function declaration sql/share/czech/errmsg.txt: add message for help-db error sql/share/danish/errmsg.txt: add message for help-db error sql/share/dutch/errmsg.txt: add message for help-db error sql/share/english/errmsg.txt: add message for help-db error sql/share/estonian/errmsg.txt: add message for help-db error sql/share/french/errmsg.txt: add message for help-db error sql/share/german/errmsg.txt: add message for help-db error sql/share/greek/errmsg.txt: add message for help-db error sql/share/hungarian/errmsg.txt: add message for help-db error sql/share/italian/errmsg.txt: add message for help-db error sql/share/japanese/errmsg.txt: add message for help-db error sql/share/korean/errmsg.txt: add message for help-db error sql/share/norwegian-ny/errmsg.txt: add message for help-db error sql/share/norwegian/errmsg.txt: add message for help-db error sql/share/polish/errmsg.txt: add message for help-db error sql/share/portuguese/errmsg.txt: add message for help-db error sql/share/romanian/errmsg.txt: add message for help-db error sql/share/russian/errmsg.txt: add message for help-db error sql/share/serbian/errmsg.txt: add message for help-db error sql/share/slovak/errmsg.txt: add message for help-db error sql/share/spanish/errmsg.txt: add message for help-db error sql/share/swedish/errmsg.txt: add message for help-db error sql/share/ukrainian/errmsg.txt: add message for help-db error sql/sql_lex.h: add SQLCOM_END and help_arg in Lex sql/sql_parse.cc: add SQLCOM_HELP handler sql/sql_yacc.yy: add help command
Diffstat (limited to 'client')
-rw-r--r--client/mysql.cc195
1 files changed, 154 insertions, 41 deletions
diff --git a/client/mysql.cc b/client/mysql.cc
index 07c1bfeb817..fbd3b13ca83 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -205,8 +205,8 @@ typedef struct {
} COMMANDS;
static COMMANDS commands[] = {
- { "help", 'h', com_help, 0, "Display this help." },
- { "?", '?', com_help, 0, "Synonym for `help'." },
+ { "help", 'h', com_help, 1, "Display this help." },
+ { "?", '?', com_help, 1, "Synonym for `help'." },
{ "clear", 'c', com_clear, 0, "Clear command."},
{ "connect",'r', com_connect,1,
"Reconnect to the server. Optional arguments are db and host." },
@@ -382,8 +382,9 @@ int main(int argc,char *argv[])
}
}
#endif
- sprintf(buff,
- "Type 'help;' or '\\h' for help. Type '\\c' to clear the buffer.\n");
+ sprintf(buff, "%s%s",
+ "Type 'help;' or '\\h' for help. Type '\\c' to clear the buffer.\n",
+ "Type 'help [[%]function name[%]]' to get help on usage of function.\n");
put_info(buff,INFO_INFO);
status.exit_status=read_lines(1); // read lines and execute them
if (opt_outfile)
@@ -1322,31 +1323,154 @@ static int reconnect(void)
The different commands
***************************************************************************/
+int mysql_real_query_for_lazy(const char *buf, int length)
+{
+ for (uint retry=0;; retry++)
+ {
+ if (!mysql_real_query(&mysql,buf,length))
+ return 0;
+ uint error=put_info(mysql_error(&mysql),INFO_ERROR, mysql_errno(&mysql));
+ if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR || retry > 1
+ || status.batch)
+ return error;
+ if (reconnect())
+ return error;
+ }
+}
+
+int mysql_store_result_for_lazy(MYSQL_RES **result)
+{
+ if ((*result=mysql_store_result(&mysql)))
+ return 0;
+
+ if (mysql_error(&mysql)[0])
+ return put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql));
+
+ return 0;
+}
+
+static int com_server_help(String *buffer __attribute__((unused)),
+ char *line __attribute__((unused)), char *help_arg)
+{
+ MYSQL_ROW cur;
+ const char *server_cmd= buffer->ptr();
+ char cmd_buf[100];
+
+ if (help_arg[0]!='\'')
+ {
+ (void*)sprintf(cmd_buf,"help \'%s\';",help_arg);
+ server_cmd= cmd_buf;
+ }
+
+ char buff[16], time_buf[32];
+ MYSQL_RES *result;
+ ulong timer;
+ uint error= 0;
+
+ if (!status.batch)
+ {
+ old_buffer= *buffer;
+ old_buffer.copy();
+ }
+
+ if (!connected && reconnect())
+ return 1;
+
+ timer= start_timer();
+
+ error= mysql_real_query_for_lazy(server_cmd,strlen(server_cmd));
+ if (error)
+ return error;
+
+ error= mysql_store_result_for_lazy(&result);
+ if (error)
+ return error;
+
+ if (result)
+ {
+ int num_rows= mysql_num_rows(result);
+ if (num_rows==1)
+ {
+ if (!(cur= mysql_fetch_row(result)))
+ return -1;
+
+ init_pager();
+ if (cur[1][0]=='Y')
+ {
+ tee_fprintf(PAGER, "\nHelp topic \'%s\'\n", cur[0]);
+ tee_fprintf(PAGER, "%s\n", cur[2]);
+ tee_fprintf(PAGER, "For help on specific function please type 'help <function>' where function is one of next :\n%s\n", cur[3]);
+ }
+ else
+ {
+ tee_fprintf(PAGER, "\nName : \'%s\'\n\n", cur[0]);
+ tee_fprintf(PAGER, "Description : \n%s\n\n", cur[2]);
+ tee_fprintf(PAGER, "Examples : \n%s\n", cur[3]);
+ }
+ end_pager();
+ }
+ else if (num_rows>1)
+ {
+ put_info("\nMany help items for your request exist", INFO_INFO);
+ put_info("For more specific request please type 'help <item>' where item is one of next :", INFO_INFO);
+
+ init_pager();
+ char last_char= '_';
+ while ((cur= mysql_fetch_row(result))){
+ if (cur[1][0]!=last_char){
+ put_info("-------------------------------------------", INFO_INFO);
+ put_info(cur[1][0]=='Y' ?
+ "categories:" : "functions:", INFO_INFO);
+ put_info("-------------------------------------------", INFO_INFO);
+ }
+ last_char= cur[1][0];
+ tee_fprintf(PAGER, "%s\n", cur[0]);
+ }
+ tee_fprintf(PAGER, "\n");
+ end_pager();
+ }
+ else
+ {
+ put_info("\nNothing found\n", INFO_INFO);
+ }
+ }
+
+ mysql_free_result(result);
+ return error;
+}
+
static int
com_help (String *buffer __attribute__((unused)),
char *line __attribute__((unused)))
{
reg1 int i;
+ char * help_arg= strchr(line,' ');
- put_info("\nFor the complete MySQL Manual online visit:\n http://www.mysql.com/documentation\n", INFO_INFO);
- put_info("For info on technical support from MySQL developers visit:\n http://www.mysql.com/support\n", INFO_INFO);
- put_info("For info on MySQL books, utilities, consultants, etc. visit:\n http://www.mysql.com/portal\n", INFO_INFO);
- put_info("List of all MySQL commands:", INFO_INFO);
- if (!named_cmds)
- put_info(" (Commands must appear first on line and end with ';')\n",
- INFO_INFO);
- for (i = 0; commands[i].name; i++)
+ if (help_arg)
{
- if (commands[i].func)
- tee_fprintf(stdout, "%s\t(\\%c)\t%s\n", commands[i].name,
- commands[i].cmd_char, commands[i].doc);
+ return com_server_help(buffer,line,help_arg+1);
}
- if (connected)
- tee_fprintf(stdout,
+ else
+ {
+ put_info("\nFor the complete MySQL Manual online visit:\n http://www.mysql.com/documentation\n", INFO_INFO);
+ put_info("For info on technical support from MySQL developers visit:\n http://www.mysql.com/support\n", INFO_INFO);
+ put_info("For info on MySQL books, utilities, consultants, etc. visit:\n http://www.mysql.com/portal\n", INFO_INFO);
+ put_info("List of all MySQL commands:", INFO_INFO);
+ if (!named_cmds)
+ put_info("Note that all text commands must be first on line and end with ';'",INFO_INFO);
+ for (i = 0; commands[i].name; i++)
+ {
+ if (commands[i].func)
+ tee_fprintf(stdout, "%s\t(\\%c)\t%s\n", commands[i].name,
+ commands[i].cmd_char, commands[i].doc);
+ }
+ if (connected)
+ tee_fprintf(stdout,
"\nConnection id: %ld (Can be used with mysqladmin kill)\n\n",
mysql_thread_id(&mysql));
- else
- tee_fprintf(stdout, "Not connected! Reconnect with 'connect'!\n\n");
+ else
+ tee_fprintf(stdout, "Not connected! Reconnect with 'connect'!\n\n");
+ }
return 0;
}
@@ -1411,23 +1535,14 @@ com_go(String *buffer,char *line __attribute__((unused)))
}
timer=start_timer();
- for (uint retry=0;; retry++)
+
+ error= mysql_real_query_for_lazy(buffer->ptr(),buffer->length());
+ if (error)
{
- if (!mysql_real_query(&mysql,buffer->ptr(),buffer->length()))
- break;
- error=put_info(mysql_error(&mysql),INFO_ERROR, mysql_errno(&mysql));
- if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR || retry > 1
- || status.batch)
- {
- buffer->length(0); // Remove query on error
- return error;
- }
- if (reconnect())
- {
- buffer->length(0); // Remove query on error
- return error;
- }
+ buffer->length(0); // Remove query on error
+ return error;
}
+
error=0;
buffer->length(0);
@@ -1440,13 +1555,9 @@ com_go(String *buffer,char *line __attribute__((unused)))
}
else
{
- if (!(result=mysql_store_result(&mysql)))
- {
- if (mysql_error(&mysql)[0])
- {
- return put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql));
- }
- }
+ error= mysql_store_result_for_lazy(&result);
+ if (error)
+ return error;
}
if (verbose >= 3 || !opt_silent)
@@ -2772,3 +2883,5 @@ void sql_element_free(void *ptr)
my_free((gptr) ptr,MYF(0));
}
#endif /* EMBEDDED_LIBRARY */
+
+