~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to client/drizzleadmin.cc

  • Committer: Monty Taylor
  • Date: 2008-10-16 06:32:30 UTC
  • mto: (511.1.5 codestyle)
  • mto: This revision was merged to the branch mainline in revision 521.
  • Revision ID: monty@inaugust.com-20081016063230-4brxsra0qsmsg84q
Added -Wunused-macros.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (C) 2000-2006 MySQL AB
2
 
 
3
 
   This program is free software; you can redistribute it and/or modify
4
 
   it under the terms of the GNU General Public License as published by
5
 
   the Free Software Foundation; version 2 of the License.
6
 
 
7
 
   This program is distributed in the hope that it will be useful,
8
 
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
 
   GNU General Public License for more details.
11
 
 
12
 
   You should have received a copy of the GNU General Public License
13
 
   along with this program; if not, write to the Free Software
14
 
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
 
 
16
 
/* maintaince of mysql databases */
 
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 
3
 *
 
4
 *  Copyright (C) 2008 MySQL
 
5
 *
 
6
 *  This program is free software; you can redistribute it and/or modify
 
7
 *  it under the terms of the GNU General Public License as published by
 
8
 *  the Free Software Foundation; either version 2 of the License, or
 
9
 *  (at your option) any later version.
 
10
 *
 
11
 *  This program is distributed in the hope that it will be useful,
 
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 *  GNU General Public License for more details.
 
15
 *
 
16
 *  You should have received a copy of the GNU General Public License
 
17
 *  along with this program; if not, write to the Free Software
 
18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
19
 */
 
20
 
 
21
/* maintaince of drizzle databases */
17
22
 
18
23
#include "client_priv.h"
19
24
#include <signal.h>
20
 
#include <my_pthread.h>                         /* because of signal()  */
 
25
#include <mysys/my_pthread.h>                           /* because of signal()  */
21
26
#include <sys/stat.h>
22
27
 
 
28
/* Added this for string translation. */
 
29
#include <libdrizzle/gettext.h>
 
30
 
23
31
#define ADMIN_VERSION "8.42"
24
32
#define SHUTDOWN_DEF_TIMEOUT 3600               /* Wait for shutdown */
25
33
 
26
34
char *host= NULL, *user= NULL, *opt_password= NULL;
27
35
static bool interrupted= false, opt_verbose= false,tty_password= false; 
28
 
static uint8_t opt_protocol= MYSQL_PROTOCOL_TCP;  
29
36
static uint32_t tcp_port= 0, option_wait= 0, option_silent= 0;
30
37
static uint32_t my_end_arg;
31
38
static uint32_t opt_connect_timeout, opt_shutdown_timeout;
36
43
*/
37
44
static void usage(void);
38
45
static void print_version(void);
39
 
extern "C" sig_handler endprog(int signal_number);
 
46
extern "C" RETSIGTYPE endprog(int signal_number);
40
47
extern "C" bool get_one_option(int optid, const struct my_option *opt,
41
48
                               char *argument);
42
 
static int execute_commands(MYSQL *mysql,int argc, char **argv);
43
 
static bool sql_connect(MYSQL *mysql, uint wait);
 
49
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv);
 
50
static bool sql_connect(DRIZZLE *drizzle, uint wait);
44
51
 
45
52
/*
46
53
  The order of commands must be the same as command_names,
55
62
static const char *command_names[]= {
56
63
  "shutdown",
57
64
  "ping",
58
 
  NullS
 
65
  NULL
59
66
};
60
67
 
61
68
static TYPELIB command_typelib=
63
70
 
64
71
static struct my_option my_long_options[] =
65
72
{
66
 
  {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG,
 
73
  {"help", '?', N_("Display this help and exit."), 0, 0, 0, GET_NO_ARG,
67
74
   NO_ARG, 0, 0, 0, 0, 0, 0},
68
 
  {"host", 'h', "Connect to host.", (char**) &host, (char**) &host, 0, GET_STR,
 
75
  {"host", 'h', N_("Connect to host."), (char**) &host, (char**) &host, 0, GET_STR,
69
76
   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
70
77
  {"password", 'p',
71
 
   "Password to use when connecting to server. If password is not given it's asked from the tty.",
 
78
   N_("Password to use when connecting to server. If password is not given it's asked from the tty."),
72
79
   0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
73
 
  {"port", 'P', "Port number to use for connection or 0 for default to, in "
74
 
   "order of preference, my.cnf, $MYSQL_TCP_PORT, "
75
 
#if MYSQL_PORT_DEFAULT == 0
76
 
   "/etc/services, "
77
 
#endif
78
 
   "built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
 
80
  {"port", 'P', N_("Port number to use for connection or 0 for default to, in "
 
81
   "order of preference, my.cnf, $DRIZZLE_TCP_PORT, "
 
82
   "built-in default (" STRINGIFY_ARG(DRIZZLE_PORT) ")."),
79
83
   (char**) &tcp_port,
80
84
   (char**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
81
 
  {"silent", 's', "Silently exit if one can't connect to server.",
 
85
  {"silent", 's', N_("Silently exit if one can't connect to server."),
82
86
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
83
87
#ifndef DONT_ALLOW_USER_CHANGE
84
 
  {"user", 'u', "User for login if not current user.", (char**) &user,
 
88
  {"user", 'u', N_("User for login if not current user."), (char**) &user,
85
89
   (char**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
86
90
#endif
87
 
  {"verbose", 'v', "Write more information.", (char**) &opt_verbose,
 
91
  {"verbose", 'v', N_("Write more information."), (char**) &opt_verbose,
88
92
   (char**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
89
 
  {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
 
93
  {"version", 'V', N_("Output version information and exit."), 0, 0, 0, GET_NO_ARG,
90
94
   NO_ARG, 0, 0, 0, 0, 0, 0},
91
 
  {"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT,
 
95
  {"wait", 'w', N_("Wait and retry if connection is down."), 0, 0, 0, GET_UINT,
92
96
   OPT_ARG, 0, 0, 0, 0, 0, 0},
93
97
  {"connect_timeout", OPT_CONNECT_TIMEOUT, "", (char**) &opt_connect_timeout,
94
98
   (char**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0,
100
104
};
101
105
 
102
106
 
103
 
static const char *load_default_groups[]= { "mysqladmin","client",0 };
 
107
static const char *load_default_groups[]= { "drizzleadmin","client",0 };
104
108
 
105
109
bool
106
110
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
113
117
    if (argument)
114
118
    {
115
119
      char *start=argument;
116
 
      my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
 
120
      free(opt_password);
117
121
      opt_password= my_strdup(argument,MYF(MY_FAE));
118
122
      while (*argument) *argument++= 'x';   /* Destroy argument */
119
123
      if (*start)
156
160
int main(int argc,char *argv[])
157
161
{
158
162
  int error= 0, ho_error;
159
 
  MYSQL mysql;
 
163
  DRIZZLE drizzle;
160
164
  char **commands, **save_argv;
161
165
 
162
166
  MY_INIT(argv[0]);
163
 
  mysql_init(&mysql);
 
167
  drizzle_create(&drizzle);
164
168
  load_defaults("my",load_default_groups,&argc,&argv);
165
169
  save_argv = argv;                             /* Save for free_defaults */
166
170
  if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
177
181
 
178
182
  commands = argv;
179
183
  if (tty_password)
180
 
    opt_password = get_tty_password(NullS);
 
184
    opt_password = get_tty_password(NULL);
181
185
 
182
 
  VOID(signal(SIGINT,endprog));                 /* Here if abort */
183
 
  VOID(signal(SIGTERM,endprog));                /* Here if abort */
 
186
  signal(SIGINT,endprog);                       /* Here if abort */
 
187
  signal(SIGTERM,endprog);              /* Here if abort */
184
188
 
185
189
  if (opt_connect_timeout)
186
190
  {
187
191
    uint tmp=opt_connect_timeout;
188
 
    mysql_options(&mysql,MYSQL_OPT_CONNECT_TIMEOUT, (char*) &tmp);
 
192
    drizzle_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT, (char*) &tmp);
189
193
  }
190
 
  /* force mysqladmin to use TCP */
191
 
  mysql_options(&mysql, MYSQL_OPT_PROTOCOL, (char*)&opt_protocol);
192
194
 
193
195
  error_flags= (myf)0;
194
196
 
195
 
  if (sql_connect(&mysql, option_wait))
 
197
  if (sql_connect(&drizzle, option_wait))
196
198
  {
197
 
    unsigned int err= mysql_errno(&mysql);
 
199
    unsigned int err= drizzle_errno(&drizzle);
198
200
    if (err >= CR_MIN_ERROR && err <= CR_MAX_ERROR)
199
201
      error= 1;
200
202
    else
212
214
  }
213
215
  else
214
216
  {
215
 
    error=execute_commands(&mysql,argc,commands);
216
 
    mysql_close(&mysql);
 
217
    error=execute_commands(&drizzle,argc,commands);
 
218
    drizzle_close(&drizzle);
217
219
  }
218
 
  my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
219
 
  my_free(user,MYF(MY_ALLOW_ZERO_PTR));
 
220
  free(opt_password);
 
221
  free(user);
220
222
  free_defaults(save_argv);
221
223
  my_end(my_end_arg);
222
224
  exit(error ? 1 : 0);
223
225
}
224
226
 
225
 
sig_handler endprog(int signal_number __attribute__((unused)))
 
227
RETSIGTYPE endprog(int signal_number __attribute__((unused)))
226
228
{
227
229
  interrupted=1;
228
230
}
229
231
 
230
 
static bool sql_connect(MYSQL *mysql, uint wait)
 
232
static bool sql_connect(DRIZZLE *drizzle, uint wait)
231
233
{
232
234
  bool info=0;
233
235
 
234
236
  for (;;)
235
237
  {
236
 
    if (mysql_real_connect(mysql,host,user,opt_password,NullS,tcp_port,NULL,0))
 
238
    if (drizzle_connect(drizzle,host,user,opt_password,NULL,tcp_port,NULL,0))
237
239
    {
238
 
      mysql->reconnect= 1;
 
240
      drizzle->reconnect= 1;
239
241
      if (info)
240
242
      {
241
243
        fputs("\n",stderr);
251
253
        if (!host)
252
254
          host= (char*) LOCAL_HOST;
253
255
 
254
 
        my_printf_error(0,"connect to server at '%s' failed\nerror: '%s'",
255
 
        error_flags, host, mysql_error(mysql));
 
256
        my_printf_error(0,_("connect to server at '%s' failed\nerror: '%s'"),
 
257
        error_flags, host, drizzle_error(drizzle));
256
258
 
257
 
        if (mysql_errno(mysql) == CR_CONN_HOST_ERROR ||
258
 
          mysql_errno(mysql) == CR_UNKNOWN_HOST)
 
259
        if (drizzle_errno(drizzle) == CR_CONN_HOST_ERROR ||
 
260
          drizzle_errno(drizzle) == CR_UNKNOWN_HOST)
259
261
        {
260
 
          fprintf(stderr,"Check that drizzled is running on %s",host);
261
 
          fprintf(stderr," and that the port is %d.\n",
262
 
          tcp_port ? tcp_port: mysql_port);
263
 
          fprintf(stderr,"You can check this by doing 'telnet %s %d'\n",
264
 
                  host, tcp_port ? tcp_port: mysql_port);
 
262
          fprintf(stderr,_("Check that drizzled is running on %s"),host);
 
263
          fprintf(stderr,_(" and that the port is %d.\n"),
 
264
          tcp_port ? tcp_port: drizzle_get_default_port());
 
265
          fprintf(stderr,_("You can check this by doing 'telnet %s %d'\n"),
 
266
                  host, tcp_port ? tcp_port: drizzle_get_default_port());
265
267
        }
266
268
      }
267
269
      return 1;
268
270
    }
269
 
    if (wait != (uint) ~0)
 
271
    if (wait != UINT32_MAX)
270
272
      wait--;                           /* One less retry */
271
 
    if ((mysql_errno(mysql) != CR_CONN_HOST_ERROR) &&
272
 
        (mysql_errno(mysql) != CR_CONNECTION_ERROR))
 
273
    if ((drizzle_errno(drizzle) != CR_CONN_HOST_ERROR) &&
 
274
        (drizzle_errno(drizzle) != CR_CONNECTION_ERROR))
273
275
    {
274
 
      fprintf(stderr,"Got error: %s\n", mysql_error(mysql));
 
276
      fprintf(stderr,_("Got error: %s\n"), drizzle_error(drizzle));
275
277
    }
276
278
    else if (!option_silent)
277
279
    {
278
280
      if (!info)
279
281
      {
280
282
        info=1;
281
 
        fputs("Waiting for Drizzle server to answer",stderr);
 
283
        fputs(_("Waiting for Drizzle server to answer"),stderr);
282
284
        (void) fflush(stderr);
283
285
      }
284
286
      else
297
299
         -1 on retryable error
298
300
         1 on fatal error
299
301
*/
300
 
static int execute_commands(MYSQL *mysql,int argc, char **argv)
 
302
static int execute_commands(DRIZZLE *drizzle,int argc, char **argv)
301
303
{
302
304
 
303
305
  /*
304
 
    MySQL documentation relies on the fact that mysqladmin will
 
306
    DRIZZLE documentation relies on the fact that drizzleadmin will
305
307
    execute commands in the order specified.
306
308
    If this behaviour is ever changed, Docs should be notified.
307
309
  */
311
313
    case ADMIN_SHUTDOWN:
312
314
    {
313
315
      if (opt_verbose)
314
 
        printf("shutting down drizzled...\n");
 
316
        printf(_("shutting down drizzled...\n"));
315
317
 
316
 
      if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
 
318
      if (drizzle_shutdown(drizzle))
317
319
      {
318
 
        my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
319
 
                        mysql_error(mysql));
 
320
        my_printf_error(0, _("shutdown failed; error: '%s'"), error_flags,
 
321
                        drizzle_error(drizzle));
320
322
        return -1;
321
323
      }
322
 
      mysql_close(mysql);       /* Close connection to avoid error messages */
 
324
      drizzle_close(drizzle);   /* Close connection to avoid error messages */
323
325
 
324
326
      if (opt_verbose)
325
 
        printf("done\n");
 
327
        printf(_("done\n"));
326
328
 
327
329
      argc=1;             /* Force SHUTDOWN to be the last command */
328
330
      break;
329
331
    }
330
332
    case ADMIN_PING:
331
 
      mysql->reconnect=0;       /* We want to know of reconnects */
332
 
      if (!mysql_ping(mysql))
 
333
      drizzle->reconnect=0;     /* We want to know of reconnects */
 
334
      if (!drizzle_ping(drizzle))
333
335
      {
334
336
        if (option_silent < 2)
335
 
          puts("drizzled is alive");
 
337
          puts(_("drizzled is alive"));
336
338
      }
337
339
      else
338
340
      {
339
 
        if (mysql_errno(mysql) == CR_SERVER_GONE_ERROR)
 
341
        if (drizzle_errno(drizzle) == CR_SERVER_GONE_ERROR)
340
342
        {
341
 
          mysql->reconnect=1;
342
 
          if (!mysql_ping(mysql))
343
 
            puts("connection was down, but drizzled is now alive");
 
343
          drizzle->reconnect=1;
 
344
          if (!drizzle_ping(drizzle))
 
345
            puts(_("connection was down, but drizzled is now alive"));
344
346
        }
345
347
        else
346
348
              {
347
 
          my_printf_error(0,"drizzled doesn't answer to ping, error: '%s'",
348
 
          error_flags, mysql_error(mysql));
 
349
          my_printf_error(0,_("drizzled doesn't answer to ping, error: '%s'"),
 
350
          error_flags, drizzle_error(drizzle));
349
351
          return -1;
350
352
        }
351
353
      }
352
 
      mysql->reconnect=1;       /* Automatic reconnect is default */
 
354
      drizzle->reconnect=1;     /* Automatic reconnect is default */
353
355
      break;
354
356
 
355
357
    default:
356
 
      my_printf_error(0, "Unknown command: '%-.60s'", error_flags, argv[0]);
 
358
      my_printf_error(0, _("Unknown command: '%-.60s'"), error_flags, argv[0]);
357
359
      return 1;
358
360
    }
359
361
  }
360
362
  return 0;
361
363
}
362
364
 
363
 
#include <help_start.h>
364
 
 
365
365
static void print_version(void)
366
366
{
367
 
  printf("%s  Ver %s Distrib %s, for %s on %s\n",my_progname,ADMIN_VERSION,
368
 
         MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
 
367
  printf(_("%s  Ver %s Distrib %s, for %s on %s\n"),my_progname,ADMIN_VERSION,
 
368
         drizzle_get_client_info(),SYSTEM_TYPE,MACHINE_TYPE);
369
369
}
370
370
 
371
371
static void usage(void)
372
372
{
373
373
  print_version();
374
 
  puts("Copyright (C) 2000-2006 MySQL AB");
375
 
  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
376
 
  puts("Administration program for the drizzled daemon.");
377
 
  printf("Usage: %s [OPTIONS] command command....\n", my_progname);
 
374
  puts(_("Copyright (C) 2000-2008 MySQL AB"));
 
375
  puts(_("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n"));
 
376
  puts(_("Administration program for the drizzled daemon."));
 
377
  printf(_("Usage: %s [OPTIONS] command command....\n"), my_progname);
378
378
  my_print_help(my_long_options);
379
 
  puts("\
 
379
  puts(_("\
380
380
  ping         Check if server is down\n\
381
 
  shutdown     Take server down\n");
 
381
  shutdown     Take server down\n"));
382
382
}
383
 
 
384
 
#include <help_end.h>
385