1
/* Copyright (C) 2008 Drizzle development team
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
/* By Jani Tolonen, 2001-04-20, MySQL, MYSQL Development Team */
18
#define CHECK_VERSION "2.5.0"
23
#include "client_priv.h"
24
#include <mystrings/m_ctype.h>
26
template class std::vector<std::string>;
34
static DRIZZLE drizzle_connection, *sock = 0;
35
static bool opt_alldbs = 0, opt_check_only_changed = 0, opt_extended = 0,
36
opt_compress = 0, opt_databases = 0, opt_fast = 0,
37
opt_medium_check = 0, opt_quick = 0, opt_all_in_1 = 0,
38
opt_silent = 0, opt_auto_repair = 0, ignore_errors = 0,
39
tty_password= 0, opt_frm= 0, debug_info_flag= 0, debug_check_flag= 0,
40
opt_fix_table_names= 0, opt_fix_db_names= 0, opt_upgrade= 0,
42
static uint verbose = 0, opt_mysql_port=0;
43
static int my_end_arg;
44
static char * opt_mysql_unix_port = 0;
45
static char *opt_password = 0, *current_user = 0,
46
*default_charset = (char *)DRIZZLE_DEFAULT_CHARSET_NAME,
48
static int first_error = 0;
49
vector<string> tables4repair;
50
static uint opt_protocol=0;
51
static const CHARSET_INFO *charset_info= &my_charset_utf8_general_ci;
53
enum operations { DO_CHECK, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE };
55
static struct my_option my_long_options[] =
57
{"all-databases", 'A',
58
"Check all the databases. This will be same as --databases with all databases selected.",
59
(char**) &opt_alldbs, (char**) &opt_alldbs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
61
{"analyze", 'a', "Analyze given tables.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
64
"Instead of issuing one query for each table, use one query per database, naming all tables in the database in a comma-separated list.",
65
(char**) &opt_all_in_1, (char**) &opt_all_in_1, 0, GET_BOOL, NO_ARG, 0, 0, 0,
67
{"auto-repair", OPT_AUTO_REPAIR,
68
"If a checked table is corrupted, automatically fix it. Repairing will be done after all tables have been checked, if corrupted ones were found.",
69
(char**) &opt_auto_repair, (char**) &opt_auto_repair, 0, GET_BOOL, NO_ARG, 0,
71
{"character-sets-dir", OPT_CHARSETS_DIR,
72
"Directory where character sets are.", (char**) &charsets_dir,
73
(char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
74
{"check", 'c', "Check table for errors.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
76
{"check-only-changed", 'C',
77
"Check only tables that have changed since last check or haven't been closed properly.",
78
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
79
{"check-upgrade", 'g',
80
"Check tables for version-dependent changes. May be used with --auto-repair to correct tables requiring version-dependent updates.",
81
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
82
{"compress", OPT_COMPRESS, "Use compression in server/client protocol.",
83
(char**) &opt_compress, (char**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
86
"To check several databases. Note the difference in usage; In this case no tables are given. All name arguments are regarded as databasenames.",
87
(char**) &opt_databases, (char**) &opt_databases, 0, GET_BOOL, NO_ARG,
89
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
90
(char**) &debug_check_flag, (char**) &debug_check_flag, 0,
91
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
92
{"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.",
93
(char**) &debug_info_flag, (char**) &debug_info_flag,
94
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
95
{"default-character-set", OPT_DEFAULT_CHARSET,
96
"Set the default character set.", (char**) &default_charset,
97
(char**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
98
{"fast",'F', "Check only tables that haven't been closed properly.",
99
(char**) &opt_fast, (char**) &opt_fast, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
101
{"fix-db-names", OPT_FIX_DB_NAMES, "Fix database names.",
102
(char**) &opt_fix_db_names, (char**) &opt_fix_db_names,
103
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
104
{"fix-table-names", OPT_FIX_TABLE_NAMES, "Fix table names.",
105
(char**) &opt_fix_table_names, (char**) &opt_fix_table_names,
106
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
107
{"force", 'f', "Continue even if we get an sql-error.",
108
(char**) &ignore_errors, (char**) &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0,
111
"If you are using this option with CHECK TABLE, it will ensure that the table is 100 percent consistent, but will take a long time. If you are using this option with REPAIR TABLE, it will force using old slow repair with keycache method, instead of much faster repair by sorting.",
112
(char**) &opt_extended, (char**) &opt_extended, 0, GET_BOOL, NO_ARG, 0, 0, 0,
114
{"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG,
115
NO_ARG, 0, 0, 0, 0, 0, 0},
116
{"host",'h', "Connect to host.", (char**) ¤t_host,
117
(char**) ¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
118
{"medium-check", 'm',
119
"Faster than extended-check, but only finds 99.99 percent of all errors. Should be good enough for most cases.",
120
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
121
{"write-binlog", OPT_WRITE_BINLOG,
122
"Log ANALYZE, OPTIMIZE and REPAIR TABLE commands. Use --skip-write-binlog when commands should not be sent to replication slaves.",
123
(char**) &opt_write_binlog, (char**) &opt_write_binlog, 0, GET_BOOL, NO_ARG,
125
{"optimize", 'o', "Optimize table.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0,
128
"Password to use when connecting to server. If password is not given it's solicited on the tty.",
129
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
130
{"port", 'P', "Port number to use for connection or 0 for default to, in "
131
"order of preference, my.cnf, $DRIZZLE_TCP_PORT, "
132
"built-in default (" STRINGIFY_ARG(DRIZZLE_PORT) ").",
133
(char**) &opt_mysql_port,
134
(char**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0,
136
{"protocol", OPT_DRIZZLE_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
137
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
139
"If you are using this option with CHECK TABLE, it prevents the check from scanning the rows to check for wrong links. This is the fastest check. If you are using this option with REPAIR TABLE, it will try to repair only the index tree. This is the fastest repair method for a table.",
140
(char**) &opt_quick, (char**) &opt_quick, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
143
"Can fix almost anything except unique keys that aren't unique.",
144
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
145
{"silent", 's', "Print only error messages.", (char**) &opt_silent,
146
(char**) &opt_silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
147
{"socket", 'S', "Socket file to use for connection.",
148
(char**) &opt_mysql_unix_port, (char**) &opt_mysql_unix_port, 0, GET_STR,
149
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
150
{"tables", OPT_TABLES, "Overrides option --databases (-B).", 0, 0, 0,
151
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
153
"When used with REPAIR, get table structure from .frm file, so the table can be repaired even if .MYI header is corrupted.",
154
(char**) &opt_frm, (char**) &opt_frm, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
156
#ifndef DONT_ALLOW_USER_CHANGE
157
{"user", 'u', "User for login if not current user.", (char**) ¤t_user,
158
(char**) ¤t_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
160
{"verbose", 'v', "Print info about the various stages.", 0, 0, 0, GET_NO_ARG,
161
NO_ARG, 0, 0, 0, 0, 0, 0},
162
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
163
NO_ARG, 0, 0, 0, 0, 0, 0},
164
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
167
static const char *load_default_groups[] = { "mysqlcheck", "client", 0 };
170
static void print_version(void);
171
static void usage(void);
172
static int get_options(int *argc, char ***argv);
173
static int process_all_databases(void);
174
static int process_databases(char **db_names);
175
static int process_selected_tables(char *db, char **table_names, int tables);
176
static int process_all_tables_in_db(char *database);
177
static int process_one_db(char *database);
178
static int use_db(char *database);
179
static int handle_request_for_tables(const char *tables, uint length);
180
static int dbConnect(char *host, char *user,char *passwd);
181
static void dbDisconnect(char *host);
182
static void DBerror(DRIZZLE *drizzle, const char *when);
183
static void safe_exit(int error);
184
static void print_result(void);
185
static uint fixed_name_length(const char *name);
186
static char *fix_table_name(char *dest, const char *src);
189
static void print_version(void)
191
printf("%s Ver %s Distrib %s, for %s (%s)\n", my_progname, CHECK_VERSION,
192
drizzle_get_client_info(), SYSTEM_TYPE, MACHINE_TYPE);
193
} /* print_version */
195
static void usage(void)
198
puts("By Jani Tolonen, 2001-04-20, MySQL Development Team\n");
199
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n");
200
puts("and you are welcome to modify and redistribute it under the GPL license.\n");
201
puts("This program can be used to CHECK (-c,-m,-C), REPAIR (-r), ANALYZE (-a)");
202
puts("or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be");
203
puts("used at the same time. Not all options are supported by all storage engines.");
204
puts("Please consult the Drizzle manual for latest information about the");
205
puts("above. The options -c,-r,-a and -o are exclusive to each other, which");
206
puts("means that the last option will be used, if several was specified.\n");
207
puts("The option -c will be used by default, if none was specified. You");
208
puts("can change the default behavior by making a symbolic link, or");
209
puts("copying this file somewhere with another name, the alternatives are:");
210
puts("mysqlrepair: The default option will be -r");
211
puts("mysqlanalyze: The default option will be -a");
212
puts("mysqloptimize: The default option will be -o\n");
213
printf("Usage: %s [OPTIONS] database [tables]\n", my_progname);
214
printf("OR %s [OPTIONS] --databases DB1 [DB2 DB3...]\n",
216
printf("OR %s [OPTIONS] --all-databases\n", my_progname);
217
print_defaults("my", load_default_groups);
218
my_print_help(my_long_options);
219
my_print_variables(my_long_options);
223
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
228
what_to_do = DO_ANALYZE;
231
what_to_do = DO_CHECK;
234
what_to_do = DO_CHECK;
235
opt_check_only_changed = 1;
237
case 'I': /* Fall through */
242
what_to_do = DO_CHECK;
243
opt_medium_check = 1;
246
what_to_do = DO_OPTIMIZE;
248
case OPT_FIX_DB_NAMES:
249
what_to_do= DO_UPGRADE;
250
default_charset= (char*) "utf8";
253
case OPT_FIX_TABLE_NAMES:
254
what_to_do= DO_UPGRADE;
255
default_charset= (char*) "utf8";
260
char *start = argument;
262
opt_password = my_strdup(argument, MYF(MY_FAE));
263
while (*argument) *argument++= 'x'; /* Destroy argument */
265
start[1] = 0; /* Cut length of argument */
272
what_to_do = DO_REPAIR;
275
what_to_do= DO_CHECK;
284
case 'V': print_version(); exit(0);
285
case OPT_DRIZZLE_PROTOCOL:
292
static int get_options(int *argc, char ***argv)
302
load_defaults("my", load_default_groups, argc, argv);
304
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
309
int pnlen = strlen(my_progname);
311
if (pnlen < 6) /* name too short */
312
what_to_do = DO_CHECK;
313
else if (!strcmp("repair", my_progname + pnlen - 6))
314
what_to_do = DO_REPAIR;
315
else if (!strcmp("analyze", my_progname + pnlen - 7))
316
what_to_do = DO_ANALYZE;
317
else if (!strcmp("optimize", my_progname + pnlen - 8))
318
what_to_do = DO_OPTIMIZE;
320
what_to_do = DO_CHECK;
323
/* TODO: This variable is not yet used */
324
if (strcmp(default_charset, charset_info->csname) &&
325
!(charset_info= get_charset_by_csname(default_charset,
326
MY_CS_PRIMARY, MYF(MY_WME))))
328
if (*argc > 0 && opt_alldbs)
330
printf("You should give only options, no arguments at all, with option\n");
331
printf("--all-databases. Please see %s --help for more information.\n",
335
if (*argc < 1 && !opt_alldbs)
337
printf("You forgot to give the arguments! Please see %s --help\n",
339
printf("for more information.\n");
343
opt_password = get_tty_password(NULL);
345
my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
346
if (debug_check_flag)
347
my_end_arg= MY_CHECK_ERROR;
352
static int process_all_databases()
355
DRIZZLE_RES *tableres;
358
if (drizzle_query(sock, "SHOW DATABASES") ||
359
!(tableres = drizzle_store_result(sock)))
361
my_printf_error(0, "Error: Couldn't execute 'SHOW DATABASES': %s",
362
MYF(0), drizzle_error(sock));
365
while ((row = drizzle_fetch_row(tableres)))
367
if (process_one_db(row[0]))
372
/* process_all_databases */
375
static int process_databases(char **db_names)
378
for ( ; *db_names ; db_names++)
380
if (process_one_db(*db_names))
384
} /* process_databases */
387
static int process_selected_tables(char *db, char **table_names, int tables)
394
We need table list in form `a`, `b`, `c`
395
that's why we need 2 more chars added to to each table name
396
space is for more readable output in logs and in case of error
398
char *table_names_comma_sep, *end;
399
int i, tot_length = 0;
401
for (i = 0; i < tables; i++)
402
tot_length+= fixed_name_length(*(table_names + i)) + 2;
404
if (!(table_names_comma_sep = (char *)
405
my_malloc((sizeof(char) * tot_length) + 4, MYF(MY_WME))))
408
for (end = table_names_comma_sep + 1; tables > 0;
409
tables--, table_names++)
411
end= fix_table_name(end, *table_names);
415
handle_request_for_tables(table_names_comma_sep + 1, tot_length - 1);
416
free(table_names_comma_sep);
419
for (; tables > 0; tables--, table_names++)
420
handle_request_for_tables(*table_names, fixed_name_length(*table_names));
422
} /* process_selected_tables */
425
static uint fixed_name_length(const char *name)
428
uint extra_length= 2; /* count the first/last backticks */
430
for (p= name; *p; p++)
437
return (p - name) + extra_length;
441
static char *fix_table_name(char *dest, const char *src)
447
case '.': /* add backticks around '.' */
452
case '`': /* escape backtick character */
464
static int process_all_tables_in_db(char *database)
470
if (use_db(database))
472
if (drizzle_query(sock, "SHOW /*!50002 FULL*/ TABLES") ||
473
!((res= drizzle_store_result(sock))))
476
num_columns= drizzle_num_fields(res);
481
We need table list in form `a`, `b`, `c`
482
that's why we need 2 more chars added to to each table name
483
space is for more readable output in logs and in case of error
489
while ((row = drizzle_fetch_row(res)))
490
tot_length+= fixed_name_length(row[0]) + 2;
491
drizzle_data_seek(res, 0);
493
if (!(tables=(char *) my_malloc(sizeof(char)*tot_length+4, MYF(MY_WME))))
495
drizzle_free_result(res);
498
for (end = tables + 1; (row = drizzle_fetch_row(res)) ;)
500
if ((num_columns == 2) && (strcmp(row[1], "VIEW") == 0))
503
end= fix_table_name(end, row[0]);
508
handle_request_for_tables(tables + 1, tot_length - 1);
513
while ((row = drizzle_fetch_row(res)))
515
/* Skip views if we don't perform renaming. */
516
if ((what_to_do != DO_UPGRADE) && (num_columns == 2) && (strcmp(row[1], "VIEW") == 0))
519
handle_request_for_tables(row[0], fixed_name_length(row[0]));
522
drizzle_free_result(res);
524
} /* process_all_tables_in_db */
528
static int fix_table_storage_name(const char *name)
530
char qbuf[100 + NAME_LEN*4];
532
if (strncmp(name, "#mysql50#", 9))
534
sprintf(qbuf, "RENAME TABLE `%s` TO `%s`", name, name + 9);
535
if (drizzle_query(sock, qbuf))
537
fprintf(stderr, "Failed to %s\n", qbuf);
538
fprintf(stderr, "Error: %s\n", drizzle_error(sock));
542
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
546
static int fix_database_storage_name(const char *name)
548
char qbuf[100 + NAME_LEN*4];
550
if (strncmp(name, "#mysql50#", 9))
552
sprintf(qbuf, "ALTER DATABASE `%s` UPGRADE DATA DIRECTORY NAME", name);
553
if (drizzle_query(sock, qbuf))
555
fprintf(stderr, "Failed to %s\n", qbuf);
556
fprintf(stderr, "Error: %s\n", drizzle_error(sock));
560
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
564
static int process_one_db(char *database)
566
if (what_to_do == DO_UPGRADE)
569
if (opt_fix_db_names && !strncmp(database,"#mysql50#", 9))
571
rc= fix_database_storage_name(database);
574
if (rc || !opt_fix_table_names)
577
return process_all_tables_in_db(database);
581
static int use_db(char *database)
583
if (drizzle_get_server_version(sock) >= 50003 &&
584
!my_strcasecmp(&my_charset_utf8_general_ci, database, "information_schema"))
586
if (drizzle_select_db(sock, database))
588
DBerror(sock, "when selecting the database");
595
static int handle_request_for_tables(const char *tables, uint length)
597
char *query, *end, options[100], message[100];
598
uint query_length= 0;
603
switch (what_to_do) {
606
if (opt_quick) end = my_stpcpy(end, " QUICK");
607
if (opt_fast) end = my_stpcpy(end, " FAST");
608
if (opt_medium_check) end = my_stpcpy(end, " MEDIUM"); /* Default */
609
if (opt_extended) end = my_stpcpy(end, " EXTENDED");
610
if (opt_check_only_changed) end = my_stpcpy(end, " CHANGED");
611
if (opt_upgrade) end = my_stpcpy(end, " FOR UPGRADE");
614
op= (opt_write_binlog) ? "REPAIR" : "REPAIR NO_WRITE_TO_BINLOG";
615
if (opt_quick) end = my_stpcpy(end, " QUICK");
616
if (opt_extended) end = my_stpcpy(end, " EXTENDED");
617
if (opt_frm) end = my_stpcpy(end, " USE_FRM");
620
op= (opt_write_binlog) ? "ANALYZE" : "ANALYZE NO_WRITE_TO_BINLOG";
623
op= (opt_write_binlog) ? "OPTIMIZE" : "OPTIMIZE NO_WRITE_TO_BINLOG";
626
return fix_table_storage_name(tables);
629
if (!(query =(char *) my_malloc((sizeof(char)*(length+110)), MYF(MY_WME))))
633
/* No backticks here as we added them before */
634
query_length= sprintf(query, "%s TABLE %s %s", op, tables, options);
640
ptr= my_stpcpy(my_stpcpy(query, op), " TABLE ");
641
ptr= fix_table_name(ptr, tables);
642
ptr= strxmov(ptr, " ", options, NULL);
643
query_length= (uint) (ptr - query);
645
if (drizzle_real_query(sock, query, query_length))
647
sprintf(message, "when executing '%s TABLE ... %s'", op, options);
648
DBerror(sock, message);
657
static void print_result()
661
char prev[NAME_LEN*2+2];
665
res = drizzle_use_result(sock);
668
for (i = 0; (row = drizzle_fetch_row(res)); i++)
670
int changed = strcmp(prev, row[0]);
671
bool status = !strcmp(row[2], "status");
676
if there was an error with the table, we have --auto-repair set,
677
and this isn't a repair op, then add the table to the tables4repair
680
if (found_error && opt_auto_repair && what_to_do != DO_REPAIR &&
682
tables4repair.push_back(string(prev));
687
if (status && changed)
688
printf("%-50s %s", row[0], row[3]);
689
else if (!status && changed)
691
printf("%s\n%-9s: %s", row[0], row[2], row[3]);
692
if (strcmp(row[2],"note"))
696
printf("%-9s: %s", row[2], row[3]);
697
my_stpcpy(prev, row[0]);
700
/* add the last table to be repaired to the list */
701
if (found_error && opt_auto_repair && what_to_do != DO_REPAIR)
702
tables4repair.push_back(string(prev));
703
drizzle_free_result(res);
707
static int dbConnect(char *host, char *user, char *passwd)
712
fprintf(stderr, "# Connecting to %s...\n", host ? host : "localhost");
714
drizzle_create(&drizzle_connection);
716
drizzle_options(&drizzle_connection, DRIZZLE_OPT_COMPRESS, NULL);
718
drizzle_options(&drizzle_connection,DRIZZLE_OPT_PROTOCOL,(char*)&opt_protocol);
719
if (!(sock = drizzle_connect(&drizzle_connection, host, user, passwd,
720
NULL, opt_mysql_port, opt_mysql_unix_port, 0)))
722
DBerror(&drizzle_connection, "when trying to connect");
725
drizzle_connection.reconnect= 1;
730
static void dbDisconnect(char *host)
733
fprintf(stderr, "# Disconnecting from %s...\n", host ? host : "localhost");
738
static void DBerror(DRIZZLE *drizzle, const char *when)
740
my_printf_error(0,"Got error: %d: %s %s", MYF(0),
741
drizzle_errno(drizzle), drizzle_error(drizzle), when);
742
safe_exit(EX_MYSQLERR);
747
static void safe_exit(int error)
759
int main(int argc, char **argv)
763
** Check out the args
765
if (get_options(&argc, &argv))
770
if (dbConnect(current_host, current_user, opt_password))
775
tables4repair.reserve(64);
776
if (tables4repair.capacity() == 0)
785
process_all_databases();
786
/* Only one database and selected table(s) */
787
else if (argc > 1 && !opt_databases)
788
process_selected_tables(*argv, (argv + 1), (argc - 1));
789
/* One or more databases, all tables */
791
process_databases(argv);
795
if (!opt_silent && (tables4repair.size() > 0))
796
puts("\nRepairing tables");
797
what_to_do = DO_REPAIR;
798
vector<string>::iterator i;
799
for ( i= tables4repair.begin() ; i < tables4repair.end() ; i++)
801
const char *name= (*i).c_str();
802
handle_request_for_tables(name, fixed_name_length(name));
806
dbDisconnect(current_host);
809
return(first_error!=0);