1
/* Copyright (C) 2000-2006 MySQL AB
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.
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.
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 */
16
/* maintaince of mysql databases */
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 MySQL
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.
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.
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
21
/* maintaince of drizzle databases */
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>
28
/* Added this for string translation. */
29
#include <libdrizzle/gettext.h>
23
31
#define ADMIN_VERSION "8.42"
24
32
#define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */
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;
64
71
static struct my_option my_long_options[] =
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},
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
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},
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,
179
183
if (tty_password)
180
opt_password = get_tty_password(NullS);
184
opt_password = get_tty_password(NULL);
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 */
185
189
if (opt_connect_timeout)
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);
190
/* force mysqladmin to use TCP */
191
mysql_options(&mysql, MYSQL_OPT_PROTOCOL, (char*)&opt_protocol);
193
195
error_flags= (myf)0;
195
if (sql_connect(&mysql, option_wait))
197
if (sql_connect(&drizzle, option_wait))
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)
215
error=execute_commands(&mysql,argc,commands);
217
error=execute_commands(&drizzle,argc,commands);
218
drizzle_close(&drizzle);
218
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
219
my_free(user,MYF(MY_ALLOW_ZERO_PTR));
220
222
free_defaults(save_argv);
221
223
my_end(my_end_arg);
222
224
exit(error ? 1 : 0);
225
sig_handler endprog(int signal_number __attribute__((unused)))
227
RETSIGTYPE endprog(int signal_number __attribute__((unused)))
230
static bool sql_connect(MYSQL *mysql, uint wait)
232
static bool sql_connect(DRIZZLE *drizzle, uint wait)
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))
240
drizzle->reconnect= 1;
241
243
fputs("\n",stderr);
252
254
host= (char*) LOCAL_HOST;
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));
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)
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());
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))
274
fprintf(stderr,"Got error: %s\n", mysql_error(mysql));
276
fprintf(stderr,_("Got error: %s\n"), drizzle_error(drizzle));
276
278
else if (!option_silent)
281
fputs("Waiting for Drizzle server to answer",stderr);
283
fputs(_("Waiting for Drizzle server to answer"),stderr);
282
284
(void) fflush(stderr);
311
313
case ADMIN_SHUTDOWN:
314
printf("shutting down drizzled...\n");
316
printf(_("shutting down drizzled...\n"));
316
if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
318
if (drizzle_shutdown(drizzle))
318
my_printf_error(0, "shutdown failed; error: '%s'", error_flags,
320
my_printf_error(0, _("shutdown failed; error: '%s'"), error_flags,
321
drizzle_error(drizzle));
322
mysql_close(mysql); /* Close connection to avoid error messages */
324
drizzle_close(drizzle); /* Close connection to avoid error messages */
327
329
argc=1; /* Force SHUTDOWN to be the last command */
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))
334
336
if (option_silent < 2)
335
puts("drizzled is alive");
337
puts(_("drizzled is alive"));
339
if (mysql_errno(mysql) == CR_SERVER_GONE_ERROR)
341
if (drizzle_errno(drizzle) == CR_SERVER_GONE_ERROR)
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"));
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));
352
mysql->reconnect=1; /* Automatic reconnect is default */
354
drizzle->reconnect=1; /* Automatic reconnect is 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]);
363
#include <help_start.h>
365
365
static void print_version(void)
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);
371
371
static void usage(void)
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);
380
380
ping Check if server is down\n\
381
shutdown Take server down\n");
381
shutdown Take server down\n"));
384
#include <help_end.h>