diff options
author | unknown <jani@hynda.(none)> | 2002-05-22 00:05:05 +0300 |
---|---|---|
committer | unknown <jani@hynda.(none)> | 2002-05-22 00:05:05 +0300 |
commit | bb07d5c0432ceb64b27ff682faa9863051695615 (patch) | |
tree | 9eb125f10c2d91711ede0b6149a87d36b5b93b84 | |
parent | 3181a6af1b782ccbd23cd12b8e39e8e282b482e7 (diff) | |
download | mariadb-git-bb07d5c0432ceb64b27ff682faa9863051695615.tar.gz |
Changed mysqlbinlog, mysqlmanager-pwgen, mysqlmanagerc, mysqltest,
thread_test and isamchk to use my_getopt.
Fixed a bug in my_getopt.
client/mysqlbinlog.cc:
Changed mysqlbinlog.cc to use my_getopt.
client/mysqlmanager-pwgen.c:
Changed mysqlmanager-pwgen to use my_getopt.
client/mysqlmanagerc.c:
Changed mysqlmanagerc to use my_getopt.
client/mysqltest.c:
Changed mysqltest to use my_getopt.
client/thread_test.c:
Changed thread_test to use my_getopt.
isam/isamchk.c:
Changed isamchk to use my_getopt.
mysys/my_getopt.c:
Fixed a bug in printing options when option didn't have a comment.
Added startup initializing and printing for 'GET_BOOL' type variables.
sql/mysql_priv.h:
Changed type.
sql/mysqld.cc:
Fixed a bug in --local-infile option.
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted
-rw-r--r-- | BitKeeper/etc/logging_ok | 1 | ||||
-rw-r--r-- | client/mysqlbinlog.cc | 200 | ||||
-rw-r--r-- | client/mysqlmanager-pwgen.c | 74 | ||||
-rw-r--r-- | client/mysqlmanagerc.c | 126 | ||||
-rw-r--r-- | client/mysqltest.c | 344 | ||||
-rw-r--r-- | client/thread_test.c | 168 | ||||
-rw-r--r-- | isam/isamchk.c | 378 | ||||
-rw-r--r-- | mysys/my_getopt.c | 14 | ||||
-rw-r--r-- | sql/mysql_priv.h | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 7 |
10 files changed, 621 insertions, 693 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 2a56cf6aa88..a25e9320284 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -61,3 +61,4 @@ tonu@x3.internalnet venu@work.mysql.com zak@balfor.local zak@linux.local +jani@hynda.(none) diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 2591897b8de..a213f328cb5 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -19,6 +19,7 @@ #include "client_priv.h" #include <time.h> #include "log_event.h" +#include <my_getopt.h> #define PROBE_HEADER_LEN (4+EVENT_LEN_OFFSET+4) @@ -38,26 +39,6 @@ static FILE *result_file; static const char* default_dbug_option = "d:t:o,/tmp/mysqlbinlog.trace"; #endif -static struct option long_options[] = -{ -#ifndef DBUG_OFF - {"debug", optional_argument, 0, '#'}, -#endif - {"database", required_argument, 0, 'd'}, - {"help", no_argument, 0, '?'}, - {"host", required_argument, 0, 'h'}, - {"offset", required_argument, 0, 'o'}, - {"password", required_argument, 0, 'p'}, - {"port", required_argument, 0, 'P'}, - {"position", required_argument, 0, 'j'}, - {"result-file", required_argument, 0, 'r'}, - {"short-form", no_argument, 0, 's'}, - {"table", required_argument, 0, 't'}, - {"user", required_argument, 0, 'u'}, - {"version", no_argument, 0, 'V'}, - {0,0,0,0} -}; - void sql_print_error(const char *format,...); static bool one_database = 0; @@ -82,6 +63,44 @@ static void dump_remote_table(NET* net, const char* db, const char* table); static void die(const char* fmt, ...); static MYSQL* safe_connect(); +static struct my_option my_long_options[] = +{ +#ifndef DBUG_OFF + {"debug", '#', "Output debug log.", (gptr*) &default_dbug_option, + (gptr*) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, +#endif + {"database", 'd', "List entries for just this database (local log only)", + (gptr*) &database, (gptr*) &database, 0, GET_STR_ALLOC, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"help", '?', "Display this help and exit", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"host", 'h', "Get the binlog from server", (gptr*) &host, (gptr*) &host, + 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"offset", 'o', "Skip the first N entries", (gptr*) &offset, (gptr*) &offset, + 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"password", 'p', "Password to connect to remote server", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"port", 'P', "Use port to connect to the remote server", + (gptr*) &port, (gptr*) &port, 0, GET_INT, REQUIRED_ARG, MYSQL_PORT, 0, 0, + 0, 0, 0}, + {"position", 'j', "Start reading the binlog at position N", + (gptr*) &position, (gptr*) &position, 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, + 0, 0}, + {"result-file", 'r', "Direct output to a given file", 0, 0, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"short-form", 's', "Just show the queries, no extra info", + (gptr*) &short_form, (gptr*) &short_form, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, + 0, 0}, + {"table", 't', "Get raw table dump using COM_TABLE_DUMB", (gptr*) &table, + (gptr*) &table, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"user", 'u', "Connect to the remote server as username", + (gptr*) &user, (gptr*) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, + 0, 0}, + {"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, + 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} +}; + void sql_print_error(const char *format,...) { @@ -106,7 +125,7 @@ static void die(const char* fmt, ...) static void print_version() { - printf("%s Ver 1.9 for %s at %s\n",my_progname,SYSTEM_TYPE, MACHINE_TYPE); + printf("%s Ver 2.0 for %s at %s\n", my_progname, SYSTEM_TYPE, MACHINE_TYPE); } @@ -120,26 +139,10 @@ and you are welcome to modify and redistribute it under the GPL license\n"); printf("\ Dumps a MySQL binary log in a format usable for viewing or for pipeing to\n\ the mysql command line client\n\n"); - printf("Usage: %s [options] log-files\n",my_progname); - puts("Options:"); -#ifndef DBUG_OFF - printf("-#, --debug[=...] Output debug log. (%s)\n", - default_dbug_option); -#endif - printf("\ --?, --help Display this help and exit\n\ --s, --short-form Just show the queries, no extra info\n\ --o, --offset=N Skip the first N entries\n\ --d, --database=database List entries for just this database (local log only)\n\ --h, --host=server Get the binlog from server\n\ --P, --port=port Use port to connect to the remote server\n\ --u, --user=username Connect to the remote server as username\n\ --p, --password=password Password to connect to remote server\n\ --r, --result-file=file Direct output to a given file\n\ --j, --position=N Start reading the binlog at position N\n\ --t, --table=name Get raw table dump using COM_TABLE_DUMB\n\ --V, --version Print version and exit.\n\ -"); + printf("Usage: %s [options] log-files\n", my_progname); + my_print_help(my_long_options); + putchar('\n'); + my_print_variables(my_long_options); } static void dump_remote_file(NET* net, const char* fname) @@ -172,82 +175,61 @@ static void dump_remote_file(NET* net, const char* fname) fflush(result_file); } -static int parse_args(int *argc, char*** argv) -{ - int c, opt_index = 0; - result_file = stdout; - while((c = getopt_long(*argc, *argv, "so:#::d:h:j:u:p:P:r:t:?V", long_options, - &opt_index)) != EOF) +static my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument) +{ + switch(optid) { - switch(c) - { #ifndef DBUG_OFF - case '#': - DBUG_PUSH(optarg ? optarg : default_dbug_option); - break; + case '#': + DBUG_PUSH(argument ? argument : default_dbug_option); + break; #endif - case 'd': - one_database = 1; - database = my_strdup(optarg, MYF(0)); - break; - - case 's': - short_form = 1; - break; - - case 'o': - offset = strtoull(optarg,(char**) 0, 10); - break; - - case 'j': - position = strtoull(optarg,(char**) 0, 10); - break; - - case 'h': - use_remote = 1; - host = my_strdup(optarg, MYF(0)); - break; - - case 'P': - use_remote = 1; - port = atoi(optarg); - break; - - case 'p': - use_remote = 1; - pass = my_strdup(optarg, MYF(0)); - break; - - case 'r': - if (!(result_file = my_fopen(optarg, O_WRONLY | O_BINARY, MYF(MY_WME)))) - exit(1); - break; - - case 'u': - use_remote = 1; - user = my_strdup(optarg, MYF(0)); - break; - - case 't': - table = my_strdup(optarg, MYF(0)); - break; + case 'd': + one_database = 1; + break; + case 'h': + use_remote = 1; + break; + case 'P': + use_remote = 1; + break; + case 'p': + use_remote = 1; + pass = my_strdup(argument, MYF(0)); + break; + case 'r': + if (!(result_file = my_fopen(argument, O_WRONLY | O_BINARY, MYF(MY_WME)))) + exit(1); + break; + case 'u': + use_remote = 1; + break; + case 'V': + print_version(); + exit(0); + case '?': + default: + usage(); + exit(0); + } + return 0; +} - case 'V': - print_version(); - exit(0); - case '?': - default: - usage(); - exit(0); +static int parse_args(int *argc, char*** argv) +{ + int ho_error; - } + result_file = stdout; + if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option))) + { + printf("%s: handle_options() failed with error %d\n", my_progname, + ho_error); + exit(1); } - - (*argc)-=optind; - (*argv)+=optind; - return 0; } diff --git a/client/mysqlmanager-pwgen.c b/client/mysqlmanager-pwgen.c index 97eb31eb9c8..db8436c876c 100644 --- a/client/mysqlmanager-pwgen.c +++ b/client/mysqlmanager-pwgen.c @@ -14,7 +14,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define MANAGER_PWGEN_VERSION "1.0" +#define MANAGER_PWGEN_VERSION "1.1" #include <my_global.h> #include <m_ctype.h> @@ -22,18 +22,23 @@ #include <m_string.h> #include <mysql_version.h> #include <errno.h> -#include <getopt.h> +#include <my_getopt.h> #include <md5.h> const char* outfile=0,*user="root"; -struct option long_options[] = +static struct my_option my_long_options[] = { - {"output-file",required_argument,0,'o'}, - {"user",required_argument,0,'u'}, - {"help",no_argument,0,'?'}, - {"version",no_argument,0,'V'}, - {0,0,0,0} + {"output-file", 'o', "Write the output to the file with the given name", + (gptr*) &outfile, (gptr*) &outfile, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, + 0, 0}, + {"user", 'u', "Put given user in the password file", (gptr*) &user, + (gptr*) &user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"help", '?', "Display this message and exit", 0, 0, 0, GET_NO_ARG, NO_ARG, + 0, 0, 0, 0, 0, 0}, + {"version", 'V', "Display version info", 0, 0, 0, GET_NO_ARG, NO_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 die(const char* fmt, ...) @@ -66,36 +71,39 @@ void usage() printf("This software comes with ABSOLUTELY NO WARRANTY\n\n"); printf("Generates a password file to be used by mysqltest.\n\n"); printf("Usage: %s [OPTIONS]\n", my_progname); - printf("-?,--help Display this message and exit\n\ --V,--version Display version info\n\ --u,--user= Put given user in the password file\n\ --o,--output-file= Write the output to the file with the given name\n"); + my_print_help(my_long_options); + putchar('\n'); + my_print_variables(my_long_options); } +static my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument __attribute__((unused))) +{ + switch (optid) { + case '?': + usage(); + exit(0); + case 'V': + print_version(); + exit(0); + default: + usage(); + exit(1); + } + return 0; +} + + int parse_args(int argc, char** argv) { - int c,option_index=0; - while ((c=getopt_long(argc,argv,"?Vu:o:",long_options,&option_index)) - != EOF) + int ho_error; + + if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) { - switch (c) - { - case 'o': - outfile=optarg; - break; - case 'u': - user=optarg; - break; - case '?': - usage(); - exit(0); - case 'V': - print_version(); - exit(0); - default: - usage(); - exit(1); - } + printf("%s: handle_options() failed with error %d\n", my_progname, + ho_error); + exit(1); } return 0; } diff --git a/client/mysqlmanagerc.c b/client/mysqlmanagerc.c index a01f6c25f34..4acd33cf18a 100644 --- a/client/mysqlmanagerc.c +++ b/client/mysqlmanagerc.c @@ -14,7 +14,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define MANAGER_CLIENT_VERSION "1.1" +#define MANAGER_CLIENT_VERSION "1.2" #include <my_global.h> #include <mysql.h> @@ -22,7 +22,7 @@ #include <mysqld_error.h> #include <my_sys.h> #include <m_string.h> -#include <getopt.h> +#include <my_getopt.h> #include <stdarg.h> #include <sys/stat.h> #include <unistd.h> @@ -35,23 +35,31 @@ static void die(const char* fmt, ...); const char* user="root",*host="localhost"; char* pass=0; -int quiet=0; +my_bool quiet=0; uint port=MYSQL_MANAGER_PORT; static const char *load_default_groups[]= { "mysqlmanagerc",0 }; char** default_argv; MYSQL_MANAGER *manager; FILE* fp, *fp_out; -struct option long_options[] = +static struct my_option my_long_options[] = { - {"host",required_argument,0,'h'}, - {"user",required_argument,0,'u'}, - {"password",optional_argument,0,'p',}, - {"port",required_argument,0,'P'}, - {"help",no_argument,0,'?'}, - {"version",no_argument,0,'V'}, - {"quiet",no_argument,0,'q'}, - {0,0,0,0} + {"host", 'h', "Connect to host.", (gptr*) &host, (gptr*) &host, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"user", 'u', "User for login.", (gptr*) &user, (gptr*) &user, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"password", 'p', "Password to use when connecting to server.", + 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"port", 'P', "Port number to use for connection.", (gptr*) &port, + (gptr*) &port, 0, GET_UINT, REQUIRED_ARG, MYSQL_MANAGER_PORT, 0, 0, 0, 0, + 0}, + {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, + 0, 0, 0, 0, 0, 0}, + {"version", 'V', "Output version information and exit.", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"quiet", 'q', "Suppress all normal output.", (gptr*) &quiet, (gptr*) &quiet, + 0, GET_BOOL, NO_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 die(const char* fmt, ...) @@ -84,65 +92,53 @@ void usage() printf("This software comes with ABSOLUTELY NO WARRANTY\n\n"); printf("Command-line client for MySQL manager daemon.\n\n"); printf("Usage: %s [OPTIONS] < command_file\n", my_progname); - printf("\n\ - -?, --help Display this help and exit.\n"); - printf("\ - -h, --host=... Connect to host.\n\ - -u, --user=... User for login.\n\ - -p[password], --password[=...]\n\ - Password to use when connecting to server.\n\ - -P, --port=... Port number to use for connection.\n\ - -q, --quiet, --silent Suppress all normal output.\n\ - -V, --version Output version information and exit.\n\ - --no-defaults Don't read default options from any options file.\n\n"); + my_print_help(my_long_options); + printf(" --no-defaults Don't read default options from any options file.\n\n"); + my_print_variables(my_long_options); } -int parse_args(int argc, char **argv) + + +static my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument) { - int c, option_index = 0; my_bool tty_password=0; + + switch (optid) { + case 'p': + if (argument) + { + my_free(pass, MYF(MY_ALLOW_ZERO_PTR)); + pass= my_strdup(argument, MYF(MY_FAE)); + while (*argument) *argument++= 'x'; /* Destroy argument */ + } + else + tty_password=1; + break; + case 'V': + print_version(); + exit(0); + case '?': + usage(); + exit(0); + } + return 0; +} + + +int parse_args(int argc, char **argv) +{ + int ho_error; load_defaults("my",load_default_groups,&argc,&argv); default_argv= argv; - - while ((c = getopt_long(argc, argv, "h:p::u:P:?Vq", - long_options, &option_index)) != EOF) - { - switch (c) - { - case 'h': - host=optarg; - break; - case 'u': - user=optarg; - break; - case 'p': - if (optarg) - { - my_free(pass,MYF(MY_ALLOW_ZERO_PTR)); - pass=my_strdup(optarg,MYF(MY_FAE)); - while (*optarg) *optarg++= 'x'; /* Destroy argument */ - } - else - tty_password=1; - break; - case 'P': - port=atoi(optarg); - break; - case 'q': - quiet=1; - break; - case 'V': - print_version(); - exit(0); - case '?': - usage(); - exit(0); - default: - usage(); - exit(1); - } - } - return 0; + if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) + { + printf("%s: handle_options() failed with error %d\n", my_progname, + ho_error); + exit(1); + } + return 0; } int main(int argc, char** argv) { diff --git a/client/mysqltest.c b/client/mysqltest.c index a161b9352d4..7c20d9bca7b 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -22,6 +22,7 @@ * Sasha Pachev <sasha@mysql.com> * Matt Wagner <matt@mysql.com> * Monty + * Jani **/ /********************************************************************** @@ -41,7 +42,7 @@ **********************************************************************/ -#define MTEST_VERSION "1.14" +#define MTEST_VERSION "1.20" #include <my_global.h> #include <mysql_embed.h> @@ -55,7 +56,7 @@ #include <hash.h> #include <stdio.h> #include <stdlib.h> -#include <getopt.h> +#include <my_getopt.h> #include <stdarg.h> #include <sys/stat.h> #include <unistd.h> @@ -95,10 +96,12 @@ enum {OPT_MANAGER_USER=256,OPT_MANAGER_HOST,OPT_MANAGER_PASSWD, OPT_MANAGER_PORT,OPT_MANAGER_WAIT_TIMEOUT}; -static int record = 0, verbose = 0, silent = 0, opt_sleep=0; +static int record = 0, opt_sleep=0; static char *db = 0, *pass=0; const char* user = 0, *host = 0, *unix_sock = 0, *opt_basedir="./"; -static int port = 0, opt_big_test=0, opt_compress=0; +static int port = 0; +static my_bool opt_big_test= 0, opt_compress= 0, silent= 0, verbose = 0, + tty_password= 0; static uint start_lineno, *lineno; const char* manager_user="root",*manager_host=0; char *manager_pass=0; @@ -1785,36 +1788,74 @@ int read_query(struct st_query** q_ptr) return 0; } -struct option long_options[] = -{ - {"debug", optional_argument, 0, '#'}, - {"database", required_argument, 0, 'D'}, - {"basedir", required_argument, 0, 'b'}, - {"big-test", no_argument, 0, 'B'}, - {"compress", no_argument, 0, 'C'}, - {"help", no_argument, 0, '?'}, - {"host", required_argument, 0, 'h'}, - {"manager-user",required_argument, 0, OPT_MANAGER_USER}, - {"manager-host",required_argument, 0, OPT_MANAGER_HOST}, - {"manager-password",required_argument,0,OPT_MANAGER_PASSWD}, - {"manager-port",required_argument,0,OPT_MANAGER_PORT}, - {"manager-wait-timeout",required_argument,0,OPT_MANAGER_WAIT_TIMEOUT}, - {"password", optional_argument, 0, 'p'}, - {"port", required_argument, 0, 'P'}, - {"quiet", no_argument, 0, 's'}, - {"record", no_argument, 0, 'r'}, - {"result-file", required_argument, 0, 'R'}, - {"server-arg", required_argument, 0, 'A'}, - {"server-file", required_argument, 0, 'F'}, - {"silent", no_argument, 0, 's'}, - {"sleep", required_argument, 0, 'T'}, - {"socket", required_argument, 0, 'S'}, - {"test-file", required_argument, 0, 'x'}, - {"tmpdir", required_argument, 0, 't'}, - {"user", required_argument, 0, 'u'}, - {"verbose", no_argument, 0, 'v'}, - {"version", no_argument, 0, 'V'}, - {0, 0, 0, 0} + +static struct my_option my_long_options[] = +{ +#ifndef DBUG_OFF + {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'", + 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, +#endif + {"database", 'D', "Database to use.", (gptr*) &db, (gptr*) &db, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"basedir", 'b', "Basedir for tests", (gptr*) &opt_basedir, + (gptr*) &opt_basedir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"big-test", 'B', "Define BIG_TEST to 1", (gptr*) &opt_big_test, + (gptr*) &opt_big_test, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"compress", 'C', "Use the compressed server/client protocol", + (gptr*) &opt_compress, (gptr*) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, + 0, 0, 0}, + {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, + 0, 0, 0, 0, 0, 0}, + {"host", 'h', "Connect to host.", (gptr*) &host, (gptr*) &host, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"manager-user", OPT_MANAGER_USER, "Undocumented: Used for debugging", + (gptr*) &manager_user, (gptr*) &manager_user, 0, GET_STR, REQUIRED_ARG, 0, + 0, 0, 0, 0, 0}, + {"manager-host", OPT_MANAGER_HOST, "Undocumented: Used for debugging", + (gptr*) &manager_host, (gptr*) &manager_host, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"manager-password", OPT_MANAGER_PASSWD, "Undocumented: Used for debugging", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"manager-port", OPT_MANAGER_PORT, "Undocumented: Used for debugging", + (gptr*) &manager_port, (gptr*) &manager_port, 0, GET_INT, REQUIRED_ARG, + MYSQL_MANAGER_PORT, 0, 0, 0, 0, 0}, + {"manager-wait-timeout", OPT_MANAGER_WAIT_TIMEOUT, + "Undocumented: Used for debugging", (gptr*) &manager_wait_timeout, + (gptr*) &manager_wait_timeout, 0, GET_INT, REQUIRED_ARG, 3, 0, 0, 0, 0, 0}, + {"password", 'p', "Password to use when connecting to server.", + 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"port", 'P', "Port number to use for connection.", (gptr*) &port, + (gptr*) &port, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"quiet", 's', "Suppress all normal output.", (gptr*) &silent, + (gptr*) &silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"record", 'r', "Record output of test_file into result file.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"result-file", 'R', "Read/Store result from/in this file.", + (gptr*) &result_file, (gptr*) &result_file, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"server-arg", 'A', "Send enbedded server this as a paramenter", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"server-file", 'F', "Read embedded server arguments from file", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"silent", 's', "Suppress all normal output. Synonym for --quiet.", + (gptr*) &silent, (gptr*) &silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sleep", 'T', "Sleep always this many seconds on sleep commands", + (gptr*) &opt_sleep, (gptr*) &opt_sleep, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, + 0, 0, 0}, + {"socket", 'S', "Socket file to use for connection.", + (gptr*) &unix_sock, (gptr*) &unix_sock, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, + 0, 0, 0}, + {"test-file", 'x', "Read test from/in this file (default stdin).", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"tmpdir", 't', "Temporary directory where sockets are put", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"user", 'u', "User for login.", (gptr*) &user, (gptr*) &user, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"verbose", 'v', "Write more.", (gptr*) &verbose, (gptr*) &verbose, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"version", 'V', "Output version information and exit.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; @@ -1827,170 +1868,101 @@ static void print_version(void) void usage() { print_version(); - printf("MySQL AB, by Sasha, Matt & Monty\n"); + printf("MySQL AB, by Sasha, Matt, Monty & Jani\n"); printf("This software comes with ABSOLUTELY NO WARRANTY\n\n"); printf("Runs a test against the mysql server and compares output with a results file.\n\n"); printf("Usage: %s [OPTIONS] [database] < test_file\n", my_progname); - printf("\n\ - -?, --help Display this help and exit.\n"); -#ifndef DBUG_OFF - puts("\ - -#, --debug=[...] Output debug log. Often this is 'd:t:o,filename`"); -#endif - printf("\ - -h, --host=... Connect to host.\n\ - -u, --user=... User for login.\n\ - -p[password], --password[=...]\n\ - Password to use when connecting to server.\n\ - -b, --basedir=... Basedir for tests\n\ - -B, --big-test Define BIG_TEST to 1\n\ - -C, --compress Use the compressed server/client protocol\n\ - -D, --database=... Database to use.\n\ - -P, --port=... Port number to use for connection.\n\ - --server-arg=... Send enbedded server this as a paramenter\n\ - --server-file=... Read embedded server arguments from file\n\ - -s, --silent, --quiet Suppress all normal output.\n\ - -S, --socket=... Socket file to use for connection.\n\ - -t, --tmpdir=... Temporary directory where sockets are put\n\ - -T, --sleep=# Sleep always this many seconds on sleep commands\n\ - -r, --record Record output of test_file into result file.\n\ - -R, --result-file=... Read/Store result from/in this file.\n\ - -x, --test-file=... Read test from/in this file (default stdin).\n\ - -v, --verbose Write more.\n\ - -V, --version Output version information and exit.\n\ - --no-defaults Don't read default options from any options file.\n\n"); + my_print_help(my_long_options); + printf(" --no-defaults Don't read default options from any options file.\n\n"); + 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:S:i:O,/tmp/mysqltest.trace"); + break; + case 'r': + record = 1; + break; + case (int)OPT_MANAGER_PASSWD: + my_free(manager_pass,MYF(MY_ALLOW_ZERO_PTR)); + manager_pass=my_strdup(argument, MYF(MY_FAE)); + while (*argument) *argument++= 'x'; /* Destroy argument */ + break; + case 'x': + { + char buff[FN_REFLEN]; + if (!test_if_hard_path(argument)) + { + strxmov(buff, opt_basedir, argument, NullS); + argument= buff; + } + fn_format(buff, argument, "", "", 4); + if (!(*++cur_file = my_fopen(buff, O_RDONLY, MYF(MY_WME)))) + die("Could not open %s: errno = %d", argument, errno); + break; + } + case 'p': + if (argument) + { + my_free(pass, MYF(MY_ALLOW_ZERO_PTR)); + pass= my_strdup(argument, MYF(MY_FAE)); + while (*argument) *argument++= 'x'; /* Destroy argument */ + } + else + tty_password= 1; + break; + case 't': + strnmov(TMPDIR, argument, sizeof(TMPDIR)); + break; + case 'A': + if (!embedded_server_arg_count) + { + embedded_server_arg_count=1; + embedded_server_args[0]= (char*) ""; + } + embedded_server_args[embedded_server_arg_count++]= + my_strdup(argument, MYF(MY_FAE)); + if (embedded_server_arg_count == MAX_SERVER_ARGS || + !embedded_server_args[embedded_server_arg_count-1]) + { + die("Can't use server argument"); + } + break; + case 'F': + if (read_server_arguments(argument)) + die(NullS); + break; + case 'V': + print_version(); + exit(0); + case '?': + usage(); + exit(1); + } + return 0; +} + + int parse_args(int argc, char **argv) { - int c, option_index = 0; - my_bool tty_password=0; + int ho_error; load_defaults("my",load_default_groups,&argc,&argv); default_argv= argv; - while ((c = getopt_long(argc, argv, "A:h:p::u:b:BCF:P:D:S:R:x:t:T:#:?rvVs", - long_options, &option_index)) != EOF) - { - switch(c) { - case '#': - DBUG_PUSH(optarg ? optarg : "d:t:S:i:O,/tmp/mysqltest.trace"); - break; - case 'v': - verbose = 1; - break; - case 'r': - record = 1; - break; - case (int)OPT_MANAGER_WAIT_TIMEOUT: - manager_wait_timeout=atoi(optarg); - break; - case (int)OPT_MANAGER_PORT: - manager_port=atoi(optarg); - break; - case (int)OPT_MANAGER_HOST: - manager_host=optarg; - break; - case (int)OPT_MANAGER_USER: - manager_user=optarg; - break; - case (int)OPT_MANAGER_PASSWD: - my_free(manager_pass,MYF(MY_ALLOW_ZERO_PTR)); - manager_pass=my_strdup(optarg,MYF(MY_FAE)); - while (*optarg) *optarg++= 'x'; /* Destroy argument */ - break; - case 'u': - user = optarg; - break; - case 'R': - result_file = optarg; - break; - case 'x': - { - char buff[FN_REFLEN]; - if (!test_if_hard_path(optarg)) - { - strxmov(buff, opt_basedir, optarg, NullS); - optarg=buff; - } - fn_format(buff,optarg,"","",4); - if (!(*++cur_file = my_fopen(buff, O_RDONLY, MYF(MY_WME)))) - die("Could not open %s: errno = %d", optarg, errno); - break; - } - case 'p': - if (optarg) - { - my_free(pass,MYF(MY_ALLOW_ZERO_PTR)); - pass=my_strdup(optarg,MYF(MY_FAE)); - while (*optarg) *optarg++= 'x'; /* Destroy argument */ - } - else - tty_password=1; - break; - case 'b': - opt_basedir= optarg; - break; - case 'B': - opt_big_test=1; - break; - case 'C': - opt_compress=1; - break; - case 'P': - port = atoi(optarg); - break; - case 'S': - unix_sock = optarg; - break; - case 'D': - db = optarg; - break; - case 'h': - host = optarg; - break; - case 's': - silent = 1; - break; - case 't': - strnmov(TMPDIR,optarg,sizeof(TMPDIR)); - break; - case 'T': - opt_sleep=atoi(optarg); - break; - case 'A': - if (!embedded_server_arg_count) - { - embedded_server_arg_count=1; - embedded_server_args[0]= (char*) ""; - } - embedded_server_args[embedded_server_arg_count++]= - my_strdup(optarg,MYF(MY_FAE)); - if (embedded_server_arg_count == MAX_SERVER_ARGS || - !embedded_server_args[embedded_server_arg_count-1]) - { - die("Can't use server argument"); - } - break; - case 'F': - if (read_server_arguments(optarg)) - die(NullS); - break; - case 'V': - print_version(); - exit(0); - case '?': - usage(); - exit(1); /* Unknown option */ - default: - fprintf(stderr,"Unknown option '%c'\n",c); - usage(); - exit(1); - } - } + if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) + { + printf("%s: handle_options() failed with error %d\n", my_progname, + ho_error); + exit(1); + } - argc-=optind; - argv+=optind; if (argc > 1) { usage(); diff --git a/client/thread_test.c b/client/thread_test.c index f7e2a6fd32a..10183ca5150 100644 --- a/client/thread_test.c +++ b/client/thread_test.c @@ -28,9 +28,9 @@ int main(int argc __attribute__((unused)), char **argv __attribute__((unused))) #include <my_sys.h> #include <my_pthread.h> #include "mysql.h" -#include <getopt.h> +#include <my_getopt.h> -static my_bool version,verbose; +static my_bool version, verbose, tty_password= 0; static uint thread_count,number_of_tests=1000,number_of_threads=2; static pthread_cond_t COND_thread_count; static pthread_mutex_t LOCK_thread_count; @@ -84,23 +84,39 @@ end: } -static struct option long_options[] = +static struct my_option my_long_options[] = { - {"help", no_argument, 0, '?'}, - {"database", required_argument, 0, 'D'}, - {"host", required_argument, 0, 'h'}, - {"password", optional_argument, 0, 'p'}, - {"user", required_argument, 0, 'u'}, - {"version", no_argument, 0, 'V'}, - {"verbose", no_argument, 0, 'v'}, - {"query", required_argument, 0, 'Q'}, - {"port", required_argument, 0, 'P'}, - {"socket", required_argument, 0, 'S'}, - {"test-count",required_argument, 0, 'c'}, - {"thread-count",required_argument, 0, 't'}, - {0, 0, 0, 0} + {"help", '?', "Display this help and exit", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, + 0, 0, 0, 0, 0}, + {"database", 'D', "Database to use", (gptr*) &database, (gptr*) &database, + 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"host", 'h', "Connect to host", (gptr*) &host, (gptr*) &host, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"password", 'p', + "Password to use when connecting to server. If password is not given it's asked from the tty.", + 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"user", 'u', "User for login if not current user", (gptr*) &user, + (gptr*) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"version", 'V', "Output version information and exit", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"verbose", 'v', "Write some progress indicators", (gptr*) &verbose, + (gptr*) &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"query", 'Q', "Query to execute in each threads", (gptr*) &query, + (gptr*) &query, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"port", 'P', "Port number to use for connection", (gptr*) &tcp_port, + (gptr*) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"socket", 'S', "Socket file to use for connection", (gptr*) &unix_socket, + (gptr*) &unix_socket, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"test-count", 'c', "Run test count times (default %d)", + (gptr*) &number_of_tests, (gptr*) &number_of_tests, 0, GET_UINT, + REQUIRED_ARG, 1000, 0, 0, 0, 0, 0}, + {"thread-count", 't', "Number of threads to start", + (gptr*) &number_of_threads, (gptr*) &number_of_threads, 0, GET_UINT, + REQUIRED_ARG, 2, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; + static const char *load_default_groups[]= { "client",0 }; static void usage() @@ -110,103 +126,59 @@ static void usage() return; puts("This software comes with ABSOLUTELY NO WARRANTY.\n"); printf("Usage: %s [OPTIONS] [database]\n", my_progname); - printf("\n\ - -?, --help Display this help and exit\n\ - -c #, --test-count=# Run test count times (default %d)\n",number_of_tests); - printf("\ - -D, --database=.. Database to use\n\ - -h, --host=... Connect to host\n\ - -p[password], --password[=...]\n\ - Password to use when connecting to server\n\ - If password is not given it's asked from the tty.\n"); - printf("\n\ - -P --port=... Port number to use for connection\n\ - -Q, --query=... Query to execute in each threads\n\ - -S --socket=... Socket file to use for connection\n"); - printf("\ - -t --thread-count=# Number of threads to start (default: %d) \n\ - -u, --user=# User for login if not current user\n\ - -v, --verbose Write some progress indicators\n\ - -V, --version Output version information and exit\n", - number_of_threads); + my_print_help(my_long_options); print_defaults("my",load_default_groups); - + my_print_variables(my_long_options); printf("\nExample usage:\n\n\ %s -Q 'select * from mysql.user' -c %d -t %d\n", my_progname, number_of_tests, number_of_threads); } +static my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument) +{ + switch (optid) { + case 'p': + if (argument) + { + my_free(password, MYF(MY_ALLOW_ZERO_PTR)); + password= my_strdup(argument, MYF(MY_FAE)); + while (*argument) *argument++= 'x'; /* Destroy argument */ + } + else + tty_password= 1; + break; + case 'V': + version= 1; + usage(); + exit(0); + break; + case '?': + case 'I': /* Info */ + usage(); + exit(1); + break; + } + return 0; +} + + static void get_options(int argc, char **argv) { - int c,option_index=0,error=0; - bool tty_password=0; + int ho_error; + load_defaults("my",load_default_groups,&argc,&argv); - while ((c=getopt_long(argc,argv, "c:D:h:p::VQ:P:S:t:?I", - long_options, &option_index)) != EOF) + if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) { - switch (c) { - case 'c': - number_of_tests=atoi(optarg); - break; - case 'D': - my_free(database,MYF(MY_ALLOW_ZERO_PTR)); - database=my_strdup(optarg,MYF(MY_WME)); - break; - case 'h': - host = optarg; - break; - case 'Q': /* Allow old 'q' option */ - query= optarg; - break; - case 'p': - if (optarg) - { - my_free(password,MYF(MY_ALLOW_ZERO_PTR)); - password=my_strdup(optarg,MYF(MY_FAE)); - while (*optarg) *optarg++= 'x'; /* Destroy argument */ - } - else - tty_password=1; - break; - case 'u': - my_free(user,MYF(MY_ALLOW_ZERO_PTR)); - user= my_strdup(optarg,MYF(0)); - break; - case 'P': - tcp_port= (unsigned int) atoi(optarg); - break; - case 'S': - my_free(unix_socket,MYF(MY_ALLOW_ZERO_PTR)); - unix_socket= my_strdup(optarg,MYF(0)); - break; - case 't': - number_of_threads=atoi(optarg); - break; - case 'v': - verbose=1; - break; - case 'V': - version=1; - usage(); - exit(0); - break; - default: - fprintf(stderr,"Illegal option character '%c'\n",opterr); - /* Fall through */ - case '?': - case 'I': /* Info */ - error++; - break; - } - } - if (error || argc != optind) - { - usage(); + printf("%s: handle_options() failed with error %d\n", my_progname, + ho_error); exit(1); } + free_defaults(argv); if (tty_password) password=get_tty_password(NullS); diff --git a/isam/isamchk.c b/isam/isamchk.c index c09b1cd3324..7c604973108 100644 --- a/isam/isamchk.c +++ b/isam/isamchk.c @@ -20,7 +20,7 @@ #include <m_ctype.h> #include <stdarg.h> -#include <getopt.h> +#include <my_getopt.h> #ifdef HAVE_SYS_VADVICE_H #include <sys/vadvise.h> #endif @@ -94,12 +94,16 @@ typedef struct st_isam_sort_info { N_KEYSEG *keyseg; } ISAM_SORT_INFO; -enum ic_options {OPT_CHARSETS_DIR_IC=256}; +enum ic_options {OPT_CHARSETS_DIR_IC=256, OPT_KEY_BUFFER_SIZE, + OPT_READ_BUFFER_SIZE, OPT_WRITE_BUFFER_SIZE, + OPT_SORT_BUFFER_SIZE, OPT_SORT_KEY_BLOCKS, + OPT_DECODE_BITS}; static ulong use_buffers=0,read_buffer_length=0,write_buffer_length=0, sort_buffer_length=0,sort_key_blocks=0,crc=0,unique_count=0; static uint testflag=0,out_flag=0,warning_printed=0,error_printed=0, - rep_quick=0,verbose=0,opt_follow_links=1; + verbose=0,opt_follow_links=1; +static my_bool rep_quick= 0; static uint opt_sort_key=0,total_files=0,max_level=0,max_key=N_MAXKEY; static ulong keydata=0,totaldata=0,key_blocks=0; static ulong new_file_pos=0,record_checksum=0,key_file_blocks=0,decode_bits; @@ -234,118 +238,118 @@ int main( int argc, char **argv) } /* main */ -static CHANGEABLE_VAR changeable_vars[] = { - { "key_buffer_size",(long*) &use_buffers,(long) USE_BUFFER_INIT, - (long) MALLOC_OVERHEAD, (long) ~0L,(long) MALLOC_OVERHEAD,(long) IO_SIZE }, - { "read_buffer_size", (long*) &read_buffer_length,(long) READ_BUFFER_INIT, - (long) MALLOC_OVERHEAD,(long) ~0L,(long) MALLOC_OVERHEAD,(long) 1L }, - { "write_buffer_size", (long*) &write_buffer_length,(long) READ_BUFFER_INIT, - (long) MALLOC_OVERHEAD,(long) ~0L,(long) MALLOC_OVERHEAD,(long) 1L }, - { "sort_buffer_size",(long*) &sort_buffer_length,(long) SORT_BUFFER_INIT, - (long) (MIN_SORT_BUFFER+MALLOC_OVERHEAD),(long) ~0L, - (long) MALLOC_OVERHEAD,(long) 1L }, - { "sort_key_blocks",(long*) &sort_key_blocks,BUFFERS_WHEN_SORTING,4L,100L,0L, - 1L }, - { "decode_bits",(long*) &decode_bits,9L,4L,17L,0L,1L }, - { NullS,(long*) 0,0L,0L,0L,0L,0L,} }; - - -static struct option long_options[] = +static struct my_option my_long_options[] = { - {"analyze", no_argument, 0, 'a'}, - {"character-sets-dir", required_argument, 0, OPT_CHARSETS_DIR_IC}, + {"analyze", 'a', + "Analyze distribution of keys. Will make some joins in MySQL faster.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"character-sets-dir", OPT_CHARSETS_DIR_IC, + "Directory where character sets are", (gptr*) &charsets_dir, + (gptr*) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #ifndef DBUG_OFF - {"debug", required_argument, 0, '#'}, + {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"default-character-set", required_argument, 0, 'C'}, - {"description", no_argument, 0, 'd'}, - {"extend-check", no_argument, 0, 'e'}, - {"information", no_argument, 0, 'i'}, - {"force", no_argument, 0, 'f'}, - {"help", no_argument, 0, '?'}, - {"keys-used", required_argument, 0, 'k'}, - {"no-symlinks", no_argument, 0, 'l'}, - {"quick", no_argument, 0, 'q'}, - {"recover", no_argument, 0, 'r'}, - {"safe-recover", no_argument, 0, 'o'}, - {"block-search", required_argument, 0, 'b'}, - {"set-variable", required_argument, 0, 'O'}, - {"silent", no_argument, 0, 's'}, - {"sort-index", no_argument, 0, 'S'}, - {"sort-records", required_argument, 0, 'R'}, - {"unpack", no_argument, 0, 'u'}, - {"verbose", no_argument, 0, 'v'}, - {"version", no_argument, 0, 'V'}, - {"wait", no_argument, 0, 'w'}, - {0, 0, 0, 0} + {"default-character-set", 'C', "Set the default character set", + (gptr*) &default_charset, (gptr*) &default_charset, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"description", 'd', "Prints some information about table.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"extend-check", 'e', + "Check the table VERY thoroughly. One need to use this only in extreme cases, because isamchk should normally find all errors even without this switch.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"information", 'i', "Print statistics information about the table", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"force", 'f', + "Overwrite old temporary files. If one uses -f when checking tables (running isamchk without -r), isamchk will automatically restart with -r on any wrong table.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, + 0, 0, 0, 0, 0}, + {"keys-used", 'k', + "Used with '-r'. Tell ISAM to update only the first # keys. This can be used to get faster inserts!", + (gptr*) &max_key, (gptr*) &max_key, 0, GET_UINT, REQUIRED_ARG, N_MAXKEY, 0, + 0, 0, 0, 0}, + {"no-symlinks", 'l', + "Do not follow symbolic links when repairing. Normally isamchk repairs the table a symlink points at.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"quick", 'q', + "Used with -r to get a faster repair. (The data file isn't touched.) One can give a second '-q' to force isamchk to modify the original datafile.", + (gptr*) &rep_quick, (gptr*) &rep_quick, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, + 0}, + {"recover", 'r', + "Can fix almost anything except unique keys that aren't unique.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"safe-recover", 'o', + "Uses old recovery method; slower than '-r' but can handle a couple of cases that '-r' cannot handle.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"set-variable", 'O', + "Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"block-search", 'b', "For debugging.", (gptr*) &search_after_block, + (gptr*) &search_after_block, 0, GET_ULONG, REQUIRED_ARG, NI_POS_ERROR, 0, + 0, 0, 0, 0}, + {"silent", 's', + "Only print errors. One can use two -s to make isamchk very silent.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sort-index", 'S', + "Sort index blocks. This speeds up 'read-next' in applications.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sort-records", 'R', + "Sort records according to an index. This makes your data much more localized and may speed up things (It may be VERY slow to do a sort the first time!)", + (gptr*) &opt_sort_key, (gptr*) &opt_sort_key, 0, GET_UINT, REQUIRED_ARG, + 0, 0, (N_MAXKEY - 1), 1, 0, 0}, + {"unpack", 'u', "Unpack file packed with pack_isam.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"verbose", 'v', + "Print more information. This can be used with -d and -e. Use many -v for more verbosity!", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"version", 'V', "Print version and exit.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"wait", 'w', "Wait if table is locked.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"key_buffer_size", OPT_KEY_BUFFER_SIZE, "", (gptr*) &use_buffers, + (gptr*) &use_buffers, 0, GET_ULONG, REQUIRED_ARG, (long) USE_BUFFER_INIT, + (long) MALLOC_OVERHEAD, (long) ~0L, (long) MALLOC_OVERHEAD, (long) IO_SIZE, + 0}, + {"read_buffer_size", OPT_READ_BUFFER_SIZE, "", + (gptr*) &read_buffer_length, (gptr*) &read_buffer_length, 0, GET_ULONG, + REQUIRED_ARG, (long) READ_BUFFER_INIT, (long) MALLOC_OVERHEAD, + (long) ~0L, (long) MALLOC_OVERHEAD, (long) 1L, 0}, + {"write_buffer_size", OPT_WRITE_BUFFER_SIZE, "", + (gptr*) &write_buffer_length, (gptr*) &write_buffer_length, 0, GET_ULONG, + REQUIRED_ARG, (long) READ_BUFFER_INIT, (long) MALLOC_OVERHEAD, (long) ~0L, + (long) MALLOC_OVERHEAD, (long) 1L, 0}, + {"sort_buffer_size", OPT_SORT_BUFFER_SIZE, "", + (gptr*) &sort_buffer_length, (gptr*) &sort_buffer_length, 0, GET_ULONG, + REQUIRED_ARG, (long) SORT_BUFFER_INIT, + (long) (MIN_SORT_BUFFER + MALLOC_OVERHEAD), (long) ~0L, + (long) MALLOC_OVERHEAD, (long) 1L, 0}, + {"sort_key_blocks", OPT_SORT_KEY_BLOCKS, "", + (gptr*) &sort_key_blocks, (gptr*) &sort_key_blocks, 0, GET_ULONG, + REQUIRED_ARG, BUFFERS_WHEN_SORTING, 4L, 100L, 0L, 1L, 0}, + {"decode_bits", OPT_DECODE_BITS, "", + (gptr*) &decode_bits, (gptr*) &decode_bits, 0, GET_ULONG, REQUIRED_ARG, + 9L, 4L, 17L, 0L, 1L, 0}, + {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; static void print_version(void) { - printf("%s Ver 5.17 for %s at %s\n",my_progname,SYSTEM_TYPE, + printf("%s Ver 6.00 for %s at %s\n", my_progname, SYSTEM_TYPE, MACHINE_TYPE); } static void usage(void) { - uint i; print_version(); - puts("TCX Datakonsult AB, by Monty, for your professional use"); + puts("MySQL AB, by Monty, for your professional use"); puts("This software comes with NO WARRANTY: see the PUBLIC for details.\n"); puts("Description, check and repair of ISAM tables."); puts("Used without options all tables on the command will be checked for errors"); printf("Usage: %s [OPTIONS] tables[.ISM]\n", my_progname); - puts("\n\ - -a, --analyze Analyze distribution of keys. Will make some joins in\n\ - MySQL faster.\n\ - -#, --debug=... Output debug log. Often this is 'd:t:o,filename`\n\ - --character-sets-dir=...\n\ - Directory where character sets are\n\ - -C, --default-character-set=...\n\ - Set the default character set\n\ - -d, --description Prints some information about table.\n\ - -e, --extend-check Check the table VERY thoroughly. One need use this\n\ - only in extreme cases as isamchk should normally find\n\ - all errors even without this switch\n\ - -f, --force Overwrite old temporary files.\n\ - If one uses -f when checking tables (running isamchk\n\ - without -r), isamchk will automatically restart with\n\ - -r on any wrong table.\n\ - -?, --help Display this help and exit.\n\ - -i, --information Print statistics information about the table\n\ - -k, --keys-used=# Used with '-r'. Tell ISAM to update only the first\n\ - # keys. This can be used to get faster inserts!\n\ - -l, --no-symlinks Do not follow symbolic links when repairing. Normally\n\ - isamchk repairs the table a symlink points at.\n\ - -q, --quick Used with -r to get a faster repair. (The data file\n\ - isn't touched.) One can give a second '-q' to force\n\ - isamchk to modify the original datafile."); - puts("\ - -r, --recover Can fix almost anything except unique keys that aren't\n\ - unique.\n\ - -o, --safe-recover Uses old recovery method; slower than '-r' but can\n\ - handle a couple of cases that '-r' cannot handle.\n\ - -O, --set-variable var=option\n\ - Change the value of a variable.\n\ - -s, --silent Only print errors. One can use two -s to make isamchk\n\ - very silent\n\ - -S, --sort-index Sort index blocks. This speeds up 'read-next' in\n\ - applications\n\ - -R, --sort-records=#\n\ - Sort records according to an index. This makes your\n\ - data much more localized and may speed up things\n\ - (It may be VERY slow to do a sort the first time!)\n\ - -u, --unpack Unpack file packed with pack_isam.\n\ - -v, --verbose Print more information. This can be used with\n\ - -d and -e. Use many -v for more verbosity!\n\ - -V, --version Print version and exit.\n\ - -w, --wait Wait if table is locked."); - print_defaults("my",load_default_groups); - printf("\nPossible variables for option --set-variable (-O) are:\n"); - for (i=0; changeable_vars[i].name ; i++) - printf("%-20s current value: %lu\n", - changeable_vars[i].name, - *changeable_vars[i].varptr); + my_print_help(my_long_options); + print_defaults("my", load_default_groups); + my_print_variables(my_long_options); } /* Check table */ @@ -575,112 +579,98 @@ end2: } /* nisamchk */ +static my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument) + +{ + switch(optid) { + case 'a': + testflag|= T_STATISTICS; + break; + case 's': /* silent */ + if (testflag & T_SILENT) + testflag|=T_VERY_SILENT; + testflag|= T_SILENT; + testflag&= ~T_WRITE_LOOP; + break; + case 'w': + testflag|= T_WAIT_FOREVER; + break; + case 'd': /* description if isam-file */ + testflag|= T_DESCRIPT; + break; + case 'e': /* extend check */ + testflag|= T_EXTEND; + break; + case 'i': + testflag|= T_INFO; + break; + case 'f': + tmpfile_createflag= O_RDWR | O_TRUNC; + testflag|=T_FORCE_CREATE; + break; + case 'l': + opt_follow_links=0; + break; + case 'r': /* Repair table */ + testflag= (testflag & ~T_REP) | T_REP_BY_SORT; + break; + case 'o': + testflag= (testflag & ~T_REP_BY_SORT) | T_REP; + my_disable_async_io=1; /* More safety */ + break; + case 'u': + testflag|= T_UNPACK | T_REP_BY_SORT; + break; + case 'v': /* Verbose */ + testflag|= T_VERBOSE; + verbose++; + break; + case 'R': /* Sort records */ + testflag|= T_SORT_RECORDS; + if (opt_sort_key >= N_MAXKEY) + { + fprintf(stderr, + "The value of the sort key is bigger than max key: %d.\n", + N_MAXKEY); + exit(1); + } + break; + case 'S': /* Sort index */ + testflag|= T_SORT_INDEX; + break; + case '#': + DBUG_PUSH(argument ? argument : "d:t:o,/tmp/isamchk.trace"); + break; + case 'V': + print_version(); + exit(0); + case '?': + usage(); + exit(0); + } + return 0; +} + /* Read options */ -static void get_options(register int *argc,register char ***argv) +static void get_options(register int *argc, register char ***argv) { - int c,option_index=0; + int ho_error; load_defaults("my",load_default_groups,argc,argv); defaults_alloc= *argv; - set_all_changeable_vars(changeable_vars); if (isatty(fileno(stdout))) testflag|=T_WRITE_LOOP; - while ((c=getopt_long(*argc,*argv,"adeif?lqrosSuvVw#:b:k:O:R:C:", - long_options, &option_index)) != EOF) + + if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option))) { - switch(c) { - case 'a': - testflag|= T_STATISTICS; - break; - case 'C': - default_charset=optarg; - break; - case OPT_CHARSETS_DIR_IC: - charsets_dir = optarg; - break; - case 'b': - search_after_block=strtoul(optarg,NULL,10); - break; - case 's': /* silent */ - if (testflag & T_SILENT) - testflag|=T_VERY_SILENT; - testflag|= T_SILENT; - testflag&= ~T_WRITE_LOOP; - break; - case 'w': - testflag|= T_WAIT_FOREVER; - break; - case 'd': /* description if isam-file */ - testflag|= T_DESCRIPT; - break; - case 'e': /* extend check */ - testflag|= T_EXTEND; - break; - case 'i': - testflag|= T_INFO; - break; - case 'f': - tmpfile_createflag= O_RDWR | O_TRUNC; - testflag|=T_FORCE_CREATE; - break; - case 'k': - max_key= (uint) atoi(optarg); - break; - case 'l': - opt_follow_links=0; - break; - case 'r': /* Repair table */ - testflag= (testflag & ~T_REP) | T_REP_BY_SORT; - break; - case 'o': - testflag= (testflag & ~T_REP_BY_SORT) | T_REP; - my_disable_async_io=1; /* More safety */ - break; - case 'q': - rep_quick++; - break; - case 'u': - testflag|= T_UNPACK | T_REP_BY_SORT; - break; - case 'v': /* Verbose */ - testflag|= T_VERBOSE; - verbose++; - break; - case 'O': - if (set_changeable_var(optarg, changeable_vars)) - { - usage(); - exit(1); - } - break; - case 'R': /* Sort records */ - testflag|= T_SORT_RECORDS; - opt_sort_key=(uint) atoi(optarg)-1; - if (opt_sort_key >= N_MAXKEY) - { - fprintf(stderr, - "The value of the sort key is bigger than max key: %d.\n", - N_MAXKEY); - exit(1); - } - break; - case 'S': /* Sort index */ - testflag|= T_SORT_INDEX; - break; - case '#': - DBUG_PUSH(optarg ? optarg : "d:t:o,/tmp/isamchk.trace"); - break; - case 'V': - print_version(); - exit(0); - case '?': - usage(); - exit(0); - } + printf("%s: handle_options() failed with error %d\n", my_progname, + ho_error); + exit(1); } - (*argc)-=optind; - (*argv)+=optind; + if (*argc == 0) { usage(); diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 2a981b20501..b5b98a8ba9a 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -593,6 +593,9 @@ static void init_variables(const struct my_option *options) else if (options->var_type == GET_UINT) *((uint*) options->u_max_value)= *((uint*) options->value)= (uint) options->def_value; + else if (options->var_type == GET_BOOL) + *((my_bool*) options->u_max_value)= *((my_bool*) options->value)= + (my_bool) options->def_value; else if (options->var_type == GET_LONG) *((long*) options->u_max_value)= *((long*) options->value)= (long) options->def_value; @@ -653,7 +656,7 @@ void my_print_help(const struct my_option *options) optp->arg_type == OPT_ARG ? "]" : ""); col+= (optp->arg_type == OPT_ARG) ? 5 : 3; } - if (col > name_space) + if (col > name_space && optp->comment && *optp->comment) { putchar('\n'); col= 0; @@ -697,7 +700,7 @@ void my_print_variables(const struct my_option *options) printf("--------------------------------- -------------\n"); for (optp= options; optp->id; optp++) { - if (optp->value && optp->var_type != GET_BOOL) + if (optp->value) { printf("%s", optp->name); length= strlen(optp->name); @@ -710,6 +713,13 @@ void my_print_variables(const struct my_option *options) else printf("(No default value)\n"); } + else if (optp->var_type == GET_BOOL) + { + if (!optp->def_value && !*((my_bool*) optp->value)) + printf("(No default value)\n"); + else + printf("%d\n", *((my_bool*) optp->value)); + } else if (optp->var_type == GET_INT) { if (!optp->def_value && !*((int*) optp->value)) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index d1d538dd3c9..fd3111f380a 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -617,7 +617,7 @@ extern pthread_cond_t COND_refresh,COND_thread_count; extern pthread_attr_t connection_attrib; extern bool opt_endinfo, using_udf_functions, locked_in_memory, opt_using_transactions, use_temp_pool, mysql_embedded; -extern bool opt_local_infile; +extern my_bool opt_local_infile; extern char f_fyllchar; extern ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count, ha_read_key_count, ha_read_next_count, ha_read_prev_count, diff --git a/sql/mysqld.cc b/sql/mysqld.cc index db500879058..2a118be100a 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -334,7 +334,7 @@ ulong bytes_sent = 0L, bytes_received = 0L; bool opt_endinfo,using_udf_functions,low_priority_updates, locked_in_memory; bool opt_using_transactions, using_update_log, opt_warnings=0; -bool opt_local_infile=1; +my_bool opt_local_infile=1; bool volatile abort_loop,select_thread_in_use,grant_option; bool volatile ready_to_exit,shutdown_in_progress; ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */ @@ -2974,7 +2974,7 @@ static struct my_option my_long_options[] = {"local-infile", OPT_LOCAL_INFILE, "Enable/disable LOAD DATA LOCAL INFILE (takes values 1|0)", (gptr*) &opt_local_infile, (gptr*) &opt_local_infile, 0, GET_BOOL, OPT_ARG, - 0, 0, 0, 0, 0, 0}, + 1, 0, 0, 0, 0, 0}, {"log-bin", OPT_BIN_LOG, "Log queries in new binary format (for replication)", (gptr*) &opt_bin_logname, (gptr*) &opt_bin_logname, 0, GET_STR_ALLOC, @@ -3987,9 +3987,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), case 'o': protocol_version=PROTOCOL_VERSION-1; break; - case OPT_LOCAL_INFILE: - opt_local_infile= test(!argument || atoi(argument) != 0); - break; case OPT_SLAVE_SKIP_ERRORS: init_slave_skip_errors(argument); break; |