73
75
#define IGNORE_DATA 0x01 /* don't dump data for this table */
74
76
#define IGNORE_INSERT_DELAYED 0x02 /* table doesn't support INSERT DELAYED */
76
static void add_load_option(DYNAMIC_STRING *str, const char *option,
77
const char *option_value);
78
static void add_load_option(string &str, const char *option,
79
const char *option_value);
78
80
static ulong find_set(TYPELIB *lib, const char *x, uint length,
79
81
char **err_pos, uint *err_len);
81
static void field_escape(DYNAMIC_STRING* in, const char *from);
83
static void field_escape(string &in, const char *from);
82
84
static bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0,
83
85
quick= 1, extended_insert= 1,
84
86
lock_tables=1,ignore_errors=0,flush_logs=0,flush_privileges=0,
97
99
opt_include_master_host_port= 0,
99
101
opt_alltspcs=0, opt_notspcs= 0;
100
static bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0;
102
static bool debug_info_flag= 0, debug_check_flag= 0;
101
103
static ulong opt_max_allowed_packet, opt_net_buffer_length;
102
104
static DRIZZLE drizzle_connection,*drizzle=0;
103
static DYNAMIC_STRING insert_pat;
105
static string insert_pat;
104
106
static char *opt_password=0,*current_user=0,
105
107
*current_host=0,*path=0,*fields_terminated=0,
106
108
*lines_terminated=0, *enclosed=0, *opt_enclosed=0, *escaped=0,
121
123
static uint opt_slave_data;
122
124
static uint my_end_arg;
123
125
static int first_error=0;
124
static DYNAMIC_STRING extended_row;
126
static string extended_row;
125
127
FILE *md_result_file= 0;
126
128
FILE *stderror_file=0;
128
130
static uint opt_protocol= DRIZZLE_PROTOCOL_TCP;
131
Dynamic_string wrapper functions. In this file use these
132
wrappers, they will terminate the process if there is
133
an allocation failure.
135
static void init_dynamic_string_checked(DYNAMIC_STRING *str, const char *init_str,
136
uint init_alloc, uint alloc_increment);
137
static void dynstr_append_checked(DYNAMIC_STRING* dest, const char* src);
138
static void dynstr_set_checked(DYNAMIC_STRING *str, const char *init_str);
139
static void dynstr_append_mem_checked(DYNAMIC_STRING *str, const char *append,
141
static void dynstr_realloc_checked(DYNAMIC_STRING *str, ulong additional_size);
143
133
Constant for detection of default value of default_charset.
144
134
If default_charset is equal to drizzle_universal_client_charset, then
145
135
it is the default value which assigned at the very beginning of main().
1690
1670
if (write_data)
1692
1672
if (opt_replace_into)
1693
dynstr_append_checked(&insert_pat, "REPLACE ");
1673
insert_pat.append("REPLACE ");
1695
dynstr_append_checked(&insert_pat, "INSERT ");
1696
dynstr_append_checked(&insert_pat, insert_option);
1697
dynstr_append_checked(&insert_pat, "INTO ");
1698
dynstr_append_checked(&insert_pat, opt_quoted_table);
1675
insert_pat.append("INSERT ");
1676
insert_pat.append(insert_option);
1677
insert_pat.append("INTO ");
1678
insert_pat.append(opt_quoted_table);
1699
1679
if (complete_insert)
1701
dynstr_append_checked(&insert_pat, " (");
1681
insert_pat.append(" (");
1705
dynstr_append_checked(&insert_pat, " VALUES ");
1685
insert_pat.append(" VALUES ");
1706
1686
if (!extended_insert)
1707
dynstr_append_checked(&insert_pat, "(");
1687
insert_pat.append("(");
1717
dynstr_append_checked(&insert_pat, ", ");
1697
insert_pat.append(", ");
1720
dynstr_append_checked(&insert_pat,
1721
quote_name(row[SHOW_FIELDNAME], name_buff, 0));
1700
insert_pat.append(quote_name(row[SHOW_FIELDNAME], name_buff, 0));
1724
1703
num_fields= drizzle_num_rows(result);
1759
1738
if (write_data)
1761
1740
if (opt_replace_into)
1762
dynstr_append_checked(&insert_pat, "REPLACE ");
1741
insert_pat.append("REPLACE ");
1764
dynstr_append_checked(&insert_pat, "INSERT ");
1765
dynstr_append_checked(&insert_pat, insert_option);
1766
dynstr_append_checked(&insert_pat, "INTO ");
1767
dynstr_append_checked(&insert_pat, result_table);
1743
insert_pat.append("INSERT ");
1744
insert_pat.append(insert_option);
1745
insert_pat.append("INTO ");
1746
insert_pat.append(result_table);
1768
1747
if (complete_insert)
1769
dynstr_append_checked(&insert_pat, " (");
1748
insert_pat.append(" (");
1772
dynstr_append_checked(&insert_pat, " VALUES ");
1751
insert_pat.append(" VALUES ");
1773
1752
if (!extended_insert)
1774
dynstr_append_checked(&insert_pat, "(");
1753
insert_pat.append("(");
1963
1941
return((uint) num_fields);
1964
1942
} /* get_table_structure */
1966
static void add_load_option(DYNAMIC_STRING *str, const char *option,
1967
const char *option_value)
1944
static void add_load_option(string &str, const char *option,
1945
const char *option_value)
1969
1947
if (!option_value)
1994
1972
syntax errors from the SQL parser.
1997
static void field_escape(DYNAMIC_STRING* in, const char *from)
1975
static void field_escape(string &in, const char *from)
1999
1977
uint end_backslashes= 0;
2001
dynstr_append_checked(in, "'");
2005
dynstr_append_mem_checked(in, from, 1);
2007
1985
if (*from == '\\')
2008
1986
end_backslashes^=1; /* find odd number of backslashes */
2135
2114
/* now build the query string */
2137
dynstr_append_checked(&query_string, "SELECT * INTO OUTFILE '");
2138
dynstr_append_checked(&query_string, filename);
2139
dynstr_append_checked(&query_string, "'");
2116
query_string.append( "SELECT * INTO OUTFILE '");
2117
query_string.append( filename);
2118
query_string.append( "'");
2141
2120
if (fields_terminated || enclosed || opt_enclosed || escaped)
2142
dynstr_append_checked(&query_string, " FIELDS");
2121
query_string.append( " FIELDS");
2144
add_load_option(&query_string, " TERMINATED BY ", fields_terminated);
2145
add_load_option(&query_string, " ENCLOSED BY ", enclosed);
2146
add_load_option(&query_string, " OPTIONALLY ENCLOSED BY ", opt_enclosed);
2147
add_load_option(&query_string, " ESCAPED BY ", escaped);
2148
add_load_option(&query_string, " LINES TERMINATED BY ", lines_terminated);
2123
add_load_option(query_string, " TERMINATED BY ", fields_terminated);
2124
add_load_option(query_string, " ENCLOSED BY ", enclosed);
2125
add_load_option(query_string, " OPTIONALLY ENCLOSED BY ", opt_enclosed);
2126
add_load_option(query_string, " ESCAPED BY ", escaped);
2127
add_load_option(query_string, " LINES TERMINATED BY ", lines_terminated);
2150
dynstr_append_checked(&query_string, " FROM ");
2151
dynstr_append_checked(&query_string, result_table);
2129
query_string.append( " FROM ");
2130
query_string.append( result_table);
2155
dynstr_append_checked(&query_string, " WHERE ");
2156
dynstr_append_checked(&query_string, where);
2134
query_string.append( " WHERE ");
2135
query_string.append( where);
2161
dynstr_append_checked(&query_string, " ORDER BY ");
2162
dynstr_append_checked(&query_string, order_by);
2140
query_string.append( " ORDER BY ");
2141
query_string.append( order_by);
2165
if (drizzle_real_query(drizzle, query_string.str, query_string.length))
2144
if (drizzle_real_query(drizzle, query_string.c_str(), query_string.length()))
2167
2146
DB_error(drizzle, "when executing 'SELECT INTO OUTFILE'");
2168
dynstr_free(&query_string);
2199
2177
fprintf(md_result_file, "-- ORDER BY: %s\n", order_by);
2200
2178
check_io(md_result_file);
2202
dynstr_append_checked(&query_string, " ORDER BY ");
2203
dynstr_append_checked(&query_string, order_by);
2180
query_string.append( " ORDER BY ");
2181
query_string.append( order_by);
2206
2184
if (!opt_xml && !opt_compact)
2208
2186
fputs("\n", md_result_file);
2209
2187
check_io(md_result_file);
2211
if (drizzle_query_with_error_report(drizzle, 0, query_string.str))
2189
if (drizzle_query_with_error_report(drizzle, 0, query_string.c_str()))
2213
2191
DB_error(drizzle, "when retrieving data from server");
2315
2293
plus 2 bytes for leading and trailing '\'' characters.
2316
2294
Also we need to reserve 1 byte for terminating '\0'.
2318
dynstr_realloc_checked(&extended_row,length * 2 + 2 + 1);
2296
char * tmp_str= (char *)malloc(length * 2 + 2 + 1);
2297
memset(tmp_str, '\0', length * 2 + 2 + 1);
2319
2298
if (opt_hex_blob && is_blob)
2321
dynstr_append_checked(&extended_row, "0x");
2322
extended_row.length+= drizzle_hex_string(extended_row.str +
2323
extended_row.length,
2325
assert(extended_row.length+1 <= extended_row.max_length);
2326
/* drizzle_hex_string() already terminated string by '\0' */
2327
assert(extended_row.str[extended_row.length] == '\0');
2300
extended_row.append("0x");
2301
drizzle_hex_string(tmp_str, row[i], length);
2302
extended_row.append(tmp_str);
2331
dynstr_append_checked(&extended_row,"'");
2332
extended_row.length +=
2306
extended_row.append("'");
2333
2307
drizzle_real_escape_string(&drizzle_connection,
2334
&extended_row.str[extended_row.length],
2336
extended_row.str[extended_row.length]='\0';
2337
dynstr_append_checked(&extended_row,"'");
2310
extended_row.append(tmp_str);
2311
extended_row.append("'");
2343
2318
char *ptr= row[i];
2344
2319
if (my_isalpha(charset_info, *ptr) || (*ptr == '-' &&
2345
2320
my_isalpha(charset_info, ptr[1])))
2346
dynstr_append_checked(&extended_row, "NULL");
2321
extended_row.append( "NULL");
2349
dynstr_append_checked(&extended_row, ptr);
2324
extended_row.append( ptr);
2354
dynstr_append_checked(&extended_row,"''");
2329
extended_row.append("''");
2357
dynstr_append_checked(&extended_row,"NULL");
2332
extended_row.append("NULL");
2433
2408
if (extended_insert)
2435
2410
ulong row_length;
2436
dynstr_append_checked(&extended_row,")");
2437
row_length= 2 + extended_row.length;
2411
extended_row.append(")");
2412
row_length= 2 + extended_row.length();
2438
2413
if (total_length + row_length < opt_net_buffer_length)
2440
2415
total_length+= row_length;
2441
2416
fputc(',',md_result_file); /* Always row break */
2442
fputs(extended_row.str,md_result_file);
2417
fputs(extended_row.c_str(),md_result_file);
2447
2422
fputs(";\n", md_result_file);
2448
2423
row_break=1; /* This is first row */
2450
fputs(insert_pat.str,md_result_file);
2451
fputs(extended_row.str,md_result_file);
2425
fputs(insert_pat.c_str(),md_result_file);
2426
fputs(extended_row.c_str(),md_result_file);
2452
2427
total_length= row_length+init_length;
2454
2429
check_io(md_result_file);
2688
2661
print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NullS);
2689
2662
if (lock_tables)
2691
DYNAMIC_STRING query;
2692
init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024);
2665
query= "LOCK TABLES ";
2693
2666
for (numrows= 0 ; (table= getTableName(1)) ; )
2695
2668
char *end= stpcpy(afterdot, table);
2696
2669
if (include_table((uchar*) hash_key,end - hash_key))
2699
dynstr_append_checked(&query, quote_name(table, table_buff, 1));
2700
dynstr_append_checked(&query, " READ /*!32311 LOCAL */,");
2672
query.append( quote_name(table, table_buff, 1));
2673
query.append( " READ /*!32311 LOCAL */,");
2703
if (numrows && drizzle_real_query(drizzle, query.str, query.length-1))
2676
if (numrows && drizzle_real_query(drizzle, query.c_str(), query.length()-1))
2704
2677
DB_error(drizzle, "when using LOCK TABLES");
2705
2678
/* We shall continue here, if --force was given */
2706
dynstr_free(&query);
2708
2681
if (flush_logs)
2800
2773
if (!(dump_tables= pos= (char**) alloc_root(&root, tables * sizeof(char *))))
2801
2774
die(EX_EOM, "alloc_root failure.");
2803
init_dynamic_string_checked(&lock_tables_query, "LOCK TABLES ", 256, 1024);
2776
lock_tables_query= "LOCK TABLES ";
2804
2777
for (; tables > 0 ; tables-- , table_names++)
2806
2779
/* the table name passed on commandline may be wrong case */
2809
2782
/* Add found table name to lock_tables_query */
2810
2783
if (lock_tables)
2812
dynstr_append_checked(&lock_tables_query, quote_name(*pos, table_buff, 1));
2813
dynstr_append_checked(&lock_tables_query, " READ /*!32311 LOCAL */,");
2785
lock_tables_query.append( quote_name(*pos, table_buff, 1));
2786
lock_tables_query.append( " READ /*!32311 LOCAL */,");
2830
2802
if (lock_tables)
2832
if (drizzle_real_query(drizzle, lock_tables_query.str,
2833
lock_tables_query.length-1))
2804
if (drizzle_real_query(drizzle, lock_tables_query.c_str(),
2805
lock_tables_query.length()-1))
2835
2807
if (!ignore_errors)
2837
dynstr_free(&lock_tables_query);
2838
2809
free_root(&root, MYF(0));
2840
2811
DB_error(drizzle, "when doing LOCK TABLES");
2841
2812
/* We shall countinue here, if --force was given */
2844
dynstr_free(&lock_tables_query);
2845
2815
if (flush_logs)
2847
2817
if (drizzle_refresh(drizzle, REFRESH_LOG))
3086
3056
static int purge_bin_logs_to(DRIZZLE *drizzle_con, char* log_name)
3090
init_dynamic_string_checked(&str, "PURGE BINARY LOGS TO '", 1024, 1024);
3091
dynstr_append_checked(&str, log_name);
3092
dynstr_append_checked(&str, "'");
3093
err = drizzle_query_with_error_report(drizzle_con, 0, str.str);
3059
string str= "PURGE BINARY LOGS TO '";
3060
str.append(log_name);
3062
err = drizzle_query_with_error_report(drizzle_con, 0, str.c_str());
3375
The following functions are wrappers for the dynamic string functions
3376
and if they fail, the wrappers will terminate the current process.
3379
#define DYNAMIC_STR_ERROR_MSG "Couldn't perform DYNAMIC_STRING operation"
3381
static void init_dynamic_string_checked(DYNAMIC_STRING *str, const char *init_str,
3382
uint init_alloc, uint alloc_increment)
3384
if (init_dynamic_string(str, init_str, init_alloc, alloc_increment))
3385
die(EX_DRIZZLEERR, DYNAMIC_STR_ERROR_MSG);
3388
static void dynstr_append_checked(DYNAMIC_STRING* dest, const char* src)
3390
if (dynstr_append(dest, src))
3391
die(EX_DRIZZLEERR, DYNAMIC_STR_ERROR_MSG);
3394
static void dynstr_set_checked(DYNAMIC_STRING *str, const char *init_str)
3396
if (dynstr_set(str, init_str))
3397
die(EX_DRIZZLEERR, DYNAMIC_STR_ERROR_MSG);
3400
static void dynstr_append_mem_checked(DYNAMIC_STRING *str, const char *append,
3403
if (dynstr_append_mem(str, append, length))
3404
die(EX_DRIZZLEERR, DYNAMIC_STR_ERROR_MSG);
3407
static void dynstr_realloc_checked(DYNAMIC_STRING *str, ulong additional_size)
3409
if (dynstr_realloc(str, additional_size))
3410
die(EX_DRIZZLEERR, DYNAMIC_STR_ERROR_MSG);
3414
3343
int main(int argc, char **argv)