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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <ndb_opts.h>
  15. // copied from mysql.cc to get readline
  16. extern "C" {
  17. #if defined( __WIN__) || defined(OS2)
  18. #include <conio.h>
  19. #elif !defined(__NETWARE__)
  20. #include <readline/readline.h>
  21. extern "C" int add_history(const char *command); /* From readline directory */
  22. #define HAVE_READLINE
  23. #endif
  24. }
  25. #include <NdbMain.h>
  26. #include <NdbHost.h>
  27. #include <BaseString.hpp>
  28. #include <NdbOut.hpp>
  29. #include <mgmapi.h>
  30. #include <ndb_version.h>
  31. #include "ndb_mgmclient.hpp"
  32. const char *progname = "ndb_mgm";
  33. static Ndb_mgmclient* com;
  34. extern "C"
  35. void 
  36. handler(int sig)
  37. {
  38.   DBUG_ENTER("handler");
  39.   switch(sig){
  40.   case SIGPIPE:
  41.     /**
  42.      * Will happen when connection to mgmsrv is broken
  43.      * Reset connected flag
  44.      */
  45.     com->disconnect();    
  46.     break;
  47.   }
  48.   DBUG_VOID_RETURN;
  49. }
  50. NDB_STD_OPTS_VARS;
  51. static const char default_prompt[]= "ndb_mgm> ";
  52. static unsigned _try_reconnect;
  53. static const char *prompt= default_prompt;
  54. static char *opt_execute_str= 0;
  55. static struct my_option my_long_options[] =
  56. {
  57.   NDB_STD_OPTS("ndb_mgm"),
  58.   { "execute", 'e',
  59.     "execute command and exit", 
  60.     (gptr*) &opt_execute_str, (gptr*) &opt_execute_str, 0,
  61.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  62.   { "try-reconnect", 't',
  63.     "Specify number of tries for connecting to ndb_mgmd (0 = infinite)", 
  64.     (gptr*) &_try_reconnect, (gptr*) &_try_reconnect, 0,
  65.     GET_UINT, REQUIRED_ARG, 3, 0, 0, 0, 0, 0 },
  66.   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
  67. };
  68. static void short_usage_sub(void)
  69. {
  70.   printf("Usage: %s [OPTIONS] [hostname [port]]n", my_progname);
  71. }
  72. static void usage()
  73. {
  74.   short_usage_sub();
  75.   ndb_std_print_version();
  76.   my_print_help(my_long_options);
  77.   my_print_variables(my_long_options);
  78. }
  79. static my_bool
  80. get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
  81.        char *argument)
  82. {
  83.   return ndb_std_get_one_option(optid, opt, argument ? argument :
  84. "d:t:O,/tmp/ndb_mgm.trace");
  85. }
  86. static int 
  87. read_and_execute(int _try_reconnect) 
  88. {
  89.   static char *line_read = (char *)NULL;
  90.   /* If the buffer has already been allocated, return the memory
  91.      to the free pool. */
  92.   if (line_read)
  93.   {
  94.     free (line_read);
  95.     line_read = (char *)NULL;
  96.   }
  97. #ifdef HAVE_READLINE
  98.   /* Get a line from the user. */
  99.   line_read = readline (prompt);    
  100.   /* If the line has any text in it, save it on the history. */
  101.   if (line_read && *line_read)
  102.     add_history (line_read);
  103. #else
  104.   static char linebuffer[254];
  105.   fputs(prompt, stdout);
  106.   linebuffer[sizeof(linebuffer)-1]=0;
  107.   line_read = fgets(linebuffer, sizeof(linebuffer)-1, stdin);
  108.   if (line_read == linebuffer) {
  109.     char *q=linebuffer;
  110.     while (*q > 31) q++;
  111.     *q=0;
  112.     line_read= strdup(linebuffer);
  113.   }
  114. #endif
  115.   return com->execute(line_read,_try_reconnect);
  116. }
  117. int main(int argc, char** argv){
  118.   NDB_INIT(argv[0]);
  119.   const char *_host = 0;
  120.   int _port = 0;
  121.   const char *load_default_groups[]= { "mysql_cluster","ndb_mgm",0 };
  122.   load_defaults("my",load_default_groups,&argc,&argv);
  123.   int ho_error;
  124.   if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
  125.     exit(ho_error);
  126.   char buf[MAXHOSTNAMELEN+10];
  127.   if(argc == 1) {
  128.     BaseString::snprintf(buf, sizeof(buf), "%s",  argv[0]);
  129.     opt_connect_str= buf;
  130.   } else if (argc >= 2) {
  131.     BaseString::snprintf(buf, sizeof(buf), "%s:%s",  argv[0], argv[1]);
  132.     opt_connect_str= buf;
  133.   }
  134.   if (!isatty(0) || opt_execute_str)
  135.   {
  136.     prompt= 0;
  137.   }
  138.   signal(SIGPIPE, handler);
  139.   com = new Ndb_mgmclient(opt_connect_str,1);
  140.   int ret= 0;
  141.   if (!opt_execute_str)
  142.   {
  143.     ndbout << "-- NDB Cluster -- Management Client --" << endl;
  144.     while(read_and_execute(_try_reconnect));
  145.   }
  146.   else
  147.   {
  148.     com->execute(opt_execute_str,_try_reconnect, &ret);
  149.   }
  150.   delete com;
  151.   ndb_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
  152.   return ret;
  153. }