153
155
static TYPELIB compatible_mode_typelib= {array_elements(compatible_mode_names) - 1,
154
156
"", compatible_mode_names, NULL};
156
drizzled::hash_set<string> ignore_table;
158
static struct option my_long_options[] =
160
{"all", 'a', "Deprecated. Use --create-options instead.",
161
(char**) &create_options, (char**) &create_options, 0, GET_BOOL, NO_ARG, 1,
163
{"all-databases", 'A',
164
"Dump all the databases. This will be same as --databases with all databases selected.",
165
(char**) &opt_alldbs, (char**) &opt_alldbs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
167
{"all-tablespaces", 'Y',
168
"Dump all the tablespaces.",
169
(char**) &opt_alltspcs, (char**) &opt_alltspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
171
{"add-drop-database", OPT_DROP_DATABASE, "Add a 'DROP DATABASE' before each create.",
172
(char**) &opt_drop_database, (char**) &opt_drop_database, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
174
{"add-drop-table", OPT_DROP, "Add a 'drop table' before each create.",
175
(char**) &opt_drop, (char**) &opt_drop, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0,
177
{"allow-keywords", OPT_KEYWORDS,
178
"Allow creation of column names that are keywords.", (char**) &opt_keywords,
179
(char**) &opt_keywords, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
180
{"comments", 'i', "Write additional information.",
181
(char**) &opt_comments, (char**) &opt_comments, 0, GET_BOOL, NO_ARG,
183
{"compatible", OPT_COMPATIBLE,
184
"Change the dump to be compatible with a given mode. By default tables are dumped in a format optimized for MySQL. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires DRIZZLE server version 4.1.0 or higher. This option is ignored with earlier server versions.",
185
(char**) &opt_compatible_mode_str, (char**) &opt_compatible_mode_str, 0,
186
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
187
{"compact", OPT_COMPACT,
188
"Give less verbose output (useful for debugging). Disables structure comments and header/footer constructs. Enables options --skip-add-drop-table --no-set-names --skip-disable-keys --skip-add-locks",
189
(char**) &opt_compact, (char**) &opt_compact, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
191
{"complete-insert", 'c', "Use complete insert statements.",
192
(char**) &opt_complete_insert, (char**) &opt_complete_insert, 0, GET_BOOL,
193
NO_ARG, 0, 0, 0, 0, 0, 0},
194
{"compress", 'C', "Use compression in server/client protocol.",
195
(char**) &opt_compress, (char**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
197
{"create-options", OPT_CREATE_OPTIONS,
198
"Include all DRIZZLE specific create options.",
199
(char**) &create_options, (char**) &create_options, 0, GET_BOOL, NO_ARG, 1,
202
"To dump several databases. Note the difference in usage; In this case no tables are given. All name arguments are regarded as databasenames. 'USE db_name;' will be included in the output.",
203
(char**) &opt_databases, (char**) &opt_databases, 0, GET_BOOL, NO_ARG, 0, 0,
205
{"delayed-insert", OPT_DELAYED, "Insert rows with INSERT DELAYED; ",
206
(char**) &opt_delayed, (char**) &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
208
{"disable-keys", 'K',
209
"'ALTER TABLE tb_name DISABLE KEYS; and 'ALTER TABLE tb_name ENABLE KEYS; will be put in the output.", (char**) &opt_disable_keys,
210
(char**) &opt_disable_keys, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
211
{"extended-insert", 'e',
212
"Allows utilization of the new, much faster INSERT syntax.",
213
(char**) &extended_insert, (char**) &extended_insert, 0, GET_BOOL, NO_ARG,
215
{"fields-terminated-by", OPT_FTB,
216
"Fields in the textfile are terminated by ...", (char**) &fields_terminated,
217
(char**) &fields_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
218
{"fields-enclosed-by", OPT_ENC,
219
"Fields in the importfile are enclosed by ...", (char**) &enclosed,
220
(char**) &enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
221
{"fields-optionally-enclosed-by", OPT_O_ENC,
222
"Fields in the i.file are opt. enclosed by ...", (char**) &opt_enclosed,
223
(char**) &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
224
{"fields-escaped-by", OPT_ESC, "Fields in the i.file are escaped by ...",
225
(char**) &escaped, (char**) &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
226
{"flush-logs", 'F', "Flush logs file in server before starting dump. "
227
"Note that if you dump many databases at once (using the option "
228
"--databases= or --all-databases), the logs will be flushed for "
229
"each database dumped. The exception is when using --lock-all-tables "
230
"in this case the logs will be flushed only once, corresponding "
231
"to the moment all tables are locked. So if you want your dump and "
232
"the log flush to happen at the same exact moment you should use "
233
"--lock-all-tables or --flush-logs",
234
(char**) &flush_logs, (char**) &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
236
{"force", 'f', "Continue even if we get an sql-error.",
237
(char**) &ignore_errors, (char**) &ignore_errors, 0, GET_BOOL, NO_ARG,
239
{"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG,
240
NO_ARG, 0, 0, 0, 0, 0, 0},
241
{"hex-blob", OPT_HEXBLOB, "Dump binary strings (BINARY, "
242
"VARBINARY, BLOB) in hexadecimal format.",
243
(char**) &opt_hex_blob, (char**) &opt_hex_blob, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
244
{"host", 'h', "Connect to host.", (char**) ¤t_host,
245
(char**) ¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
246
{"ignore-table", OPT_IGNORE_TABLE,
247
"Do not dump the specified table. To specify more than one table to ignore, "
248
"use the directive multiple times, once for each table. Each table must "
249
"be specified with both database and table names, e.g. --ignore-table=database.table",
250
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
251
{"insert-ignore", OPT_INSERT_IGNORE, "Insert rows with INSERT IGNORE.",
252
(char**) &opt_ignore, (char**) &opt_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
254
{"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...",
255
(char**) &lines_terminated, (char**) &lines_terminated, 0, GET_STR,
256
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
257
{"lock-all-tables", 'x', "Locks all tables across all databases. This "
258
"is achieved by taking a global read lock for the duration of the whole "
259
"dump. Automatically turns --single-transaction and --lock-tables off.",
260
(char**) &opt_lock_all_tables, (char**) &opt_lock_all_tables, 0, GET_BOOL, NO_ARG,
262
{"mysql", 'm', N_("Use MySQL Protocol."),
263
(char**) &opt_mysql, (char**) &opt_mysql, 0, GET_BOOL, NO_ARG, 1, 0, 0,
265
{"no-autocommit", OPT_AUTOCOMMIT,
266
"Wrap tables with autocommit/commit statements.",
267
(char**) &opt_autocommit, (char**) &opt_autocommit, 0, GET_BOOL, NO_ARG,
269
{"no-create-db", 'n',
270
"'CREATE DATABASE IF NOT EXISTS db_name;' will not be put in the output. The above line will be added otherwise, if --databases or --all-databases option was given.}.",
271
(char**) &opt_create_db, (char**) &opt_create_db, 0, GET_BOOL, NO_ARG, 0, 0,
273
{"no-create-info", 't', "Don't write table creation info.",
274
(char**) &opt_no_create_info, (char**) &opt_no_create_info, 0, GET_BOOL,
275
NO_ARG, 0, 0, 0, 0, 0, 0},
276
{"no-data", 'd', "No row information.", (char**) &opt_no_data,
277
(char**) &opt_no_data, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
278
{"no-set-names", 'N',
279
"Deprecated. Use --skip-set-charset instead.",
280
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
281
{"opt", OPT_OPTIMIZE,
282
"Same as --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys. Enabled by default, disable with --skip-opt.",
283
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
284
{"order-by-primary", OPT_ORDER_BY_PRIMARY,
285
"Sorts each table's rows by primary key, or first unique key, if such a key exists. Useful when dumping a MyISAM table to be loaded into an InnoDB table, but will make the dump itself take considerably longer.",
286
(char**) &opt_order_by_primary, (char**) &opt_order_by_primary, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
288
"Password to use when connecting to server. If password is not given it's solicited on the tty.",
289
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
290
{"port", 'p', "Port number to use for connection.",
291
0, 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
292
{"quick", 'q', "Don't buffer query, dump directly to stdout.",
293
(char**) &quick, (char**) &quick, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
294
{"quote-names",'Q', "Quote table and column names with backticks (`).",
295
(char**) &opt_quoted, (char**) &opt_quoted, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0,
297
{"replace", OPT_DRIZZLE_REPLACE_INTO, "Use REPLACE INTO instead of INSERT INTO.",
298
(char**) &opt_replace_into, (char**) &opt_replace_into, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
301
"Direct output to a given file. This option should be used in MSDOS, because it prevents new line '\\n' from being converted to '\\r\\n' (carriage return + line feed).",
302
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
303
{"routines", 'R', "Dump stored routines (functions and procedures).",
304
(char**) &opt_routines, (char**) &opt_routines, 0, GET_BOOL,
305
NO_ARG, 0, 0, 0, 0, 0, 0},
306
{"single-transaction", OPT_TRANSACTION,
307
"Creates a consistent snapshot by dumping all tables in a single "
308
"transaction. Works ONLY for tables stored in storage engines which "
309
"support multiversioning (currently only InnoDB does); the dump is NOT "
310
"guaranteed to be consistent for other storage engines. "
311
"While a --single-transaction dump is in process, to ensure a valid "
312
"dump file (correct table contents), no other "
313
"connection should use the following statements: ALTER TABLE, DROP "
314
"TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not "
315
"isolated from them. Option automatically turns off --lock-tables.",
316
(char**) &opt_single_transaction, (char**) &opt_single_transaction, 0,
317
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
318
{"dump-date", OPT_DUMP_DATE, "Put a dump date to the end of the output.",
319
(char**) &opt_dump_date, (char**) &opt_dump_date, 0,
320
GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
321
{"skip-opt", OPT_SKIP_OPTIMIZATION,
322
"Disable --opt. Disables --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys.",
323
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
325
"Creates tab separated textfile for each table to given path. (creates .sql and .txt files). NOTE: This only works if drizzledump is run on the same machine as the drizzled daemon.",
326
(char**) &path, (char**) &path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
327
{"tables", OPT_TABLES, "Overrides option --databases (-B).",
328
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
329
{"show-progress-size", OPT_SHOW_PROGRESS_SIZE, N_("Number of rows before each output progress report (requires --verbose)."),
330
(char**) &show_progress_size, (char**) &show_progress_size, 0, GET_UINT32, REQUIRED_ARG,
331
10000, 0, 0, 0, 0, 0},
332
{"user", 'u', "User for login if not current user.",
333
(char**) ¤t_user, (char**) ¤t_user, 0, GET_STR, REQUIRED_ARG,
335
{"verbose", 'v', "Print info about the various stages.",
336
(char**) &verbose, (char**) &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
337
{"version",'V', "Output version information and exit.", 0, 0, 0,
338
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
339
{"where", 'w', "Dump only selected records; QUOTES mandatory!",
340
(char**) &where, (char**) &where, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
341
{"xml", 'X', "Dump a database as well formed XML.", 0, 0, 0, GET_NO_ARG,
342
NO_ARG, 0, 0, 0, 0, 0, 0},
343
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
346
static const char *load_default_groups[]= { "drizzledump","client",0 };
158
boost::unordered_set<string> ignore_table;
348
160
static void maybe_exit(int error);
349
161
static void die(int error, const char* reason, ...);
2821
2444
int main(int argc, char **argv)
2824
2449
MY_INIT("drizzledump");
2825
2450
drizzle_result_st result;
2452
po::options_description commandline_options("Options used only in command line");
2453
commandline_options.add_options()
2454
("all-databases,A", po::value<bool>(&opt_alldbs)->default_value(false)->zero_tokens(),
2455
"Dump all the databases. This will be same as --databases with all databases selected.")
2456
("all-tablespaces,Y", po::value<bool>(&opt_alltspcs)->default_value(false)->zero_tokens(),
2457
"Dump all the tablespaces.")
2458
("complete-insert,c", po::value<bool>(&opt_complete_insert)->default_value(false)->zero_tokens(),
2459
"Use complete insert statements.")
2460
("compress,C", po::value<bool>(&opt_compress)->default_value(false)->zero_tokens(),
2461
"Use compression in server/client protocol.")
2462
("flush-logs,F", po::value<bool>(&flush_logs)->default_value(false)->zero_tokens(),
2463
"Flush logs file in server before starting dump. Note that if you dump many databases at once (using the option --databases= or --all-databases), the logs will be flushed for each database dumped. The exception is when using --lock-all-tables in this case the logs will be flushed only once, corresponding to the moment all tables are locked. So if you want your dump and the log flush to happen at the same exact moment you should use --lock-all-tables or --flush-logs")
2464
("force,f", po::value<bool>(&ignore_errors)->default_value(false)->zero_tokens(),
2465
"Continue even if we get an sql-error.")
2466
("help,?", "Display this help message and exit.")
2467
("lock-all-tables,x", po::value<bool>(&opt_lock_all_tables)->default_value(false)->zero_tokens(),
2468
"Locks all tables across all databases. This is achieved by taking a global read lock for the duration of the whole dump. Automatically turns --single-transaction and --lock-tables off.")
2469
("order-by-primary", po::value<bool>(&opt_order_by_primary)->default_value(false)->zero_tokens(),
2470
"Sorts each table's rows by primary key, or first unique key, if such a key exists. Useful when dumping a MyISAM table to be loaded into an InnoDB table, but will make the dump itself take considerably longer.")
2471
("routines,R", po::value<bool>(&opt_routines)->default_value(false)->zero_tokens(),
2472
"Dump stored routines (functions and procedures).")
2473
("single-transaction", po::value<bool>(&opt_single_transaction)->default_value(false)->zero_tokens(),
2474
"Creates a consistent snapshot by dumping all tables in a single transaction. Works ONLY for tables stored in storage engines which support multiversioning (currently only InnoDB does); the dump is NOT guaranteed to be consistent for other storage engines. While a --single-transaction dump is in process, to ensure a valid dump file (correct table contents), no other connection should use the following statements: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not isolated from them. Option automatically turns off --lock-tables.")
2475
("opt", "Same as --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys. Enabled by default, disable with --skip-opt.")
2477
"Disable --opt. Disables --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys.")
2478
("tables", "Overrides option --databases (-B).")
2479
("show-progress-size", po::value<uint32_t>(&show_progress_size)->default_value(10000),
2480
N_("Number of rows before each output progress report (requires --verbose)."))
2481
("verbose,v", po::value<bool>(&verbose)->default_value(false)->zero_tokens(),
2482
"Print info about the various stages.")
2483
("version,V", "Output version information and exit.")
2484
("xml,X", "Dump a database as well formed XML.")
2485
("skip-comments", "Turn off Comments")
2486
("skip-create", "Turn off create-options")
2487
("skip-extended-insert", "Turn off extended-insert")
2488
("skip-dump-date", "Turn off dump-date")
2489
("no-defaults", "Do not read from the configuration files")
2492
po::options_description dump_options("Options specific to the drizzle client");
2493
dump_options.add_options()
2494
("add-drop-database", po::value<bool>(&opt_drop_database)->default_value(false)->zero_tokens(),
2495
"Add a 'DROP DATABASE' before each create.")
2496
("add-drop-table", po::value<bool>(&opt_drop)->default_value(true)->zero_tokens(),
2497
"Add a 'drop table' before each create.")
2498
("allow-keywords", po::value<bool>(&opt_keywords)->default_value(false)->zero_tokens(),
2499
"Allow creation of column names that are keywords.")
2500
("comments,i", po::value<bool>(&opt_comments)->default_value(true)->zero_tokens(),
2501
"Write additional information.")
2502
("compatible", po::value<string>(&opt_compatible_mode_str)->default_value(""),
2503
"Change the dump to be compatible with a given mode. By default tables are dumped in a format optimized for MySQL. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires DRIZZLE server version 4.1.0 or higher. This option is ignored with earlier server versions.")
2504
("compact", po::value<bool>(&opt_compact)->default_value(false)->zero_tokens(),
2505
"Give less verbose output (useful for debugging). Disables structure comments and header/footer constructs. Enables options --skip-add-drop-table --no-set-names --skip-disable-keys --skip-add-locks")
2506
("create-options", po::value<bool>(&create_options)->default_value(true)->zero_tokens(),
2507
"Include all DRIZZLE specific create options.")
2508
("dump-date", po::value<bool>(&opt_dump_date)->default_value(true)->zero_tokens(),
2509
"Put a dump date to the end of the output.")
2510
("databases,B", po::value<bool>(&opt_databases)->default_value(false)->zero_tokens(),
2511
"To dump several databases. Note the difference in usage; In this case no tables are given. All name arguments are regarded as databasenames. 'USE db_name;' will be included in the output.")
2512
("delayed-insert", po::value<bool>(&opt_delayed)->default_value(false)->zero_tokens(),
2513
"Insert rows with INSERT DELAYED; ")
2514
("disable-keys,K", po::value<bool>(&opt_disable_keys)->default_value(true)->zero_tokens(),
2515
"'ALTER TABLE tb_name DISABLE KEYS; and 'ALTER TABLE tb_name ENABLE KEYS; will be put in the output.")
2516
("extended-insert,e", po::value<bool>(&extended_insert)->default_value(true)->zero_tokens(),
2517
"Allows utilization of the new, much faster INSERT syntax.")
2518
("fields-terminated-by", po::value<string>(&fields_terminated)->default_value(""),
2519
"Fields in the textfile are terminated by ...")
2520
("fields-enclosed-by", po::value<string>(&enclosed)->default_value(""),
2521
"Fields in the importfile are enclosed by ...")
2522
("fields-optionally-enclosed-by", po::value<string>(&opt_enclosed)->default_value(""),
2523
"Fields in the i.file are opt. enclosed by ...")
2524
("fields-escaped-by", po::value<string>(&escaped)->default_value(""),
2525
"Fields in the i.file are escaped by ...")
2526
("hex-blob", po::value<bool>(&opt_hex_blob)->default_value(false)->zero_tokens(),
2527
"Dump binary strings (BINARY, VARBINARY, BLOB) in hexadecimal format.")
2528
("ignore-table", po::value<string>(),
2529
"Do not dump the specified table. To specify more than one table to ignore, use the directive multiple times, once for each table. Each table must be specified with both database and table names, e.g. --ignore-table=database.table")
2530
("insert-ignore", po::value<bool>(&opt_ignore)->default_value(false)->zero_tokens(),
2531
"Insert rows with INSERT IGNORE.")
2532
("lines-terminated-by", po::value<string>(&lines_terminated)->default_value(""),
2533
"Lines in the i.file are terminated by ...")
2534
("no-autocommit", po::value<bool>(&opt_autocommit)->default_value(false)->zero_tokens(),
2535
"Wrap tables with autocommit/commit statements.")
2536
("no-create-db,n", po::value<bool>(&opt_create_db)->default_value(false)->zero_tokens(),
2537
"'CREATE DATABASE IF NOT EXISTS db_name;' will not be put in the output. The above line will be added otherwise, if --databases or --all-databases option was given.}.")
2538
("no-create-info,t", po::value<bool>(&opt_no_create_info)->default_value(false)->zero_tokens(),
2539
"Don't write table creation info.")
2540
("no-data,d", po::value<bool>(&opt_no_data)->default_value(false)->zero_tokens(),
2541
"No row information.")
2542
("no-set-names,N", "Deprecated. Use --skip-set-charset instead.")
2543
("set-charset", po::value<bool>(&opt_set_charset)->default_value(false)->zero_tokens(),
2545
("quick,q", po::value<bool>(&quick)->default_value(true)->zero_tokens(),
2546
"Don't buffer query, dump directly to stdout.")
2547
("quote-names,Q", po::value<bool>(&opt_quoted)->default_value(true)->zero_tokens(),
2548
"Quote table and column names with backticks (`).")
2549
("replace", po::value<bool>(&opt_replace_into)->default_value(false)->zero_tokens(),
2550
"Use REPLACE INTO instead of INSERT INTO.")
2551
("result-file,r", po::value<string>(),
2552
"Direct output to a given file. This option should be used in MSDOS, because it prevents new line '\\n' from being converted to '\\r\\n' (carriage return + line feed).")
2553
("tab,T", po::value<string>(&path)->default_value(""),
2554
"Creates tab separated textfile for each table to given path. (creates .sql and .txt files). NOTE: This only works if drizzledump is run on the same machine as the drizzled daemon.")
2555
("where,w", po::value<string>(&where)->default_value(""),
2556
"Dump only selected records; QUOTES mandatory!")
2559
po::options_description client_options("Options specific to the client");
2560
client_options.add_options()
2561
("host,h", po::value<string>(¤t_host)->default_value("localhost"),
2563
("mysql,m", po::value<bool>(&opt_mysql)->default_value(true)->zero_tokens(),
2564
N_("Use MySQL Protocol."))
2565
("password,P", po::value<string>(&password)->default_value(PASSWORD_SENTINEL),
2566
"Password to use when connecting to server. If password is not given it's solicited on the tty.")
2567
("port,p", po::value<uint32_t>(&opt_drizzle_port)->default_value(0),
2568
"Port number to use for connection.")
2569
("user,u", po::value<string>(¤t_user)->default_value(""),
2570
"User for login if not current user.")
2571
("protocol",po::value<string>(),
2572
"The protocol of connection (tcp,socket,pipe,memory).")
2575
po::options_description hidden_options("Hidden Options");
2576
hidden_options.add_options()
2577
("database-used", po::value<vector<string> >(), "Used to select the database")
2578
("Table-used", po::value<vector<string> >(), "Used to select the tables")
2581
po::options_description all_options("Allowed Options + Hidden Options");
2582
all_options.add(commandline_options).add(dump_options).add(client_options).add(hidden_options);
2584
po::options_description long_options("Allowed Options");
2585
long_options.add(commandline_options).add(dump_options).add(client_options);
2587
std::string system_config_dir_dump(SYSCONFDIR);
2588
system_config_dir_dump.append("/drizzle/drizzledump.cnf");
2590
std::string system_config_dir_client(SYSCONFDIR);
2591
system_config_dir_client.append("/drizzle/client.cnf");
2593
std::string user_config_dir((getenv("XDG_CONFIG_HOME")? getenv("XDG_CONFIG_HOME"):"~/.config"));
2595
po::positional_options_description p;
2596
p.add("database-used", 1);
2597
p.add("Table-used",-1);
2827
2599
compatible_mode_normal_str[0]= 0;
2829
exit_code= get_options(&argc, &argv);
2601
md_result_file= stdout;
2603
po::variables_map vm;
2605
po::store(po::command_line_parser(argc, argv).options(all_options).
2606
positional(p).extra_parser(parse_password_arg).run(), vm);
2608
if (! vm.count("no-defaults"))
2610
std::string user_config_dir_dump(user_config_dir);
2611
user_config_dir_dump.append("/drizzle/drizzledump.cnf");
2613
std::string user_config_dir_client(user_config_dir);
2614
user_config_dir_client.append("/drizzle/client.cnf");
2616
ifstream user_dump_ifs(user_config_dir_dump.c_str());
2617
po::store(parse_config_file(user_dump_ifs, dump_options), vm);
2619
ifstream user_client_ifs(user_config_dir_client.c_str());
2620
po::store(parse_config_file(user_client_ifs, client_options), vm);
2622
ifstream system_dump_ifs(system_config_dir_dump.c_str());
2623
po::store(parse_config_file(system_dump_ifs, dump_options), vm);
2625
ifstream system_client_ifs(system_config_dir_client.c_str());
2626
po::store(parse_config_file(system_client_ifs, client_options), vm);
2631
if ( ! vm.count("database-used") && ! vm.count("Table-used") && ! opt_alldbs && path.empty())
2633
printf(_("Usage: %s [OPTIONS] database [tables]\n"), internal::my_progname);
2634
printf(_("OR %s [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]\n"),
2635
internal::my_progname);
2636
printf(_("OR %s [OPTIONS] --all-databases [OPTIONS]\n"), internal::my_progname);
2640
if (vm.count("port"))
2642
/* If the port number is > 65535 it is not a valid port
2643
* This also helps with potential data loss casting unsigned long to a
2646
if (opt_drizzle_port > 65535)
2648
fprintf(stderr, _("Value supplied for port is not valid.\n"));
2653
if(vm.count("password"))
2655
if (!opt_password.empty())
2656
opt_password.erase();
2657
if (password == PASSWORD_SENTINEL)
2663
opt_password= password;
2664
tty_password= false;
2672
if (vm.count("result-file"))
2674
if (!(md_result_file= fopen(vm["result-file"].as<string>().c_str(), "w")))
2678
if (vm.count("no-set-names"))
2685
opt_disable_keys= 0;
2687
if (vm["tab"].as<string>().length() >= FN_REFLEN)
2690
This check is made because the some the file functions below
2691
have FN_REFLEN sized stack allocated buffers and will cause
2692
a crash even if the input destination buffer is large enough
2695
fprintf(stderr, _("Input filename too long: %s"), vm["tab"].as<string>().c_str());
2696
exit(EXIT_ARGUMENT_INVALID);
2700
if (vm.count("version"))
2702
printf(_("%s Drizzle %s libdrizzle %s, for %s-%s (%s)\n"), internal::my_progname,
2703
VERSION, drizzle_version(), HOST_VENDOR, HOST_OS, HOST_CPU);
2706
if (vm.count("xml"))
2709
extended_insert= opt_drop= opt_disable_keys= opt_autocommit= opt_create_db= 0;
2712
if (vm.count("help"))
2714
printf(_("%s Drizzle %s libdrizzle %s, for %s-%s (%s)\n"), internal::my_progname,
2715
VERSION, drizzle_version(), HOST_VENDOR, HOST_OS, HOST_CPU);
2717
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"));
2718
puts(_("Dumps definitions and data from a Drizzle database server"));
2719
cout << long_options;
2720
printf(_("Usage: %s [OPTIONS] database [tables]\n"), internal::my_progname);
2721
printf(_("OR %s [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]\n"),
2722
internal::my_progname);
2723
printf(_("OR %s [OPTIONS] --all-databases [OPTIONS]\n"), internal::my_progname);
2727
if (vm.count("skip-opt"))
2729
extended_insert= opt_drop= quick= create_options= 0;
2730
opt_disable_keys= opt_set_charset= 0;
2735
opt_comments= opt_drop= opt_disable_keys= 0;
2739
if (vm.count("opt"))
2741
extended_insert= opt_drop= quick= create_options= 1;
2742
opt_disable_keys= opt_set_charset= 1;
2745
if (vm.count("tables"))
2747
opt_databases= false;
2750
if (vm.count("ignore-table"))
2752
if (!strchr(vm["ignore-table"].as<string>().c_str(), '.'))
2754
fprintf(stderr, _("Illegal use of option --ignore-table=<database>.<table>\n"));
2755
exit(EXIT_ARGUMENT_INVALID);
2757
string tmpptr(vm["ignore-table"].as<string>());
2758
ignore_table.insert(tmpptr);
2761
if (vm.count("skip-create"))
2763
opt_create_db= opt_no_create_info= create_options= false;
2766
if (vm.count("skip-comments"))
2768
opt_comments= false;
2771
if (vm.count("skip-extended-insert"))
2773
extended_insert= false;
2776
if (vm.count("skip-dump-date"))
2778
opt_dump_date= false;
2781
if (! opt_compatible_mode_str.empty())
2784
char *end= compatible_mode_normal_str;
2791
opt_compatible_mode= find_set(&compatible_mode_typelib,
2792
opt_compatible_mode_str.c_str(), opt_compatible_mode_str.length(),
2793
&err_ptr, &error_len);
2796
strncpy(buff, err_ptr, min((uint32_t)sizeof(buff), error_len+1));
2797
fprintf(stderr, _("Invalid mode to --compatible: %s\n"), buff);
2798
exit(EXIT_ARGUMENT_INVALID);
2800
mode= opt_compatible_mode;
2801
for (i= 0, mode= opt_compatible_mode; mode; mode>>= 1, i++)
2805
uint32_t len = strlen(compatible_mode_names[i]);
2806
end= strcpy(end, compatible_mode_names[i]) + len;
2807
end= strcpy(end, ",")+1;
2810
if (end!=compatible_mode_normal_str)
2815
exit_code= get_options();
2832
2818
free_resources();