22
22
** WARRANTY: None, expressed, impressed, implied
24
24
** STATUS: Public domain
25
** Adapted and optimized for MySQL by
26
** Michael Widenius, Sinisa Milivojevic, Jani Tolonen
27
** -w --where added 9/10/98 by Jim Faucette
28
** slave code by David Saez Padros <david@ols.es>
29
** master/autocommit code by Brian Aker <brian@tangent.org>
31
** Andrei Errapart <andreie@no.spam.ee>
32
** Tõnu Samuel <tonu@please.do.not.remove.this.spam.ee>
33
** XML by Gary Huntress <ghuntress@mediaone.net> 10/10/01, cleaned up
34
** and adapted to mysqldump 05/11/01 by Jani Tolonen
35
** Added --single-transaction option 06/06/2002 by Peter Zaitsev
36
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
39
27
#define DUMP_VERSION "10.13"
41
#include <my_global.h>
31
#include "client_priv.h"
33
#include <mysys/my_sys.h>
34
#include <mystrings/m_string.h>
35
#include <mystrings/m_ctype.h>
36
#include <mysys/hash.h>
46
37
#include <stdarg.h>
48
#include "client_priv.h"
49
#include "drizzle_version.h"
50
#include "mysqld_error.h"
39
#include <drizzled/error.h>
45
#define EX_DRIZZLEERR 2
56
46
#define EX_CONSCHECK 3
58
48
#define EX_EOF 5 /* ferror for output file was got */
74
64
#define IGNORE_DATA 0x01 /* don't dump data for this table */
75
65
#define IGNORE_INSERT_DELAYED 0x02 /* table doesn't support INSERT DELAYED */
77
static void add_load_option(DYNAMIC_STRING *str, const char *option,
78
const char *option_value);
79
static ulong find_set(TYPELIB *lib, const char *x, uint length,
67
static void add_load_option(string &str, const char *option,
68
const char *option_value);
69
static uint32_t find_set(TYPELIB *lib, const char *x, uint length,
80
70
char **err_pos, uint *err_len);
82
static void field_escape(DYNAMIC_STRING* in, const char *from);
72
static void field_escape(string &in, const char *from);
83
73
static bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0,
84
74
quick= 1, extended_insert= 1,
85
75
lock_tables=1,ignore_errors=0,flush_logs=0,flush_privileges=0,
98
88
opt_include_master_host_port= 0,
100
90
opt_alltspcs=0, opt_notspcs= 0;
101
static bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0;
102
static ulong opt_max_allowed_packet, opt_net_buffer_length;
103
static MYSQL mysql_connection,*mysql=0;
104
static DYNAMIC_STRING insert_pat;
91
static bool debug_info_flag= 0, debug_check_flag= 0;
92
static uint32_t opt_max_allowed_packet, opt_net_buffer_length;
93
static DRIZZLE drizzle_connection,*drizzle=0;
94
static string insert_pat;
105
95
static char *opt_password=0,*current_user=0,
106
96
*current_host=0,*path=0,*fields_terminated=0,
107
97
*lines_terminated=0, *enclosed=0, *opt_enclosed=0, *escaped=0,
113
103
static char compatible_mode_normal_str[255];
114
104
/* Server supports character_set_results session variable? */
115
105
static bool server_supports_switching_charsets= true;
116
static ulong opt_compatible_mode= 0;
117
#define MYSQL_OPT_MASTER_DATA_EFFECTIVE_SQL 1
118
#define MYSQL_OPT_MASTER_DATA_COMMENTED_SQL 2
119
#define MYSQL_OPT_SLAVE_DATA_EFFECTIVE_SQL 1
120
#define MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL 2
121
static uint opt_mysql_port= 0, opt_master_data;
106
static uint32_t opt_compatible_mode= 0;
107
#define DRIZZLE_OPT_MASTER_DATA_EFFECTIVE_SQL 1
108
#define DRIZZLE_OPT_MASTER_DATA_COMMENTED_SQL 2
109
#define DRIZZLE_OPT_SLAVE_DATA_EFFECTIVE_SQL 1
110
#define DRIZZLE_OPT_SLAVE_DATA_COMMENTED_SQL 2
111
static uint opt_drizzle_port= 0, opt_master_data;
122
112
static uint opt_slave_data;
123
113
static uint my_end_arg;
124
114
static int first_error=0;
125
static DYNAMIC_STRING extended_row;
115
static string extended_row;
126
116
FILE *md_result_file= 0;
127
117
FILE *stderror_file=0;
129
static uint opt_protocol= MYSQL_PROTOCOL_TCP;
132
Dynamic_string wrapper functions. In this file use these
133
wrappers, they will terminate the process if there is
134
an allocation failure.
136
static void init_dynamic_string_checked(DYNAMIC_STRING *str, const char *init_str,
137
uint init_alloc, uint alloc_increment);
138
static void dynstr_append_checked(DYNAMIC_STRING* dest, const char* src);
139
static void dynstr_set_checked(DYNAMIC_STRING *str, const char *init_str);
140
static void dynstr_append_mem_checked(DYNAMIC_STRING *str, const char *append,
142
static void dynstr_realloc_checked(DYNAMIC_STRING *str, ulong additional_size);
144
120
Constant for detection of default value of default_charset.
145
If default_charset is equal to mysql_universal_client_charset, then
121
If default_charset is equal to drizzle_universal_client_charset, then
146
122
it is the default value which assigned at the very beginning of main().
148
static const char *mysql_universal_client_charset=
149
MYSQL_UNIVERSAL_CLIENT_CHARSET;
124
static const char *drizzle_universal_client_charset=
125
DRIZZLE_UNIVERSAL_CLIENT_CHARSET;
150
126
static char *default_charset;
151
static CHARSET_INFO *charset_info= &my_charset_latin1;
152
const char *default_dbug_option="d:t:o,/tmp/mysqldump.trace";
127
static const CHARSET_INFO *charset_info= &my_charset_utf8_general_ci;
128
const char *default_dbug_option="d:t:o,/tmp/drizzledump.trace";
153
129
/* have we seen any VIEWs during table scanning? */
154
130
bool seen_views= 0;
155
131
const char *compatible_mode_names[]=
202
178
{"allow-keywords", OPT_KEYWORDS,
203
179
"Allow creation of column names that are keywords.", (char**) &opt_keywords,
204
180
(char**) &opt_keywords, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
205
{"apply-slave-statements", OPT_MYSQLDUMP_SLAVE_APPLY,
181
{"apply-slave-statements", OPT_DRIZZLEDUMP_SLAVE_APPLY,
206
182
"Adds 'STOP SLAVE' prior to 'CHANGE MASTER' and 'START SLAVE' to bottom of dump.",
207
183
(char**) &opt_slave_apply, (char**) &opt_slave_apply, 0, GET_BOOL, NO_ARG,
208
184
0, 0, 0, 0, 0, 0},
213
189
(char**) &opt_comments, (char**) &opt_comments, 0, GET_BOOL, NO_ARG,
214
190
1, 0, 0, 0, 0, 0},
215
191
{"compatible", OPT_COMPATIBLE,
216
"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 MySQL server version 4.1.0 or higher. This option is ignored with earlier server versions.",
192
"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.",
217
193
(char**) &opt_compatible_mode_str, (char**) &opt_compatible_mode_str, 0,
218
194
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
219
195
{"compact", OPT_COMPACT,
227
203
(char**) &opt_compress, (char**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
229
205
{"create-options", OPT_CREATE_OPTIONS,
230
"Include all MySQL specific create options.",
206
"Include all DRIZZLE specific create options.",
231
207
(char**) &create_options, (char**) &create_options, 0, GET_BOOL, NO_ARG, 1,
233
209
{"databases", 'B',
253
229
{"disable-keys", 'K',
254
230
"'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put in the output.", (char**) &opt_disable_keys,
255
231
(char**) &opt_disable_keys, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
256
{"dump-slave", OPT_MYSQLDUMP_SLAVE_DATA,
232
{"dump-slave", OPT_DRIZZLEDUMP_SLAVE_DATA,
257
233
"This causes the binary log position and filename of the master to be "
258
234
"appended to the dumped data output. Setting the value to 1, will print"
259
235
"it as a CHANGE MASTER command in the dumped data output; if equal"
265
241
"any action on logs will happen at the exact moment of the dump."
266
242
"Option automatically turns --lock-tables off.",
267
243
(char**) &opt_slave_data, (char**) &opt_slave_data, 0,
268
GET_UINT, OPT_ARG, 0, 0, MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL, 0, 0, 0},
244
GET_UINT, OPT_ARG, 0, 0, DRIZZLE_OPT_SLAVE_DATA_COMMENTED_SQL, 0, 0, 0},
269
245
{"events", 'E', "Dump events.",
270
246
(char**) &opt_events, (char**) &opt_events, 0, GET_BOOL,
271
247
NO_ARG, 0, 0, 0, 0, 0, 0},
299
275
(char**) &flush_logs, (char**) &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
301
277
{"flush-privileges", OPT_ESC, "Emit a FLUSH PRIVILEGES statement "
302
"after dumping the mysql database. This option should be used any "
303
"time the dump contains the mysql database and any other database "
304
"that depends on the data in the mysql database for proper restore. ",
278
"after dumping the DRIZZLE database. This option should be used any "
279
"time the dump contains the DRIZZLE database and any other database "
280
"that depends on the data in the DRIZZLE database for proper restore. ",
305
281
(char**) &flush_privileges, (char**) &flush_privileges, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
307
283
{"force", 'f', "Continue even if we get an sql-error.",
319
295
"use the directive multiple times, once for each table. Each table must "
320
296
"be specified with both database and table names, e.g. --ignore-table=database.table",
321
297
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
322
{"include-master-host-port", OPT_MYSQLDUMP_INCLUDE_MASTER_HOST_PORT,
298
{"include-master-host-port", OPT_DRIZZLEDUMP_INCLUDE_MASTER_HOST_PORT,
323
299
"Adds 'MASTER_HOST=<host>, MASTER_PORT=<port>' to 'CHANGE MASTER TO..' in dump produced with --dump-slave.",
324
300
(char**) &opt_include_master_host_port,
325
301
(char**) &opt_include_master_host_port,
352
328
"any action on logs will happen at the exact moment of the dump."
353
329
"Option automatically turns --lock-tables off.",
354
330
(char**) &opt_master_data, (char**) &opt_master_data, 0,
355
GET_UINT, OPT_ARG, 0, 0, MYSQL_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0},
331
GET_UINT, OPT_ARG, 0, 0, DRIZZLE_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0},
356
332
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, "",
357
333
(char**) &opt_max_allowed_packet, (char**) &opt_max_allowed_packet, 0,
358
334
GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096,
386
362
{"password", 'p',
387
363
"Password to use when connecting to server. If password is not given it's solicited on the tty.",
388
364
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
389
{"port", 'P', "Port number to use for connection.", (char**) &opt_mysql_port,
390
(char**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0,
365
{"port", 'P', "Port number to use for connection.", (char**) &opt_drizzle_port,
366
(char**) &opt_drizzle_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0,
392
368
{"quick", 'q', "Don't buffer query, dump directly to stdout.",
393
369
(char**) &quick, (char**) &quick, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
394
370
{"quote-names",'Q', "Quote table and column names with backticks (`).",
395
371
(char**) &opt_quoted, (char**) &opt_quoted, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0,
397
{"replace", OPT_MYSQL_REPLACE_INTO, "Use REPLACE INTO instead of INSERT INTO.",
373
{"replace", OPT_DRIZZLE_REPLACE_INTO, "Use REPLACE INTO instead of INSERT INTO.",
398
374
(char**) &opt_replace_into, (char**) &opt_replace_into, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
400
376
{"result-file", 'r',
457
433
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
460
static const char *load_default_groups[]= { "mysqldump","client",0 };
436
static const char *load_default_groups[]= { "drizzledump","client",0 };
462
438
static void maybe_exit(int error);
463
439
static void die(int error, const char* reason, ...);
464
440
static void maybe_die(int error, const char* reason, ...);
465
441
static void write_header(FILE *sql_file, char *db_name);
466
static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row,
442
static void print_value(FILE *file, DRIZZLE_RES *result, DRIZZLE_ROW row,
467
443
const char *prefix,const char *name,
468
444
int string_value);
469
445
static int dump_selected_tables(char *db, char **table_names, int tables);
574
544
if (opt_comments)
576
546
fprintf(sql_file,
577
"-- MySQL dump %s Distrib %s, for %s (%s)\n--\n",
578
DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
547
"-- DRIZZLE dump %s Distrib %s, for %s (%s)\n--\n",
548
DUMP_VERSION, drizzle_get_client_info(),
549
SYSTEM_TYPE, MACHINE_TYPE);
579
550
fprintf(sql_file, "-- Host: %s Database: %s\n",
580
551
current_host ? current_host : "localhost", db_name ? db_name :
582
553
fputs("-- ------------------------------------------------------\n",
584
555
fprintf(sql_file, "-- Server version\t%s\n",
585
mysql_get_server_info(&mysql_connection));
556
drizzle_get_server_info(&drizzle_connection));
587
558
if (opt_set_charset)
588
559
fprintf(sql_file,
589
"\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;"
590
"\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;"
591
560
"\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;"
592
561
"\n/*!40101 SET NAMES %s */;\n",default_charset);
721
688
case (int) OPT_MASTER_DATA:
722
689
if (!argument) /* work like in old versions */
723
opt_master_data= MYSQL_OPT_MASTER_DATA_EFFECTIVE_SQL;
690
opt_master_data= DRIZZLE_OPT_MASTER_DATA_EFFECTIVE_SQL;
725
case (int) OPT_MYSQLDUMP_SLAVE_DATA:
692
case (int) OPT_DRIZZLEDUMP_SLAVE_DATA:
726
693
if (!argument) /* work like in old versions */
727
opt_slave_data= MYSQL_OPT_SLAVE_DATA_EFFECTIVE_SQL;
694
opt_slave_data= DRIZZLE_OPT_SLAVE_DATA_EFFECTIVE_SQL;
729
696
case (int) OPT_OPTIMIZE:
730
697
extended_insert= opt_drop= opt_lock= quick= create_options=
760
727
char *end= compatible_mode_normal_str;
766
733
opt_set_charset= 0;
767
734
opt_compatible_mode_str= argument;
768
735
opt_compatible_mode= find_set(&compatible_mode_typelib,
769
736
argument, strlen(argument),
737
&err_ptr, &error_len);
773
strmake(buff, err_ptr, min(sizeof(buff), err_len));
740
strmake(buff, err_ptr, min((uint32_t)sizeof(buff), error_len));
774
741
fprintf(stderr, "Invalid mode to --compatible: %s\n", buff);
800
767
static int get_options(int *argc, char ***argv)
803
MYSQL_PARAMETERS *mysql_params= mysql_get_parameters();
770
const DRIZZLE_PARAMETERS *drizzle_params= drizzle_get_parameters();
805
opt_max_allowed_packet= *mysql_params->p_max_allowed_packet;
806
opt_net_buffer_length= *mysql_params->p_net_buffer_length;
772
opt_max_allowed_packet= *drizzle_params->p_max_allowed_packet;
773
opt_net_buffer_length= *drizzle_params->p_net_buffer_length;
808
775
md_result_file= stdout;
809
776
load_defaults("my",load_default_groups,argc,argv);
816
783
/* Don't copy internal log tables */
817
784
if (my_hash_insert(&ignore_table,
818
(uchar*) my_strdup("mysql.apply_status", MYF(MY_WME))) ||
819
my_hash_insert(&ignore_table,
820
(uchar*) my_strdup("mysql.schema", MYF(MY_WME))) ||
821
my_hash_insert(&ignore_table,
822
(uchar*) my_strdup("mysql.general_log", MYF(MY_WME))) ||
823
my_hash_insert(&ignore_table,
824
(uchar*) my_strdup("mysql.slow_log", MYF(MY_WME))) ||
825
my_hash_insert(&ignore_table,
826
(uchar*) my_strdup("mysql.online_backup", MYF(MY_WME))) ||
827
my_hash_insert(&ignore_table,
828
(uchar*) my_strdup("mysql.online_backup_progress", MYF(MY_WME))))
785
(unsigned char*) my_strdup("mysql.apply_status", MYF(MY_WME))) ||
786
my_hash_insert(&ignore_table,
787
(unsigned char*) my_strdup("mysql.schema", MYF(MY_WME))) ||
788
my_hash_insert(&ignore_table,
789
(unsigned char*) my_strdup("mysql.general_log", MYF(MY_WME))) ||
790
my_hash_insert(&ignore_table,
791
(unsigned char*) my_strdup("mysql.slow_log", MYF(MY_WME))) ||
792
my_hash_insert(&ignore_table,
793
(unsigned char*) my_strdup("mysql.online_backup", MYF(MY_WME))) ||
794
my_hash_insert(&ignore_table,
795
(unsigned char*) my_strdup("mysql.online_backup_progress", MYF(MY_WME))))
831
798
if ((ho_error= handle_options(argc, argv, my_long_options, get_one_option)))
832
799
return(ho_error);
834
*mysql_params->p_max_allowed_packet= opt_max_allowed_packet;
835
*mysql_params->p_net_buffer_length= opt_net_buffer_length;
801
*drizzle_params->p_max_allowed_packet= opt_max_allowed_packet;
802
*drizzle_params->p_net_buffer_length= opt_net_buffer_length;
836
803
if (debug_info_flag)
837
804
my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
838
805
if (debug_check_flag)
896
863
if (tty_password)
897
opt_password=get_tty_password(NullS);
864
opt_password=get_tty_password(NULL);
899
866
} /* get_options */
903
** DB_error -- prints mysql error message and exits the program.
870
** DB_error -- prints DRIZZLE error message and exits the program.
905
static void DB_error(MYSQL *mysql_arg, const char *when)
872
static void DB_error(DRIZZLE *drizzle_arg, const char *when)
908
maybe_die(EX_MYSQLERR, "Got error: %d: %s %s",
909
mysql_errno(mysql_arg), mysql_error(mysql_arg), when);
875
maybe_die(EX_DRIZZLEERR, "Got error: %d: %s %s",
876
drizzle_errno(drizzle_arg), drizzle_error(drizzle_arg), when);
994
static int mysql_query_with_error_report(MYSQL *mysql_con, MYSQL_RES **res,
961
static int drizzle_query_with_error_report(DRIZZLE *drizzle_con, DRIZZLE_RES **res,
995
962
const char *query)
997
if (mysql_query(mysql_con, query) ||
998
(res && !((*res)= mysql_store_result(mysql_con))))
964
if (drizzle_query(drizzle_con, query) ||
965
(res && !((*res)= drizzle_store_result(drizzle_con))))
1000
maybe_die(EX_MYSQLERR, "Couldn't execute '%s': %s (%d)",
1001
query, mysql_error(mysql_con), mysql_errno(mysql_con));
967
maybe_die(EX_DRIZZLEERR, "Couldn't execute '%s': %s (%d)",
968
query, drizzle_error(drizzle_con), drizzle_errno(drizzle_con));
1061
1028
if (md_result_file && md_result_file != stdout)
1062
1029
my_fclose(md_result_file, MYF(0));
1063
my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR));
1064
1031
if (hash_inited(&ignore_table))
1065
1032
hash_free(&ignore_table);
1066
if (extended_insert)
1067
dynstr_free(&extended_row);
1068
if (insert_pat_inited)
1069
dynstr_free(&insert_pat);
1070
1033
if (defaults_argv)
1071
1034
free_defaults(defaults_argv);
1072
1035
my_end(my_end_arg);
1098
1061
verbose_msg("-- Connecting to %s...\n", host ? host : "localhost");
1099
mysql_init(&mysql_connection);
1062
drizzle_create(&drizzle_connection);
1100
1063
if (opt_compress)
1101
mysql_options(&mysql_connection,MYSQL_OPT_COMPRESS,NullS);
1103
mysql_options(&mysql_connection,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
1104
mysql_options(&mysql_connection, MYSQL_SET_CHARSET_NAME, default_charset);
1105
if (!(mysql= mysql_real_connect(&mysql_connection,host,user,passwd,
1106
NULL,opt_mysql_port, NULL,
1064
drizzle_options(&drizzle_connection,DRIZZLE_OPT_COMPRESS,NULL);
1065
if (!(drizzle= drizzle_connect(&drizzle_connection,host,user,passwd,
1066
NULL,opt_drizzle_port, NULL,
1109
DB_error(&mysql_connection, "when trying to connect");
1069
DB_error(&drizzle_connection, "when trying to connect");
1112
if (mysql_get_server_version(&mysql_connection) < 40100)
1072
if (drizzle_get_server_version(&drizzle_connection) < 40100)
1114
1074
/* Don't dump SET NAMES with a pre-4.1 server (bug#7997). */
1115
1075
opt_set_charset= 0;
1148
1108
if (!(tmp=(char*) my_malloc(length*2+1, MYF(MY_WME))))
1149
die(EX_MYSQLERR, "Couldn't allocate memory");
1109
die(EX_DRIZZLEERR, "Couldn't allocate memory");
1151
mysql_real_escape_string(&mysql_connection, tmp, pos, length);
1111
drizzle_escape_string(tmp, pos, length);
1152
1112
fputc('\'', file);
1153
1113
fputs(tmp, file);
1154
1114
fputc('\'', file);
1155
1115
check_io(file);
1156
my_free(tmp, MYF(MY_WME));
1158
1118
} /* unescape */
1161
1121
static bool test_if_special_chars(const char *str)
1163
#if MYSQL_VERSION_ID >= 32300
1164
1123
for ( ; *str ; str++)
1165
1124
if (!my_isvar(charset_info,*str) && *str != '$')
1169
1127
} /* test_if_special_chars */
1218
1176
Quote \, _, ' and % characters
1220
Note: Because MySQL uses the C escape syntax in strings
1178
Note: Because DRIZZLE uses the C escape syntax in strings
1221
1179
(for example, '\n' to represent newline), you must double
1222
1180
any '\' that you use in your LIKE strings. For example, to
1223
1181
search for '\n', specify it as '\\n'. To search for '\', specify
1334
1292
va_start(arg_list, first_attribute_name);
1335
1293
attribute_name= first_attribute_name;
1336
while (attribute_name != NullS)
1294
while (attribute_name != NULL)
1338
1296
attribute_value= va_arg(arg_list, char *);
1339
assert(attribute_value != NullS);
1297
assert(attribute_value != NULL);
1341
1299
fputc(' ', xml_file);
1342
1300
fputs(attribute_name, xml_file);
1409
1367
static void print_xml_row(FILE *xml_file, const char *row_name,
1410
MYSQL_RES *tableRes, MYSQL_ROW *row)
1368
DRIZZLE_RES *tableRes, DRIZZLE_ROW *row)
1414
uint32_t *lengths= mysql_fetch_lengths(tableRes);
1371
DRIZZLE_FIELD *field;
1372
uint32_t *lengths= drizzle_fetch_lengths(tableRes);
1416
1374
fprintf(xml_file, "\t\t<%s", row_name);
1417
1375
check_io(xml_file);
1418
mysql_field_seek(tableRes, 0);
1419
for (i= 0; (field= mysql_fetch_field(tableRes)); i++)
1376
drizzle_field_seek(tableRes, 0);
1377
for (i= 0; (field= drizzle_fetch_field(tableRes)); i++)
1446
1404
Print hex value for blob data.
1449
static void print_blob_as_hex(FILE *output_file, const char *str, ulong len)
1407
static void print_blob_as_hex(FILE *output_file, const char *str, uint32_t len)
1451
1409
/* sakaik got the idea to to provide blob's in hex notation. */
1452
1410
const char *ptr= str, *end= ptr + len;
1453
1411
for (; ptr < end ; ptr++)
1454
fprintf(output_file, "%02X", *((uchar *)ptr));
1412
fprintf(output_file, "%02X", *((unsigned char *)ptr));
1455
1413
check_io(output_file);
1522
1474
if (opt_order_by_primary)
1524
my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
1525
1477
order_by= primary_key_fields(result_table);
1528
if (!opt_xml && !mysql_query_with_error_report(mysql, 0, query_buff))
1480
if (!opt_xml && !drizzle_query_with_error_report(drizzle, 0, query_buff))
1530
1482
/* using SHOW CREATE statement */
1531
1483
if (!opt_no_create_info)
1533
1485
/* Make an sql-file, if path was given iow. option -T was given */
1534
1486
char buff[20+FN_REFLEN];
1487
const DRIZZLE_FIELD *field;
1537
1489
snprintf(buff, sizeof(buff), "show create table %s", result_table);
1539
if (switch_character_set_results(mysql, "binary") ||
1540
mysql_query_with_error_report(mysql, &result, buff) ||
1541
switch_character_set_results(mysql, default_charset))
1491
if (switch_character_set_results(drizzle, "binary") ||
1492
drizzle_query_with_error_report(drizzle, &result, buff) ||
1493
switch_character_set_results(drizzle, default_charset))
1577
1529
verbose_msg("-- It's a view, create dummy table for view\n");
1579
1531
/* save "show create" statement for later */
1580
if ((row= mysql_fetch_row(result)) && (scv_buff=row[1]))
1532
if ((row= drizzle_fetch_row(result)) && (scv_buff=row[1]))
1581
1533
scv_buff= my_strdup(scv_buff, MYF(0));
1583
mysql_free_result(result);
1535
drizzle_free_result(result);
1586
1538
Create a table with the same name as the view and with columns of
1596
1548
snprintf(query_buff, sizeof(query_buff),
1597
1549
"SHOW FIELDS FROM %s", result_table);
1598
if (switch_character_set_results(mysql, "binary") ||
1599
mysql_query_with_error_report(mysql, &result, query_buff) ||
1600
switch_character_set_results(mysql, default_charset))
1550
if (switch_character_set_results(drizzle, "binary") ||
1551
drizzle_query_with_error_report(drizzle, &result, query_buff) ||
1552
switch_character_set_results(drizzle, default_charset))
1603
1555
View references invalid or privileged table/col/fun (err 1356),
1605
1557
a comment with the view's 'show create' statement. (Bug #17371)
1608
if (mysql_errno(mysql) == ER_VIEW_INVALID)
1560
if (drizzle_errno(drizzle) == ER_VIEW_INVALID)
1609
1561
fprintf(sql_file, "\n-- failed on view %s: %s\n\n", result_table, scv_buff ? scv_buff : "");
1611
my_free(scv_buff, MYF(MY_ALLOW_ZERO_PTR));
1616
my_free(scv_buff, MYF(MY_ALLOW_ZERO_PTR));
1618
if (mysql_num_rows(result))
1570
if (drizzle_num_rows(result))
1641
1591
there should be a _trailing_ comma.
1644
row= mysql_fetch_row(result);
1594
row= drizzle_fetch_row(result);
1646
1596
fprintf(sql_file, " %s %s", quote_name(row[0], name_buff, 0),
1649
while((row= mysql_fetch_row(result)))
1599
while((row= drizzle_fetch_row(result)))
1651
1601
/* col name, col type */
1652
1602
fprintf(sql_file, ",\n %s %s",
1653
1603
quote_name(row[0], name_buff, 0), row[1]);
1657
"SET character_set_client = @saved_cs_client;\n");
1605
fprintf(sql_file, "\n) */;\n");
1659
1606
check_io(sql_file);
1662
mysql_free_result(result);
1609
drizzle_free_result(result);
1665
1612
my_fclose(sql_file, MYF(MY_WME));
1671
row= mysql_fetch_row(result);
1618
row= drizzle_fetch_row(result);
1674
"SET @saved_cs_client = @@character_set_client;\n"
1675
"SET character_set_client = utf8;\n"
1677
"SET character_set_client = @saved_cs_client;\n",
1620
fprintf(sql_file, "%s;\n", row[1]);
1680
1622
check_io(sql_file);
1681
mysql_free_result(result);
1623
drizzle_free_result(result);
1683
1625
snprintf(query_buff, sizeof(query_buff), "show fields from %s",
1685
if (mysql_query_with_error_report(mysql, &result, query_buff))
1627
if (drizzle_query_with_error_report(drizzle, &result, query_buff))
1688
1630
my_fclose(sql_file, MYF(MY_WME));
1698
1640
if (write_data)
1700
1642
if (opt_replace_into)
1701
dynstr_append_checked(&insert_pat, "REPLACE ");
1643
insert_pat.append("REPLACE ");
1703
dynstr_append_checked(&insert_pat, "INSERT ");
1704
dynstr_append_checked(&insert_pat, insert_option);
1705
dynstr_append_checked(&insert_pat, "INTO ");
1706
dynstr_append_checked(&insert_pat, opt_quoted_table);
1645
insert_pat.append("INSERT ");
1646
insert_pat.append(insert_option);
1647
insert_pat.append("INTO ");
1648
insert_pat.append(opt_quoted_table);
1707
1649
if (complete_insert)
1709
dynstr_append_checked(&insert_pat, " (");
1651
insert_pat.append(" (");
1713
dynstr_append_checked(&insert_pat, " VALUES ");
1655
insert_pat.append(" VALUES ");
1714
1656
if (!extended_insert)
1715
dynstr_append_checked(&insert_pat, "(");
1657
insert_pat.append("(");
1719
while ((row= mysql_fetch_row(result)))
1661
while ((row= drizzle_fetch_row(result)))
1721
1663
if (complete_insert)
1725
dynstr_append_checked(&insert_pat, ", ");
1667
insert_pat.append(", ");
1728
dynstr_append_checked(&insert_pat,
1729
quote_name(row[SHOW_FIELDNAME], name_buff, 0));
1670
insert_pat.append(quote_name(row[SHOW_FIELDNAME], name_buff, 0));
1732
num_fields= mysql_num_rows(result);
1733
mysql_free_result(result);
1673
num_fields= drizzle_num_rows(result);
1674
drizzle_free_result(result);
1737
1678
verbose_msg("%s: Warning: Can't set SQL_QUOTE_SHOW_CREATE option (%s)\n",
1738
my_progname, mysql_error(mysql));
1679
my_progname, drizzle_error(drizzle));
1740
1681
snprintf(query_buff, sizeof(query_buff), "show fields from %s",
1742
if (mysql_query_with_error_report(mysql, &result, query_buff))
1683
if (drizzle_query_with_error_report(drizzle, &result, query_buff))
1745
1686
/* Make an sql-file, if path was given iow. option -T was given */
1760
1701
fprintf(sql_file, "CREATE TABLE %s (\n", result_table);
1762
1703
print_xml_tag(sql_file, "\t", "\n", "table_structure", "name=", table,
1764
1705
check_io(sql_file);
1767
1708
if (write_data)
1769
1710
if (opt_replace_into)
1770
dynstr_append_checked(&insert_pat, "REPLACE ");
1711
insert_pat.append("REPLACE ");
1772
dynstr_append_checked(&insert_pat, "INSERT ");
1773
dynstr_append_checked(&insert_pat, insert_option);
1774
dynstr_append_checked(&insert_pat, "INTO ");
1775
dynstr_append_checked(&insert_pat, result_table);
1713
insert_pat.append("INSERT ");
1714
insert_pat.append(insert_option);
1715
insert_pat.append("INTO ");
1716
insert_pat.append(result_table);
1776
1717
if (complete_insert)
1777
dynstr_append_checked(&insert_pat, " (");
1718
insert_pat.append(" (");
1780
dynstr_append_checked(&insert_pat, " VALUES ");
1721
insert_pat.append(" VALUES ");
1781
1722
if (!extended_insert)
1782
dynstr_append_checked(&insert_pat, "(");
1723
insert_pat.append("(");
1786
while ((row= mysql_fetch_row(result)))
1727
while ((row= drizzle_fetch_row(result)))
1788
uint32_t *lengths= mysql_fetch_lengths(result);
1729
uint32_t *lengths= drizzle_fetch_lengths(result);
1791
1732
if (!opt_xml && !opt_no_create_info)
1828
1768
check_io(sql_file);
1831
num_fields= mysql_num_rows(result);
1832
mysql_free_result(result);
1771
num_fields= drizzle_num_rows(result);
1772
drizzle_free_result(result);
1833
1773
if (!opt_no_create_info)
1835
1775
/* Make an sql-file, if path was given iow. option -T was given */
1836
1776
char buff[20+FN_REFLEN];
1837
1777
uint keynr,primary_key;
1838
1778
snprintf(buff, sizeof(buff), "show keys from %s", result_table);
1839
if (mysql_query_with_error_report(mysql, &result, buff))
1779
if (drizzle_query_with_error_report(drizzle, &result, buff))
1841
if (mysql_errno(mysql) == ER_WRONG_OBJECT)
1781
if (drizzle_errno(drizzle) == ER_WRONG_OBJECT)
1843
1783
/* it is VIEW */
1844
1784
fputs("\t\t<options Comment=\"view\" />\n", sql_file);
1845
1785
goto continue_xml;
1847
1787
fprintf(stderr, "%s: Can't get keys for table %s (%s)\n",
1848
my_progname, result_table, mysql_error(mysql));
1788
my_progname, result_table, drizzle_error(drizzle));
1850
1790
my_fclose(sql_file, MYF(MY_WME));
1918
1858
snprintf(buff, sizeof(buff), "show table status like %s",
1919
1859
quote_for_like(table, show_name_buff));
1921
if (mysql_query_with_error_report(mysql, &result, buff))
1861
if (drizzle_query_with_error_report(drizzle, &result, buff))
1923
if (mysql_errno(mysql) != ER_PARSE_ERROR)
1924
{ /* If old MySQL version */
1863
if (drizzle_errno(drizzle) != ER_PARSE_ERROR)
1864
{ /* If old DRIZZLE version */
1925
1865
verbose_msg("-- Warning: Couldn't get status information for " \
1926
"table %s (%s)\n", result_table,mysql_error(mysql));
1866
"table %s (%s)\n", result_table,drizzle_error(drizzle));
1929
else if (!(row= mysql_fetch_row(result)))
1869
else if (!(row= drizzle_fetch_row(result)))
1931
1871
fprintf(stderr,
1932
1872
"Error: Couldn't read status information for table %s (%s)\n",
1933
result_table,mysql_error(mysql));
1873
result_table,drizzle_error(drizzle));
2055
1995
char ignore_flag;
2056
1996
char buf[200], table_buff[NAME_LEN+3];
2057
DYNAMIC_STRING query_string;
1997
string query_string;
2058
1998
char table_type[NAME_LEN];
2059
1999
char *result_table, table_buff2[NAME_LEN*2+3], *opt_quoted_table;
2061
ulong rownr, row_break, total_length, init_length;
2001
uint32_t rownr, row_break, total_length, init_length;
2062
2002
uint num_fields;
2004
DRIZZLE_FIELD *field;
2108
2048
discarding SHOW CREATE EVENT statements generation. The myslq.event
2109
2049
table data should be skipped too.
2111
if (!opt_events && !my_strcasecmp(&my_charset_latin1, db, "mysql") &&
2112
!my_strcasecmp(&my_charset_latin1, table, "event"))
2051
if (!opt_events && !my_strcasecmp(&my_charset_utf8_general_ci, db, "mysql") &&
2052
!my_strcasecmp(&my_charset_utf8_general_ci, table, "event"))
2114
2054
verbose_msg("-- Skipping data table mysql.event, --skip-events was used\n");
2130
2071
Convert the path to native os format
2131
2072
and resolve to the full filepath.
2133
convert_dirname(tmp_path,path,NullS);
2074
convert_dirname(tmp_path,path,NULL);
2134
2075
my_load_path(tmp_path, tmp_path, NULL);
2135
2076
fn_format(filename, table, tmp_path, ".txt", MYF(MY_UNPACK_FILENAME));
2143
2084
/* now build the query string */
2145
dynstr_append_checked(&query_string, "SELECT * INTO OUTFILE '");
2146
dynstr_append_checked(&query_string, filename);
2147
dynstr_append_checked(&query_string, "'");
2086
query_string.append( "SELECT * INTO OUTFILE '");
2087
query_string.append( filename);
2088
query_string.append( "'");
2149
2090
if (fields_terminated || enclosed || opt_enclosed || escaped)
2150
dynstr_append_checked(&query_string, " FIELDS");
2091
query_string.append( " FIELDS");
2152
add_load_option(&query_string, " TERMINATED BY ", fields_terminated);
2153
add_load_option(&query_string, " ENCLOSED BY ", enclosed);
2154
add_load_option(&query_string, " OPTIONALLY ENCLOSED BY ", opt_enclosed);
2155
add_load_option(&query_string, " ESCAPED BY ", escaped);
2156
add_load_option(&query_string, " LINES TERMINATED BY ", lines_terminated);
2093
add_load_option(query_string, " TERMINATED BY ", fields_terminated);
2094
add_load_option(query_string, " ENCLOSED BY ", enclosed);
2095
add_load_option(query_string, " OPTIONALLY ENCLOSED BY ", opt_enclosed);
2096
add_load_option(query_string, " ESCAPED BY ", escaped);
2097
add_load_option(query_string, " LINES TERMINATED BY ", lines_terminated);
2158
dynstr_append_checked(&query_string, " FROM ");
2159
dynstr_append_checked(&query_string, result_table);
2099
query_string.append( " FROM ");
2100
query_string.append( result_table);
2163
dynstr_append_checked(&query_string, " WHERE ");
2164
dynstr_append_checked(&query_string, where);
2104
query_string.append( " WHERE ");
2105
query_string.append( where);
2169
dynstr_append_checked(&query_string, " ORDER BY ");
2170
dynstr_append_checked(&query_string, order_by);
2110
query_string.append( " ORDER BY ");
2111
query_string.append( order_by);
2173
if (mysql_real_query(mysql, query_string.str, query_string.length))
2114
if (drizzle_real_query(drizzle, query_string.c_str(), query_string.length()))
2175
DB_error(mysql, "when executing 'SELECT INTO OUTFILE'");
2176
dynstr_free(&query_string);
2116
DB_error(drizzle, "when executing 'SELECT INTO OUTFILE'");
2207
2147
fprintf(md_result_file, "-- ORDER BY: %s\n", order_by);
2208
2148
check_io(md_result_file);
2210
dynstr_append_checked(&query_string, " ORDER BY ");
2211
dynstr_append_checked(&query_string, order_by);
2150
query_string.append( " ORDER BY ");
2151
query_string.append( order_by);
2214
2154
if (!opt_xml && !opt_compact)
2216
2156
fputs("\n", md_result_file);
2217
2157
check_io(md_result_file);
2219
if (mysql_query_with_error_report(mysql, 0, query_string.str))
2159
if (drizzle_query_with_error_report(drizzle, 0, query_string.c_str()))
2221
DB_error(mysql, "when retrieving data from server");
2161
DB_error(drizzle, "when retrieving data from server");
2225
res=mysql_use_result(mysql);
2165
res=drizzle_use_result(drizzle);
2227
res=mysql_store_result(mysql);
2167
res=drizzle_store_result(drizzle);
2230
DB_error(mysql, "when retrieving data from server");
2170
DB_error(drizzle, "when retrieving data from server");
2234
2174
verbose_msg("-- Retrieving rows...\n");
2235
if (mysql_num_fields(res) != num_fields)
2175
if (drizzle_num_fields(res) != num_fields)
2237
2177
fprintf(stderr,"%s: Error in field count for table: %s ! Aborting.\n",
2238
2178
my_progname, result_table);
2256
2196
total_length= opt_net_buffer_length; /* Force row break */
2259
init_length=(uint) insert_pat.length+4;
2199
init_length=(uint) insert_pat.length()+4;
2261
2201
print_xml_tag(md_result_file, "\t", "\n", "table_data", "name=", table,
2263
2203
if (opt_autocommit)
2265
2205
fprintf(md_result_file, "set autocommit=0;\n");
2266
2206
check_io(md_result_file);
2269
while ((row= mysql_fetch_row(res)))
2209
while ((row= drizzle_fetch_row(res)))
2272
uint32_t *lengths= mysql_fetch_lengths(res);
2212
uint32_t *lengths= drizzle_fetch_lengths(res);
2274
2214
if (!extended_insert && !opt_xml)
2276
fputs(insert_pat.str,md_result_file);
2216
fputs(insert_pat.c_str(),md_result_file);
2277
2217
check_io(md_result_file);
2279
mysql_field_seek(res,0);
2219
drizzle_field_seek(res,0);
2300
2240
we'll dump in hex only BLOB columns.
2302
2242
is_blob= (opt_hex_blob && field->charsetnr == 63 &&
2303
(field->type == MYSQL_TYPE_STRING ||
2304
field->type == MYSQL_TYPE_VARCHAR ||
2305
field->type == MYSQL_TYPE_BLOB)) ? 1 : 0;
2243
(field->type == DRIZZLE_TYPE_VARCHAR ||
2244
field->type == DRIZZLE_TYPE_BLOB)) ? 1 : 0;
2306
2245
if (extended_insert && !opt_xml)
2309
dynstr_set_checked(&extended_row,"(");
2311
dynstr_append_checked(&extended_row,",");
2250
extended_row.append(",");
2317
if (!IS_NUM_FIELD(field))
2256
if (!(field->type & NUM_FLAG))
2320
2259
"length * 2 + 2" is OK for both HEX and non-HEX modes:
2324
2263
plus 2 bytes for leading and trailing '\'' characters.
2325
2264
Also we need to reserve 1 byte for terminating '\0'.
2327
dynstr_realloc_checked(&extended_row,length * 2 + 2 + 1);
2266
char * tmp_str= (char *)malloc(length * 2 + 2 + 1);
2267
memset(tmp_str, '\0', length * 2 + 2 + 1);
2328
2268
if (opt_hex_blob && is_blob)
2330
dynstr_append_checked(&extended_row, "0x");
2331
extended_row.length+= mysql_hex_string(extended_row.str +
2332
extended_row.length,
2334
assert(extended_row.length+1 <= extended_row.max_length);
2335
/* mysql_hex_string() already terminated string by '\0' */
2336
assert(extended_row.str[extended_row.length] == '\0');
2270
extended_row.append("0x");
2271
drizzle_hex_string(tmp_str, row[i], length);
2272
extended_row.append(tmp_str);
2340
dynstr_append_checked(&extended_row,"'");
2341
extended_row.length +=
2342
mysql_real_escape_string(&mysql_connection,
2343
&extended_row.str[extended_row.length],
2345
extended_row.str[extended_row.length]='\0';
2346
dynstr_append_checked(&extended_row,"'");
2276
extended_row.append("'");
2277
drizzle_escape_string(tmp_str,
2279
extended_row.append(tmp_str);
2280
extended_row.append("'");
2352
2287
char *ptr= row[i];
2353
2288
if (my_isalpha(charset_info, *ptr) || (*ptr == '-' &&
2354
2289
my_isalpha(charset_info, ptr[1])))
2355
dynstr_append_checked(&extended_row, "NULL");
2290
extended_row.append( "NULL");
2358
dynstr_append_checked(&extended_row, ptr);
2293
extended_row.append( ptr);
2363
dynstr_append_checked(&extended_row,"''");
2298
extended_row.append("''");
2366
dynstr_append_checked(&extended_row,"NULL");
2301
extended_row.append("NULL");
2383
2318
/* Define xsi:type="xs:hexBinary" for hex encoded data */
2384
2319
print_xml_tag(md_result_file, "\t\t", "", "field", "name=",
2385
field->name, "xsi:type=", "xs:hexBinary", NullS);
2320
field->name, "xsi:type=", "xs:hexBinary", NULL);
2386
2321
print_blob_as_hex(md_result_file, row[i], length);
2390
2325
print_xml_tag(md_result_file, "\t\t", "", "field", "name=",
2391
field->name, NullS);
2392
2327
print_quoted_xml(md_result_file, row[i], length);
2394
2329
fputs("</field>\n", md_result_file);
2442
2377
if (extended_insert)
2445
dynstr_append_checked(&extended_row,")");
2446
row_length= 2 + extended_row.length;
2379
uint32_t row_length;
2380
extended_row.append(")");
2381
row_length= 2 + extended_row.length();
2447
2382
if (total_length + row_length < opt_net_buffer_length)
2449
2384
total_length+= row_length;
2450
2385
fputc(',',md_result_file); /* Always row break */
2451
fputs(extended_row.str,md_result_file);
2386
fputs(extended_row.c_str(),md_result_file);
2456
2391
fputs(";\n", md_result_file);
2457
2392
row_break=1; /* This is first row */
2459
fputs(insert_pat.str,md_result_file);
2460
fputs(extended_row.str,md_result_file);
2394
fputs(insert_pat.c_str(),md_result_file);
2395
fputs(extended_row.c_str(),md_result_file);
2461
2396
total_length= row_length+init_length;
2463
2398
check_io(md_result_file);
2522
2455
static char *getTableName(int reset)
2524
static MYSQL_RES *res= NULL;
2457
static DRIZZLE_RES *res= NULL;
2529
if (!(res= mysql_list_tables(mysql,NullS)))
2462
if (!(res= drizzle_list_tables(drizzle,NULL)))
2532
if ((row= mysql_fetch_row(res)))
2465
if ((row= drizzle_fetch_row(res)))
2533
2466
return((char*) row[0]);
2536
mysql_data_seek(res,0); /* We want to read again */
2469
drizzle_data_seek(res,0); /* We want to read again */
2539
mysql_free_result(res);
2472
drizzle_free_result(res);
2634
2567
static int init_dumping(char *database, int init_func(char*))
2636
if (mysql_get_server_version(mysql) >= 50003 &&
2637
!my_strcasecmp(&my_charset_latin1, database, "information_schema"))
2569
if (drizzle_get_server_version(drizzle) >= 50003 &&
2570
!my_strcasecmp(&my_charset_utf8_general_ci, database, "information_schema"))
2640
if (mysql_select_db(mysql, database))
2573
if (drizzle_select_db(drizzle, database))
2642
DB_error(mysql, "when selecting the database");
2575
DB_error(drizzle, "when selecting the database");
2643
2576
return 1; /* If --force */
2645
2578
if (!path && !opt_xml)
2685
2618
char table_buff[NAME_LEN*2+3];
2686
2619
char hash_key[2*NAME_LEN+2]; /* "db.tablename" */
2687
2620
char *afterdot;
2688
int using_mysql_db= my_strcasecmp(&my_charset_latin1, database, "mysql");
2691
afterdot= strmov(hash_key, database);
2621
int using_mysql_db= my_strcasecmp(&my_charset_utf8_general_ci, database, "mysql");
2624
afterdot= my_stpcpy(hash_key, database);
2692
2625
*afterdot++= '.';
2694
2627
if (init_dumping(database, init_dumping_tables))
2697
print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NullS);
2630
print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NULL);
2698
2631
if (lock_tables)
2700
DYNAMIC_STRING query;
2701
init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024);
2634
query= "LOCK TABLES ";
2702
2635
for (numrows= 0 ; (table= getTableName(1)) ; )
2704
char *end= strmov(afterdot, table);
2705
if (include_table((uchar*) hash_key,end - hash_key))
2637
char *end= my_stpcpy(afterdot, table);
2638
if (include_table((unsigned char*) hash_key,end - hash_key))
2708
dynstr_append_checked(&query, quote_name(table, table_buff, 1));
2709
dynstr_append_checked(&query, " READ /*!32311 LOCAL */,");
2641
query.append( quote_name(table, table_buff, 1));
2642
query.append( " READ /*!32311 LOCAL */,");
2712
if (numrows && mysql_real_query(mysql, query.str, query.length-1))
2713
DB_error(mysql, "when using LOCK TABLES");
2645
if (numrows && drizzle_real_query(drizzle, query.c_str(), query.length()-1))
2646
DB_error(drizzle, "when using LOCK TABLES");
2714
2647
/* We shall continue here, if --force was given */
2715
dynstr_free(&query);
2717
2650
if (flush_logs)
2719
if (mysql_refresh(mysql, REFRESH_LOG))
2720
DB_error(mysql, "when doing refresh");
2652
if (drizzle_refresh(drizzle, REFRESH_LOG))
2653
DB_error(drizzle, "when doing refresh");
2721
2654
/* We shall continue here, if --force was given */
2723
2656
while ((table= getTableName(0)))
2725
char *end= strmov(afterdot, table);
2726
if (include_table((uchar*) hash_key, end - hash_key))
2658
char *end= my_stpcpy(afterdot, table);
2659
if (include_table((unsigned char*) hash_key, end - hash_key))
2728
2661
dump_table(table,database);
2729
my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
2771
2704
snprintf(query, sizeof(query), "SHOW TABLES LIKE %s",
2772
2705
quote_for_like(old_table_name, show_name_buff));
2774
if (mysql_query_with_error_report(mysql, 0, query))
2707
if (drizzle_query_with_error_report(drizzle, 0, query))
2777
if ((table_res= mysql_store_result(mysql)))
2710
if ((table_res= drizzle_store_result(drizzle)))
2779
uint64_t num_rows= mysql_num_rows(table_res);
2712
uint64_t num_rows= drizzle_num_rows(table_res);
2780
2713
if (num_rows > 0)
2782
2715
uint32_t *lengths;
2784
2717
Return first row
2785
2718
TODO: Return all matching rows
2787
row= mysql_fetch_row(table_res);
2788
lengths= mysql_fetch_lengths(table_res);
2720
row= drizzle_fetch_row(table_res);
2721
lengths= drizzle_fetch_lengths(table_res);
2789
2722
name= strmake_root(root, row[0], lengths[0]);
2791
mysql_free_result(table_res);
2724
drizzle_free_result(table_res);
2809
2742
if (!(dump_tables= pos= (char**) alloc_root(&root, tables * sizeof(char *))))
2810
2743
die(EX_EOM, "alloc_root failure.");
2812
init_dynamic_string_checked(&lock_tables_query, "LOCK TABLES ", 256, 1024);
2745
lock_tables_query= "LOCK TABLES ";
2813
2746
for (; tables > 0 ; tables-- , table_names++)
2815
2748
/* the table name passed on commandline may be wrong case */
2818
2751
/* Add found table name to lock_tables_query */
2819
2752
if (lock_tables)
2821
dynstr_append_checked(&lock_tables_query, quote_name(*pos, table_buff, 1));
2822
dynstr_append_checked(&lock_tables_query, " READ /*!32311 LOCAL */,");
2754
lock_tables_query.append( quote_name(*pos, table_buff, 1));
2755
lock_tables_query.append( " READ /*!32311 LOCAL */,");
2839
2771
if (lock_tables)
2841
if (mysql_real_query(mysql, lock_tables_query.str,
2842
lock_tables_query.length-1))
2773
if (drizzle_real_query(drizzle, lock_tables_query.c_str(),
2774
lock_tables_query.length()-1))
2844
2776
if (!ignore_errors)
2846
dynstr_free(&lock_tables_query);
2847
2778
free_root(&root, MYF(0));
2849
DB_error(mysql, "when doing LOCK TABLES");
2780
DB_error(drizzle, "when doing LOCK TABLES");
2850
2781
/* We shall countinue here, if --force was given */
2853
dynstr_free(&lock_tables_query);
2854
2784
if (flush_logs)
2856
if (mysql_refresh(mysql, REFRESH_LOG))
2786
if (drizzle_refresh(drizzle, REFRESH_LOG))
2858
2788
if (!ignore_errors)
2859
2789
free_root(&root, MYF(0));
2860
DB_error(mysql, "when doing refresh");
2790
DB_error(drizzle, "when doing refresh");
2862
2792
/* We shall countinue here, if --force was given */
2865
print_xml_tag(md_result_file, "", "\n", "database", "name=", db, NullS);
2795
print_xml_tag(md_result_file, "", "\n", "database", "name=", db, NULL);
2867
2797
/* Dump each selected table */
2868
2798
for (pos= dump_tables; pos < end; pos++)
2869
2799
dump_table(*pos, db);
2871
2801
free_root(&root, MYF(0));
2872
my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
2877
2807
check_io(md_result_file);
2879
2809
if (lock_tables)
2880
VOID(mysql_query_with_error_report(mysql, 0, "UNLOCK TABLES"));
2810
drizzle_query_with_error_report(drizzle, 0, "UNLOCK TABLES");
2882
2812
} /* dump_selected_tables */
2885
static int do_show_master_status(MYSQL *mysql_con)
2815
static int do_show_master_status(DRIZZLE *drizzle_con)
2818
DRIZZLE_RES *master;
2889
2819
const char *comment_prefix=
2890
(opt_master_data == MYSQL_OPT_MASTER_DATA_COMMENTED_SQL) ? "-- " : "";
2891
if (mysql_query_with_error_report(mysql_con, &master, "SHOW MASTER STATUS"))
2820
(opt_master_data == DRIZZLE_OPT_MASTER_DATA_COMMENTED_SQL) ? "-- " : "";
2821
if (drizzle_query_with_error_report(drizzle_con, &master, "SHOW MASTER STATUS"))
2897
row= mysql_fetch_row(master);
2827
row= drizzle_fetch_row(master);
2898
2828
if (row && row[0] && row[1])
2900
2830
/* SHOW MASTER STATUS reports file and position */
2912
2842
/* SHOW MASTER STATUS reports nothing and --force is not enabled */
2913
2843
my_printf_error(0, "Error: Binlogging on server not active",
2915
mysql_free_result(master);
2916
maybe_exit(EX_MYSQLERR);
2845
drizzle_free_result(master);
2846
maybe_exit(EX_DRIZZLEERR);
2919
mysql_free_result(master);
2849
drizzle_free_result(master);
2924
static int do_stop_slave_sql(MYSQL *mysql_con)
2854
static int do_stop_slave_sql(DRIZZLE *drizzle_con)
2927
2857
/* We need to check if the slave sql is running in the first place */
2928
if (mysql_query_with_error_report(mysql_con, &slave, "SHOW SLAVE STATUS"))
2858
if (drizzle_query_with_error_report(drizzle_con, &slave, "SHOW SLAVE STATUS"))
2932
MYSQL_ROW row= mysql_fetch_row(slave);
2862
DRIZZLE_ROW row= drizzle_fetch_row(slave);
2933
2863
if (row && row[11])
2935
2865
/* if SLAVE SQL is not running, we don't stop it */
2936
2866
if (!strcmp(row[11],"No"))
2938
mysql_free_result(slave);
2868
drizzle_free_result(slave);
2939
2869
/* Silently assume that they don't have the slave running */
2944
mysql_free_result(slave);
2874
drizzle_free_result(slave);
2946
2876
/* now, stop slave if running */
2947
if (mysql_query_with_error_report(mysql_con, 0, "STOP SLAVE SQL_THREAD"))
2877
if (drizzle_query_with_error_report(drizzle_con, 0, "STOP SLAVE SQL_THREAD"))
2971
static int do_show_slave_status(MYSQL *mysql_con)
2901
static int do_show_slave_status(DRIZZLE *drizzle_con)
2974
2904
const char *comment_prefix=
2975
(opt_slave_data == MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL) ? "-- " : "";
2976
if (mysql_query_with_error_report(mysql_con, &slave, "SHOW SLAVE STATUS"))
2905
(opt_slave_data == DRIZZLE_OPT_SLAVE_DATA_COMMENTED_SQL) ? "-- " : "";
2906
if (drizzle_query_with_error_report(drizzle_con, &slave, "SHOW SLAVE STATUS"))
2978
2908
if (!ignore_errors)
3008
2938
check_io(md_result_file);
3010
mysql_free_result(slave);
2940
drizzle_free_result(slave);
3015
static int do_start_slave_sql(MYSQL *mysql_con)
2945
static int do_start_slave_sql(DRIZZLE *drizzle_con)
3018
2948
/* We need to check if the slave sql is stopped in the first place */
3019
if (mysql_query_with_error_report(mysql_con, &slave, "SHOW SLAVE STATUS"))
2949
if (drizzle_query_with_error_report(drizzle_con, &slave, "SHOW SLAVE STATUS"))
3023
MYSQL_ROW row= mysql_fetch_row(slave);
2953
DRIZZLE_ROW row= drizzle_fetch_row(slave);
3024
2954
if (row && row[11])
3026
2956
/* if SLAVE SQL is not running, we don't start it */
3027
2957
if (!strcmp(row[11],"Yes"))
3029
mysql_free_result(slave);
2959
drizzle_free_result(slave);
3030
2960
/* Silently assume that they don't have the slave running */
3035
mysql_free_result(slave);
2965
drizzle_free_result(slave);
3037
2967
/* now, start slave if stopped */
3038
if (mysql_query_with_error_report(mysql_con, 0, "START SLAVE"))
2968
if (drizzle_query_with_error_report(drizzle_con, 0, "START SLAVE"))
3040
2970
my_printf_error(0, "Error: Unable to start slave", MYF(0));
3056
2986
update starts between the two FLUSHes, we have that bad stall.
3059
( mysql_query_with_error_report(mysql_con, 0, "FLUSH TABLES") ||
3060
mysql_query_with_error_report(mysql_con, 0,
2989
( drizzle_query_with_error_report(drizzle_con, 0, "FLUSH TABLES") ||
2990
drizzle_query_with_error_report(drizzle_con, 0,
3061
2991
"FLUSH TABLES WITH READ LOCK") );
3065
static int do_unlock_tables(MYSQL *mysql_con)
2995
static int do_unlock_tables(DRIZZLE *drizzle_con)
3067
return mysql_query_with_error_report(mysql_con, 0, "UNLOCK TABLES");
2997
return drizzle_query_with_error_report(drizzle_con, 0, "UNLOCK TABLES");
3070
static int get_bin_log_name(MYSQL *mysql_con,
3000
static int get_bin_log_name(DRIZZLE *drizzle_con,
3071
3001
char* buff_log_name, uint buff_len)
3076
if (mysql_query(mysql_con, "SHOW MASTER STATUS") ||
3077
!(res= mysql_store_result(mysql)))
3006
if (drizzle_query(drizzle_con, "SHOW MASTER STATUS") ||
3007
!(res= drizzle_store_result(drizzle)))
3080
if (!(row= mysql_fetch_row(res)))
3010
if (!(row= drizzle_fetch_row(res)))
3082
mysql_free_result(res);
3012
drizzle_free_result(res);
3089
3019
strmake(buff_log_name, row[0], buff_len - 1);
3091
mysql_free_result(res);
3021
drizzle_free_result(res);
3095
static int purge_bin_logs_to(MYSQL *mysql_con, char* log_name)
3025
static int purge_bin_logs_to(DRIZZLE *drizzle_con, char* log_name)
3099
init_dynamic_string_checked(&str, "PURGE BINARY LOGS TO '", 1024, 1024);
3100
dynstr_append_checked(&str, log_name);
3101
dynstr_append_checked(&str, "'");
3102
err = mysql_query_with_error_report(mysql_con, 0, str.str);
3028
string str= "PURGE BINARY LOGS TO '";
3029
str.append(log_name);
3031
err = drizzle_query_with_error_report(drizzle_con, 0, str.c_str());
3108
static int start_transaction(MYSQL *mysql_con)
3036
static int start_transaction(DRIZZLE *drizzle_con)
3111
3039
We use BEGIN for old servers. --single-transaction --master-data will fail
3116
3044
need the REPEATABLE READ level (not anything lower, for example READ
3117
3045
COMMITTED would give one new consistent read per dumped table).
3119
if ((mysql_get_server_version(mysql_con) < 40100) && opt_master_data)
3047
if ((drizzle_get_server_version(drizzle_con) < 40100) && opt_master_data)
3121
3049
fprintf(stderr, "-- %s: the combination of --single-transaction and "
3122
"--master-data requires a MySQL server version of at least 4.1 "
3050
"--master-data requires a DRIZZLE server version of at least 4.1 "
3123
3051
"(current server's version is %s). %s\n",
3124
3052
ignore_errors ? "Warning" : "Error",
3125
mysql_con->server_version ? mysql_con->server_version : "unknown",
3053
drizzle_con->server_version ? drizzle_con->server_version : "unknown",
3126
3054
ignore_errors ? "Continuing due to --force, backup may not be consistent across all tables!" : "Aborting.");
3127
3055
if (!ignore_errors)
3056
exit(EX_DRIZZLEERR);
3131
return (mysql_query_with_error_report(mysql_con, 0,
3059
return (drizzle_query_with_error_report(drizzle_con, 0,
3132
3060
"SET SESSION TRANSACTION ISOLATION "
3133
3061
"LEVEL REPEATABLE READ") ||
3134
mysql_query_with_error_report(mysql_con, 0,
3062
drizzle_query_with_error_report(drizzle_con, 0,
3135
3063
"START TRANSACTION "
3136
3064
"/*!40100 WITH CONSISTENT SNAPSHOT */"));
3140
static ulong find_set(TYPELIB *lib, const char *x, uint length,
3068
static uint32_t find_set(TYPELIB *lib, const char *x, uint length,
3141
3069
char **err_pos, uint *err_len)
3143
3071
const char *end= x + length;
3146
3074
char buff[255];
3158
3086
const char *pos= start;
3161
3089
for (; pos != end && *pos != ','; pos++) ;
3162
var_len= (uint) (pos - start);
3163
strmake(buff, start, min(sizeof(buff), var_len));
3090
var_len= (uint32_t) (pos - start);
3091
strmake(buff, start, min((uint32_t)sizeof(buff), var_len));
3164
3092
find= find_type(buff, lib, var_len);
3181
3109
/* Print a value with a prefix on file */
3182
static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row,
3110
static void print_value(FILE *file, DRIZZLE_RES *result, DRIZZLE_ROW row,
3183
3111
const char *prefix, const char *name,
3184
3112
int string_value)
3187
mysql_field_seek(result, 0);
3114
DRIZZLE_FIELD *field;
3115
drizzle_field_seek(result, 0);
3189
for ( ; (field= mysql_fetch_field(result)) ; row++)
3117
for ( ; (field= drizzle_fetch_field(result)) ; row++)
3191
3119
if (!strcmp(field->name,name))
3236
3164
char result= IGNORE_NONE;
3237
3165
char buff[FN_REFLEN+80], show_name_buff[FN_REFLEN];
3238
MYSQL_RES *res= NULL;
3166
DRIZZLE_RES *res= NULL;
3242
3170
/* Check memory for quote_for_like() */
3243
3171
assert(2*sizeof(table_name) < sizeof(show_name_buff));
3244
3172
snprintf(buff, sizeof(buff), "show table status like %s",
3245
3173
quote_for_like(table_name, show_name_buff));
3246
if (mysql_query_with_error_report(mysql, &res, buff))
3174
if (drizzle_query_with_error_report(drizzle, &res, buff))
3248
if (mysql_errno(mysql) != ER_PARSE_ERROR)
3249
{ /* If old MySQL version */
3176
if (drizzle_errno(drizzle) != ER_PARSE_ERROR)
3177
{ /* If old DRIZZLE version */
3250
3178
verbose_msg("-- Warning: Couldn't get status information for "
3251
"table %s (%s)\n", table_name, mysql_error(mysql));
3179
"table %s (%s)\n", table_name, drizzle_error(drizzle));
3252
3180
return(result); /* assume table is ok */
3255
if (!(row= mysql_fetch_row(res)))
3183
if (!(row= drizzle_fetch_row(res)))
3257
3185
fprintf(stderr,
3258
3186
"Error: Couldn't read status information for table %s (%s)\n",
3259
table_name, mysql_error(mysql));
3260
mysql_free_result(res);
3187
table_name, drizzle_error(drizzle));
3188
drizzle_free_result(res);
3261
3189
return(result); /* assume table is ok */
3326
3254
snprintf(show_keys_buff, sizeof(show_keys_buff),
3327
3255
"SHOW KEYS FROM %s", table_name);
3328
if (mysql_query(mysql, show_keys_buff) ||
3329
!(res= mysql_store_result(mysql)))
3256
if (drizzle_query(drizzle, show_keys_buff) ||
3257
!(res= drizzle_store_result(drizzle)))
3331
3259
fprintf(stderr, "Warning: Couldn't read keys from table %s;"
3332
3260
" records are NOT sorted (%s)\n",
3333
table_name, mysql_error(mysql));
3261
table_name, drizzle_error(drizzle));
3334
3262
/* Don't exit, because it's better to print out unsorted records */
3341
3269
* row, and UNIQUE keys come before others. So we only need to check
3342
3270
* the first key, not all keys.
3344
if ((row= mysql_fetch_row(res)) && atoi(row[1]) == 0)
3272
if ((row= drizzle_fetch_row(res)) && atoi(row[1]) == 0)
3346
3274
/* Key is unique */
3349
3277
quoted_field= quote_name(row[4], buff, 0);
3350
3278
result_length+= strlen(quoted_field) + 1; /* + 1 for ',' or \0 */
3351
} while ((row= mysql_fetch_row(res)) && atoi(row[3]) > 1);
3279
} while ((row= drizzle_fetch_row(res)) && atoi(row[3]) > 1);
3354
3282
/* Build the ORDER BY clause result */
3358
3286
/* result (terminating \0 is already in result_length) */
3359
result= my_malloc(result_length + 10, MYF(MY_WME));
3287
result= (char *)my_malloc(result_length + 10, MYF(MY_WME));
3362
3290
fprintf(stderr, "Error: Not enough memory to store ORDER BY clause\n");
3365
mysql_data_seek(res, 0);
3366
row= mysql_fetch_row(res);
3293
drizzle_data_seek(res, 0);
3294
row= drizzle_fetch_row(res);
3367
3295
quoted_field= quote_name(row[4], buff, 0);
3368
end= strmov(result, quoted_field);
3369
while ((row= mysql_fetch_row(res)) && atoi(row[3]) > 1)
3296
end= my_stpcpy(result, quoted_field);
3297
while ((row= drizzle_fetch_row(res)) && atoi(row[3]) > 1)
3371
3299
quoted_field= quote_name(row[4], buff, 0);
3372
end= strxmov(end, ",", quoted_field, NullS);
3300
end= strxmov(end, ",", quoted_field, NULL);
3378
mysql_free_result(res);
3306
drizzle_free_result(res);
3384
The following functions are wrappers for the dynamic string functions
3385
and if they fail, the wrappers will terminate the current process.
3388
#define DYNAMIC_STR_ERROR_MSG "Couldn't perform DYNAMIC_STRING operation"
3390
static void init_dynamic_string_checked(DYNAMIC_STRING *str, const char *init_str,
3391
uint init_alloc, uint alloc_increment)
3393
if (init_dynamic_string(str, init_str, init_alloc, alloc_increment))
3394
die(EX_MYSQLERR, DYNAMIC_STR_ERROR_MSG);
3397
static void dynstr_append_checked(DYNAMIC_STRING* dest, const char* src)
3399
if (dynstr_append(dest, src))
3400
die(EX_MYSQLERR, DYNAMIC_STR_ERROR_MSG);
3403
static void dynstr_set_checked(DYNAMIC_STRING *str, const char *init_str)
3405
if (dynstr_set(str, init_str))
3406
die(EX_MYSQLERR, DYNAMIC_STR_ERROR_MSG);
3409
static void dynstr_append_mem_checked(DYNAMIC_STRING *str, const char *append,
3412
if (dynstr_append_mem(str, append, length))
3413
die(EX_MYSQLERR, DYNAMIC_STR_ERROR_MSG);
3416
static void dynstr_realloc_checked(DYNAMIC_STRING *str, ulong additional_size)
3418
if (dynstr_realloc(str, additional_size))
3419
die(EX_MYSQLERR, DYNAMIC_STR_ERROR_MSG);
3423
3312
int main(int argc, char **argv)
3442
3331
if(!(stderror_file= freopen(log_error_file, "a+", stderr)))
3444
3333
free_resources();
3334
exit(EX_DRIZZLEERR);
3449
3338
if (connect_to_db(current_host, current_user, opt_password))
3451
3340
free_resources();
3341
exit(EX_DRIZZLEERR);
3455
3344
write_header(md_result_file, *argv);
3457
if (opt_slave_data && do_stop_slave_sql(mysql))
3346
if (opt_slave_data && do_stop_slave_sql(drizzle))
3460
3349
if ((opt_lock_all_tables || opt_master_data) &&
3461
do_flush_tables_read_lock(mysql))
3350
do_flush_tables_read_lock(drizzle))
3463
if (opt_single_transaction && start_transaction(mysql))
3352
if (opt_single_transaction && start_transaction(drizzle))
3465
3354
if (opt_delete_master_logs)
3467
if (mysql_refresh(mysql, REFRESH_LOG) ||
3468
get_bin_log_name(mysql, bin_log_name, sizeof(bin_log_name)))
3356
if (drizzle_refresh(drizzle, REFRESH_LOG) ||
3357
get_bin_log_name(drizzle, bin_log_name, sizeof(bin_log_name)))
3472
3361
if (opt_lock_all_tables || opt_master_data)
3474
if (flush_logs && mysql_refresh(mysql, REFRESH_LOG))
3363
if (flush_logs && drizzle_refresh(drizzle, REFRESH_LOG))
3476
3365
flush_logs= 0; /* not anymore; that would not be sensible */
3478
3367
/* Add 'STOP SLAVE to beginning of dump */
3479
3368
if (opt_slave_apply && add_stop_slave())
3481
if (opt_master_data && do_show_master_status(mysql))
3483
if (opt_slave_data && do_show_slave_status(mysql))
3485
if (opt_single_transaction && do_unlock_tables(mysql)) /* unlock but no commit! */
3370
if (opt_master_data && do_show_master_status(drizzle))
3372
if (opt_slave_data && do_show_slave_status(drizzle))
3374
if (opt_single_transaction && do_unlock_tables(drizzle)) /* unlock but no commit! */
3488
3377
if (opt_alldbs)