main.cpp 4.25 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/* Copyright (C) 2003 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
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

17
#include <ndb_global.h>
18
#include <ndb_opts.h>
19

20 21 22 23 24 25 26 27 28 29 30
// copied from mysql.cc to get readline
extern "C" {
#if defined( __WIN__) || defined(OS2)
#include <conio.h>
#elif !defined(__NETWARE__)
#include <readline/readline.h>
extern "C" int add_history(const char *command); /* From readline directory */
#define HAVE_READLINE
#endif
}

31 32 33
#include <NdbMain.h>
#include <NdbHost.h>
#include <mgmapi.h>
34
#include <ndb_version.h>
35 36
#include <LocalConfig.hpp>

37
#include "ndb_mgmclient.hpp"
38

39
const char *progname = "ndb_mgm";
40 41


42
static Ndb_mgmclient* com;
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

extern "C"
void 
handler(int sig){
  switch(sig){
  case SIGPIPE:
    /**
     * Will happen when connection to mgmsrv is broken
     * Reset connected flag
     */
    com->disconnect();    
    break;
  }
}

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

static unsigned _try_reconnect;
static char *opt_connect_str= 0;

static struct my_option my_long_options[] =
{
  NDB_STD_OPTS("ndb_mgm"),
  { "try-reconnect", 't',
    "Specify number of retries for connecting to ndb_mgmd, default infinite", 
    (gptr*) &_try_reconnect, (gptr*) &_try_reconnect, 0,
    GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
};
static void short_usage_sub(void)
{
  printf("Usage: %s [OPTIONS] [hostname [port]]\n", my_progname);
}
static void print_version()
{
  printf("MySQL distrib %s, for %s (%s)\n",MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
}
static void usage()
{
  short_usage_sub();
  print_version();
  my_print_help(my_long_options);
  my_print_variables(my_long_options);
}
static my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
	       char *argument)
{
  switch (optid) {
  case '#':
    DBUG_PUSH(argument ? argument : "d:t:O,/tmp/ndb_mgm.trace");
    break;
  case 'V':
    print_version();
    exit(0);
  case '?':
    usage();
    exit(0);
  }
  return 0;
}

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
static int 
read_and_execute(int _try_reconnect) 
{
  static char *line_read = (char *)NULL;

  /* If the buffer has already been allocated, return the memory
     to the free pool. */
  if (line_read)
  {
    free (line_read);
    line_read = (char *)NULL;
  }
#ifdef HAVE_READLINE
  /* Get a line from the user. */
  line_read = readline ("ndb_mgm> ");    
  /* If the line has any text in it, save it on the history. */
  if (line_read && *line_read)
    add_history (line_read);
#else
  static char linebuffer[254];
  fputs("ndb_mgm> ", stdout);
  linebuffer[sizeof(linebuffer)-1]=0;
  line_read = fgets(linebuffer, sizeof(linebuffer)-1, stdin);
  if (line_read == linebuffer) {
    char *q=linebuffer;
    while (*q > 31) q++;
    *q=0;
    line_read= strdup(linebuffer);
  }
#endif
  return com->execute(line_read,_try_reconnect);
}

137 138
int main(int argc, char** argv){
  NDB_INIT(argv[0]);
139 140
  const char *_host = 0;
  int _port = 0;
141
  const char *load_default_groups[]= { "mysql_cluster","ndb_mgm",0 };
142

143 144 145 146
  load_defaults("my",load_default_groups,&argc,&argv);
  int ho_error;
  if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
    exit(ho_error);
147 148

  char buf[MAXHOSTNAMELEN+10];
149 150 151 152 153 154 155
  if(argc == 1) {
    BaseString::snprintf(buf, sizeof(buf), "%s",  argv[0]);
    opt_connect_str= buf;
  } else if (argc >= 2) {
    BaseString::snprintf(buf, sizeof(buf), "%s:%s",  argv[0], argv[1]);
    opt_connect_str= buf;
  }
156 157

  ndbout << "-- NDB Cluster -- Management Client --" << endl;
158
  printf("Connecting to Management Server: %s\n", opt_connect_str ? opt_connect_str : "default");
159 160 161

  signal(SIGPIPE, handler);

162
  com = new Ndb_mgmclient(opt_connect_str);
163
  while(read_and_execute(_try_reconnect));
164 165 166 167 168
  delete com;
  
  return 0;
}