454
450
{"skip-opt", OPT_SKIP_OPTIMIZATION,
455
451
"Disable --opt. Disables --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys.",
456
452
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
457
{"socket", 'S', "Socket file to use for connection.",
458
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0, GET_STR,
459
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
461
454
"Creates tab separated textfile for each table to given path. (creates .sql and .txt files). NOTE: This only works if mysqldump is run on the same machine as the mysqld daemon.",
462
455
(uchar**) &path, (uchar**) &path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1057
static int fetch_db_collation(const char *db_name,
1061
my_bool err_status= FALSE;
1062
char query[QUERY_LENGTH];
1063
MYSQL_RES *db_cl_res;
1064
MYSQL_ROW db_cl_row;
1065
char quoted_database_buf[NAME_LEN*2+3];
1066
char *qdatabase= quote_name(db_name, quoted_database_buf, 1);
1068
my_snprintf(query, sizeof (query), "use %s", qdatabase);
1070
if (mysql_query_with_error_report(mysql, NULL, query))
1073
if (mysql_query_with_error_report(mysql, &db_cl_res,
1074
"select @@collation_database"))
1079
if (mysql_num_rows(db_cl_res) != 1)
1085
if (!(db_cl_row= mysql_fetch_row(db_cl_res)))
1091
strncpy(db_cl_name, db_cl_row[0], db_cl_size);
1092
db_cl_name[db_cl_size - 1]= 0; /* just in case. */
1096
mysql_free_result(db_cl_res);
1098
return err_status ? 1 : 0;
1102
static char *my_case_str(const char *str,
1109
uint status= my_charset_latin1.coll->instr(&my_charset_latin1,
1114
return status ? (char *) str + match.end : NULL;
1118
static int switch_db_collation(FILE *sql_file,
1119
const char *db_name,
1120
const char *delimiter,
1121
const char *current_db_cl_name,
1122
const char *required_db_cl_name,
1125
if (strcmp(current_db_cl_name, required_db_cl_name) != 0)
1127
CHARSET_INFO *db_cl= get_charset_by_name(required_db_cl_name, MYF(0));
1133
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
1134
(const char *) db_name,
1135
(const char *) db_cl->csname,
1136
(const char *) db_cl->name,
1137
(const char *) delimiter);
1150
static int restore_db_collation(FILE *sql_file,
1151
const char *db_name,
1152
const char *delimiter,
1153
const char *db_cl_name)
1155
CHARSET_INFO *db_cl= get_charset_by_name(db_cl_name, MYF(0));
1161
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
1162
(const char *) db_name,
1163
(const char *) db_cl->csname,
1164
(const char *) db_cl->name,
1165
(const char *) delimiter);
1171
static void switch_cs_variables(FILE *sql_file,
1172
const char *delimiter,
1173
const char *character_set_client,
1174
const char *character_set_results,
1175
const char *collation_connection)
1178
"/*!50003 SET @saved_cs_client = @@character_set_client */ %s\n"
1179
"/*!50003 SET @saved_cs_results = @@character_set_results */ %s\n"
1180
"/*!50003 SET @saved_col_connection = @@collation_connection */ %s\n"
1181
"/*!50003 SET character_set_client = %s */ %s\n"
1182
"/*!50003 SET character_set_results = %s */ %s\n"
1183
"/*!50003 SET collation_connection = %s */ %s\n",
1184
(const char *) delimiter,
1185
(const char *) delimiter,
1186
(const char *) delimiter,
1188
(const char *) character_set_client,
1189
(const char *) delimiter,
1191
(const char *) character_set_results,
1192
(const char *) delimiter,
1194
(const char *) collation_connection,
1195
(const char *) delimiter);
1199
static void restore_cs_variables(FILE *sql_file,
1200
const char *delimiter)
1203
"/*!50003 SET character_set_client = @saved_cs_client */ %s\n"
1204
"/*!50003 SET character_set_results = @saved_cs_results */ %s\n"
1205
"/*!50003 SET collation_connection = @saved_col_connection */ %s\n",
1206
(const char *) delimiter,
1207
(const char *) delimiter,
1208
(const char *) delimiter);
1212
static void switch_sql_mode(FILE *sql_file,
1213
const char *delimiter,
1214
const char *sql_mode)
1217
"/*!50003 SET @saved_sql_mode = @@sql_mode */ %s\n"
1218
"/*!50003 SET sql_mode = '%s' */ %s\n",
1219
(const char *) delimiter,
1221
(const char *) sql_mode,
1222
(const char *) delimiter);
1226
static void restore_sql_mode(FILE *sql_file,
1227
const char *delimiter)
1230
"/*!50003 SET sql_mode = @saved_sql_mode */ %s\n",
1231
(const char *) delimiter);
1235
static void switch_time_zone(FILE *sql_file,
1236
const char *delimiter,
1237
const char *time_zone)
1240
"/*!50003 SET @saved_time_zone = @@time_zone */ %s\n"
1241
"/*!50003 SET time_zone = '%s' */ %s\n",
1242
(const char *) delimiter,
1244
(const char *) time_zone,
1245
(const char *) delimiter);
1249
static void restore_time_zone(FILE *sql_file,
1250
const char *delimiter)
1253
"/*!50003 SET time_zone = @saved_time_zone */ %s\n",
1254
(const char *) delimiter);
1259
1040
Switch charset for results to some specified charset. If the server does not
1260
1041
support character_set_results variable, nothing can be done here. As for
1284
1065
return mysql_real_query(mysql, query_buffer, query_length);
1288
Rewrite CREATE FUNCTION or CREATE PROCEDURE statement, enclosing DEFINER
1289
clause in version-specific comment.
1291
This function parses the CREATE FUNCTION | PROCEDURE statement and
1292
encloses DEFINER-clause in version-specific comment:
1293
input query: CREATE DEFINER=a@b FUNCTION ...
1294
rewritten query: CREATE * / / *!50020 DEFINER=a@b * / / *!50003 FUNCTION ...
1296
@note This function will go away when WL#3995 is implemented.
1298
@param[in] def_str CREATE FUNCTION|PROCEDURE statement string.
1299
@param[in] def_str_length length of the def_str.
1301
@return pointer to the new allocated query string.
1304
static char *cover_definer_clause_in_sp(const char *def_str,
1305
uint def_str_length)
1307
char *query_str= NULL;
1308
char *definer_begin= my_case_str(def_str, def_str_length,
1309
C_STRING_WITH_LEN(" DEFINER"));
1315
definer_end= my_case_str(definer_begin, strlen(definer_begin),
1316
C_STRING_WITH_LEN(" PROCEDURE"));
1320
definer_end= my_case_str(definer_begin, strlen(definer_begin),
1321
C_STRING_WITH_LEN(" FUNCTION"));
1326
char *query_str_tail;
1329
Allocate memory for new query string: original string
1330
from SHOW statement and version-specific comments.
1332
query_str= alloc_query_str(def_str_length + 23);
1334
query_str_tail= strnmov(query_str, def_str, definer_begin - def_str);
1335
query_str_tail= strmov(query_str_tail, "*/ /*!50020");
1336
query_str_tail= strnmov(query_str_tail, definer_begin,
1337
definer_end - definer_begin);
1338
query_str_tail= strxmov(query_str_tail, "*/ /*!50003",
1339
definer_end, NullS);
1346
1069
Open a new .sql file to dump the table or view into
1750
Generate a new (null-terminated) string that does not exist in query
1751
and is therefore suitable for use as a query delimiter. Store this
1752
delimiter in delimiter_buff .
1754
This is quite simple in that it doesn't even try to parse statements as an
1755
interpreter would. It merely returns a string that is not in the query, which
1756
is much more than adequate for constructing a delimiter.
1759
ptr to the delimiter on Success
1762
static char *create_delimiter(char *query, char *delimiter_buff,
1763
int delimiter_max_size)
1765
int proposed_length;
1768
delimiter_buff[0]= ';'; /* start with one semicolon, and */
1770
for (proposed_length= 2; proposed_length < delimiter_max_size;
1771
delimiter_max_size++) {
1773
delimiter_buff[proposed_length-1]= ';'; /* add semicolons, until */
1774
delimiter_buff[proposed_length]= '\0';
1776
presence = strstr(query, delimiter_buff);
1777
if (presence == NULL) { /* the proposed delimiter is not in the query. */
1778
return delimiter_buff;
1782
return NULL; /* but if we run out of space, return nothing at all. */
1788
-- retrieves list of events for a given db, and prints out
1789
the CREATE EVENT statement into the output (the dump).
1795
static uint dump_events_for_db(char *db)
1797
char query_buff[QUERY_LENGTH];
1798
char db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3];
1800
char delimiter[QUERY_LENGTH];
1801
FILE *sql_file= md_result_file;
1802
MYSQL_RES *event_res, *event_list_res;
1803
MYSQL_ROW row, event_list_row;
1805
char db_cl_name[MY_CS_NAME_SIZE];
1806
int db_cl_altered= FALSE;
1808
DBUG_ENTER("dump_events_for_db");
1809
DBUG_PRINT("enter", ("db: '%s'", db));
1811
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
1815
fprintf(sql_file, "\n--\n-- Dumping events for database '%s'\n--\n", db);
1818
not using "mysql_query_with_error_report" because we may have not
1819
enough privileges to lock mysql.events.
1822
mysql_query(mysql, "LOCK TABLES mysql.event READ");
1824
if (mysql_query_with_error_report(mysql, &event_list_res, "show events"))
1827
strcpy(delimiter, ";");
1828
if (mysql_num_rows(event_list_res) > 0)
1830
fprintf(sql_file, "/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;\n");
1832
/* Get database collation. */
1834
if (fetch_db_collation(db_name_buff, db_cl_name, sizeof (db_cl_name)))
1837
if (switch_character_set_results(mysql, "binary"))
1840
while ((event_list_row= mysql_fetch_row(event_list_res)) != NULL)
1842
event_name= quote_name(event_list_row[1], name_buff, 0);
1843
DBUG_PRINT("info", ("retrieving CREATE EVENT for %s", name_buff));
1844
my_snprintf(query_buff, sizeof(query_buff), "SHOW CREATE EVENT %s",
1847
if (mysql_query_with_error_report(mysql, &event_res, query_buff))
1850
while ((row= mysql_fetch_row(event_res)) != NULL)
1853
if the user has EXECUTE privilege he can see event names, but not the
1856
if (strlen(row[3]) != 0)
1859
fprintf(sql_file, "/*!50106 DROP EVENT IF EXISTS %s */%s\n",
1860
event_name, delimiter);
1862
if (create_delimiter(row[3], delimiter, sizeof(delimiter)) == NULL)
1864
fprintf(stderr, "%s: Warning: Can't create delimiter for event '%s'\n",
1865
my_progname, event_name);
1869
fprintf(sql_file, "DELIMITER %s\n", delimiter);
1871
if (mysql_num_fields(event_res) >= 7)
1873
if (switch_db_collation(sql_file, db_name_buff, delimiter,
1874
db_cl_name, row[6], &db_cl_altered))
1879
switch_cs_variables(sql_file, delimiter,
1880
row[4], /* character_set_client */
1881
row[4], /* character_set_results */
1882
row[5]); /* collation_connection */
1887
mysqldump is being run against the server, that does not
1888
provide character set information in SHOW CREATE
1891
NOTE: the dump may be incorrect, since character set
1892
information is required in order to restore event properly.
1897
"-- WARNING: old server version. "
1898
"The following dump may be incomplete.\n"
1902
switch_sql_mode(sql_file, delimiter, row[1]);
1904
switch_time_zone(sql_file, delimiter, row[2]);
1907
"/*!50106 %s */ %s\n",
1908
(const char *) row[3],
1909
(const char *) delimiter);
1911
restore_time_zone(sql_file, delimiter);
1912
restore_sql_mode(sql_file, delimiter);
1914
if (mysql_num_fields(event_res) >= 7)
1916
restore_cs_variables(sql_file, delimiter);
1920
if (restore_db_collation(sql_file, db_name_buff, delimiter,
1926
} /* end of event printing */
1927
mysql_free_result(event_res);
1929
} /* end of list of events */
1930
fprintf(sql_file, "DELIMITER ;\n");
1931
fprintf(sql_file, "/*!50106 SET TIME_ZONE= @save_time_zone */ ;\n");
1933
if (switch_character_set_results(mysql, default_charset))
1936
mysql_free_result(event_list_res);
1939
VOID(mysql_query_with_error_report(mysql, 0, "UNLOCK TABLES"));
1945
1472
Print hex value for blob data.
1967
dump_routines_for_db
1968
-- retrieves list of routines for a given db, and prints out
1969
the CREATE PROCEDURE definition into the output (the dump).
1971
This function has logic to print the appropriate syntax depending on whether
1972
this is a procedure or functions
1979
static uint dump_routines_for_db(char *db)
1981
char query_buff[QUERY_LENGTH];
1982
const char *routine_type[]= {"FUNCTION", "PROCEDURE"};
1983
char db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3];
1986
FILE *sql_file= md_result_file;
1987
MYSQL_RES *routine_res, *routine_list_res;
1988
MYSQL_ROW row, routine_list_row;
1990
char db_cl_name[MY_CS_NAME_SIZE];
1991
int db_cl_altered= FALSE;
1993
DBUG_ENTER("dump_routines_for_db");
1994
DBUG_PRINT("enter", ("db: '%s'", db));
1996
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
2000
fprintf(sql_file, "\n--\n-- Dumping routines for database '%s'\n--\n", db);
2003
not using "mysql_query_with_error_report" because we may have not
2004
enough privileges to lock mysql.proc.
2007
mysql_query(mysql, "LOCK TABLES mysql.proc READ");
2009
/* Get database collation. */
2011
if (fetch_db_collation(db_name_buff, db_cl_name, sizeof (db_cl_name)))
2014
if (switch_character_set_results(mysql, "binary"))
2017
/* 0, retrieve and dump functions, 1, procedures */
2018
for (i= 0; i <= 1; i++)
2020
my_snprintf(query_buff, sizeof(query_buff),
2021
"SHOW %s STATUS WHERE Db = '%s'",
2022
routine_type[i], db_name_buff);
2024
if (mysql_query_with_error_report(mysql, &routine_list_res, query_buff))
2027
if (mysql_num_rows(routine_list_res))
2030
while ((routine_list_row= mysql_fetch_row(routine_list_res)))
2032
routine_name= quote_name(routine_list_row[1], name_buff, 0);
2033
DBUG_PRINT("info", ("retrieving CREATE %s for %s", routine_type[i],
2035
my_snprintf(query_buff, sizeof(query_buff), "SHOW CREATE %s %s",
2036
routine_type[i], routine_name);
2038
if (mysql_query_with_error_report(mysql, &routine_res, query_buff))
2041
while ((row= mysql_fetch_row(routine_res)))
2044
if the user has EXECUTE privilege he see routine names, but NOT the
2045
routine body of other routines that are not the creator of!
2047
DBUG_PRINT("info",("length of body for %s row[2] '%s' is %d",
2048
routine_name, row[2] ? row[2] : "(null)",
2049
row[2] ? (int) strlen(row[2]) : 0));
2052
fprintf(sql_file, "\n-- insufficient privileges to %s\n", query_buff);
2053
fprintf(sql_file, "-- does %s have permissions on mysql.proc?\n\n", current_user);
2054
maybe_die(EX_MYSQLERR,"%s has insufficent privileges to %s!", current_user, query_buff);
2056
else if (strlen(row[2]))
2060
fprintf(sql_file, "/*!50003 DROP %s IF EXISTS %s */;\n",
2061
routine_type[i], routine_name);
2063
query_str= cover_definer_clause_in_sp(row[2], strlen(row[2]));
2065
if (mysql_num_fields(routine_res) >= 6)
2067
if (switch_db_collation(sql_file, db_name_buff, ";",
2068
db_cl_name, row[5], &db_cl_altered))
2073
switch_cs_variables(sql_file, ";",
2074
row[3], /* character_set_client */
2075
row[3], /* character_set_results */
2076
row[4]); /* collation_connection */
2081
mysqldump is being run against the server, that does not
2082
provide character set information in SHOW CREATE
2085
NOTE: the dump may be incorrect, since character set
2086
information is required in order to restore stored
2087
procedure/function properly.
2092
"-- WARNING: old server version. "
2093
"The following dump may be incomplete.\n"
2098
switch_sql_mode(sql_file, ";", row[1]);
2102
"/*!50003 %s */;;\n"
2104
(const char *) (query_str != NULL ? query_str : row[2]));
2106
restore_sql_mode(sql_file, ";");
2108
if (mysql_num_fields(routine_res) >= 6)
2110
restore_cs_variables(sql_file, ";");
2114
if (restore_db_collation(sql_file, db_name_buff, ";", db_cl_name))
2119
my_free(query_str, MYF(MY_ALLOW_ZERO_PTR));
2121
} /* end of routine printing */
2122
mysql_free_result(routine_res);
2124
} /* end of list of routines */
2126
mysql_free_result(routine_list_res);
2127
} /* end of for i (0 .. 1) */
2129
if (switch_character_set_results(mysql, default_charset))
2133
VOID(mysql_query_with_error_report(mysql, 0, "UNLOCK TABLES"));
2138
1494
get_table_structure -- retrievs database structure, prints out corresponding
2139
1495
CREATE statement and fills out insert_pat if the table is the type we will
3258
2603
} /* getTableName */
3262
dump all logfile groups and tablespaces
3265
static int dump_all_tablespaces()
3267
return dump_tablespaces(NULL);
3270
static int dump_tablespaces_for_tables(char *db, char **table_names, int tables)
3272
DYNAMIC_STRING where;
3275
char name_buff[NAME_LEN*2+3];
3277
mysql_real_escape_string(mysql, name_buff, db, strlen(db));
3279
init_dynamic_string_checked(&where, " AND TABLESPACE_NAME IN ("
3280
"SELECT DISTINCT TABLESPACE_NAME FROM"
3281
" INFORMATION_SCHEMA.PARTITIONS"
3283
" TABLE_SCHEMA='", 256, 1024);
3284
dynstr_append_checked(&where, name_buff);
3285
dynstr_append_checked(&where, "' AND TABLE_NAME IN (");
3287
for (i=0 ; i<tables ; i++)
3289
mysql_real_escape_string(mysql, name_buff,
3290
table_names[i], strlen(table_names[i]));
3292
dynstr_append_checked(&where, "'");
3293
dynstr_append_checked(&where, name_buff);
3294
dynstr_append_checked(&where, "',");
3296
dynstr_trunc(&where, 1);
3297
dynstr_append_checked(&where,"))");
3299
DBUG_PRINT("info",("Dump TS for Tables where: %s",where.str));
3300
r= dump_tablespaces(where.str);
3301
dynstr_free(&where);
3305
static int dump_tablespaces_for_databases(char** databases)
3307
DYNAMIC_STRING where;
3311
init_dynamic_string_checked(&where, " AND TABLESPACE_NAME IN ("
3312
"SELECT DISTINCT TABLESPACE_NAME FROM"
3313
" INFORMATION_SCHEMA.PARTITIONS"
3315
" TABLE_SCHEMA IN (", 256, 1024);
3317
for (i=0 ; databases[i]!=NULL ; i++)
3319
char db_name_buff[NAME_LEN*2+3];
3320
mysql_real_escape_string(mysql, db_name_buff,
3321
databases[i], strlen(databases[i]));
3322
dynstr_append_checked(&where, "'");
3323
dynstr_append_checked(&where, db_name_buff);
3324
dynstr_append_checked(&where, "',");
3326
dynstr_trunc(&where, 1);
3327
dynstr_append_checked(&where,"))");
3329
DBUG_PRINT("info",("Dump TS for DBs where: %s",where.str));
3330
r= dump_tablespaces(where.str);
3331
dynstr_free(&where);
3335
static int dump_tablespaces(char* ts_where)
3338
MYSQL_RES *tableres;
3339
char buf[FN_REFLEN];
3340
DYNAMIC_STRING sqlbuf;
3343
The following are used for parsing the EXTRA field
3345
char extra_format[]= "UNDO_BUFFER_SIZE=";
3348
DBUG_ENTER("dump_tablespaces");
3350
init_dynamic_string_checked(&sqlbuf,
3351
"SELECT LOGFILE_GROUP_NAME,"
3357
" FROM INFORMATION_SCHEMA.FILES"
3358
" WHERE FILE_TYPE = 'UNDO LOG'"
3359
" AND FILE_NAME IS NOT NULL",
3363
dynstr_append_checked(&sqlbuf,
3364
" AND LOGFILE_GROUP_NAME IN ("
3365
"SELECT DISTINCT LOGFILE_GROUP_NAME"
3366
" FROM INFORMATION_SCHEMA.FILES"
3367
" WHERE FILE_TYPE = 'DATAFILE'"
3369
dynstr_append_checked(&sqlbuf, ts_where);
3370
dynstr_append_checked(&sqlbuf, ")");
3372
dynstr_append_checked(&sqlbuf,
3373
" GROUP BY LOGFILE_GROUP_NAME, FILE_NAME"
3375
" ORDER BY LOGFILE_GROUP_NAME");
3377
if (mysql_query(mysql, sqlbuf.str) ||
3378
!(tableres = mysql_store_result(mysql)))
3380
dynstr_free(&sqlbuf);
3381
if (mysql_errno(mysql) == ER_BAD_TABLE_ERROR ||
3382
mysql_errno(mysql) == ER_BAD_DB_ERROR ||
3383
mysql_errno(mysql) == ER_UNKNOWN_TABLE)
3385
fprintf(md_result_file,
3386
"\n--\n-- Not dumping tablespaces as no INFORMATION_SCHEMA.FILES"
3387
" table on this server\n--\n");
3388
check_io(md_result_file);
3392
my_printf_error(0, "Error: '%s' when trying to dump tablespaces",
3393
MYF(0), mysql_error(mysql));
3398
while ((row= mysql_fetch_row(tableres)))
3400
if (strcmp(buf, row[0]) != 0)
3404
if (!opt_xml && opt_comments)
3406
fprintf(md_result_file,"\n--\n-- Logfile group: %s\n--\n", row[0]);
3407
check_io(md_result_file);
3409
fprintf(md_result_file, "\nCREATE");
3413
fprintf(md_result_file, "\nALTER");
3415
fprintf(md_result_file,
3416
" LOGFILE GROUP %s\n"
3417
" ADD UNDOFILE '%s'\n",
3422
ubs= strstr(row[5],extra_format);
3425
ubs+= strlen(extra_format);
3426
endsemi= strstr(ubs,";");
3429
fprintf(md_result_file,
3430
" UNDO_BUFFER_SIZE %s\n",
3433
fprintf(md_result_file,
3434
" INITIAL_SIZE %s\n"
3438
check_io(md_result_file);
3442
strxmov(buf, row[0], NullS);
3445
dynstr_free(&sqlbuf);
3446
mysql_free_result(tableres);
3447
init_dynamic_string_checked(&sqlbuf,
3448
"SELECT DISTINCT TABLESPACE_NAME,"
3450
" LOGFILE_GROUP_NAME,"
3454
" FROM INFORMATION_SCHEMA.FILES"
3455
" WHERE FILE_TYPE = 'DATAFILE'",
3459
dynstr_append_checked(&sqlbuf, ts_where);
3461
dynstr_append_checked(&sqlbuf, " ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME");
3463
if (mysql_query_with_error_report(mysql, &tableres, sqlbuf.str))
3465
dynstr_free(&sqlbuf);
3470
while ((row= mysql_fetch_row(tableres)))
3472
if (strcmp(buf, row[0]) != 0)
3476
if (!opt_xml && opt_comments)
3478
fprintf(md_result_file,"\n--\n-- Tablespace: %s\n--\n", row[0]);
3479
check_io(md_result_file);
3481
fprintf(md_result_file, "\nCREATE");
3485
fprintf(md_result_file, "\nALTER");
3487
fprintf(md_result_file,
3489
" ADD DATAFILE '%s'\n",
3494
fprintf(md_result_file,
3495
" USE LOGFILE GROUP %s\n"
3496
" EXTENT_SIZE %s\n",
3500
fprintf(md_result_file,
3501
" INITIAL_SIZE %s\n"
3505
check_io(md_result_file);
3509
strxmov(buf, row[0], NullS);
3513
mysql_free_result(tableres);
3514
dynstr_free(&sqlbuf);
3518
2606
static int dump_all_databases()
3774
dump structure of views of database
3777
dump_all_views_in_db()
3778
database database name
3785
static my_bool dump_all_views_in_db(char *database)
3789
char table_buff[NAME_LEN*2+3];
3790
char hash_key[2*NAME_LEN+2]; /* "db.tablename" */
3793
afterdot= strmov(hash_key, database);
3796
if (init_dumping(database, init_dumping_views))
3799
print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NullS);
3802
DYNAMIC_STRING query;
3803
init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024);
3804
for (numrows= 0 ; (table= getTableName(1)); )
3806
char *end= strmov(afterdot, table);
3807
if (include_table((uchar*) hash_key,end - hash_key))
3810
dynstr_append_checked(&query, quote_name(table, table_buff, 1));
3811
dynstr_append_checked(&query, " READ /*!32311 LOCAL */,");
3814
if (numrows && mysql_real_query(mysql, query.str, query.length-1))
3815
DB_error(mysql, "when using LOCK TABLES");
3816
/* We shall continue here, if --force was given */
3817
dynstr_free(&query);
3821
if (mysql_refresh(mysql, REFRESH_LOG))
3822
DB_error(mysql, "when doing refresh");
3823
/* We shall continue here, if --force was given */
3825
while ((table= getTableName(0)))
3827
char *end= strmov(afterdot, table);
3828
if (include_table((uchar*) hash_key, end - hash_key))
3829
get_view_structure(table, database);
3833
fputs("</database>\n", md_result_file);
3834
check_io(md_result_file);
3837
VOID(mysql_query_with_error_report(mysql, 0, "UNLOCK TABLES"));
3839
} /* dump_all_tables_in_db */
3843
2810
get_actual_table_name -- executes a SHOW TABLES LIKE '%s' to get the actual
3844
2811
table name from the server for the table name given on the command line.
3845
2812
we do this because the table name given on the command line may be a
4505
ds_str The string to search and perform the replace in
4506
search_str The string to search for
4507
search_len Length of the string to search for
4508
replace_str The string to replace with
4509
replace_len Length of the string to replace with
4513
1 Could not find search_str in str
4516
static int replace(DYNAMIC_STRING *ds_str,
4517
const char *search_str, ulong search_len,
4518
const char *replace_str, ulong replace_len)
4520
DYNAMIC_STRING ds_tmp;
4521
const char *start= strstr(ds_str->str, search_str);
4524
init_dynamic_string_checked(&ds_tmp, "",
4525
ds_str->length + replace_len, 256);
4526
dynstr_append_mem_checked(&ds_tmp, ds_str->str, start - ds_str->str);
4527
dynstr_append_mem_checked(&ds_tmp, replace_str, replace_len);
4528
dynstr_append_checked(&ds_tmp, start + search_len);
4529
dynstr_set_checked(ds_str, ds_tmp.str);
4530
dynstr_free(&ds_tmp);
4536
Getting VIEW structure
4539
get_view_structure()
4548
static my_bool get_view_structure(char *table, char* db)
4550
MYSQL_RES *table_res;
4553
char *result_table, *opt_quoted_table;
4554
char table_buff[NAME_LEN*2+3];
4555
char table_buff2[NAME_LEN*2+3];
4556
char query[QUERY_LENGTH];
4557
FILE *sql_file= md_result_file;
4558
DBUG_ENTER("get_view_structure");
4560
if (opt_no_create_info) /* Don't write table creation info */
4563
verbose_msg("-- Retrieving view structure for table %s...\n", table);
4565
#ifdef NOT_REALLY_USED_YET
4566
sprintf(insert_pat,"SET OPTION SQL_QUOTE_SHOW_CREATE=%d",
4567
(opt_quoted || opt_keywords));
4570
result_table= quote_name(table, table_buff, 1);
4571
opt_quoted_table= quote_name(table, table_buff2, 0);
4573
if (switch_character_set_results(mysql, "binary"))
4576
my_snprintf(query, sizeof(query), "SHOW CREATE TABLE %s", result_table);
4578
if (mysql_query_with_error_report(mysql, &table_res, query))
4580
switch_character_set_results(mysql, default_charset);
4584
/* Check if this is a view */
4585
field= mysql_fetch_field_direct(table_res, 0);
4586
if (strcmp(field->name, "View") != 0)
4588
switch_character_set_results(mysql, default_charset);
4589
verbose_msg("-- It's base table, skipped\n");
4593
/* If requested, open separate .sql file for this view */
4596
if (!(sql_file= open_sql_file_for_table(table)))
4599
write_header(sql_file, db);
4602
if (!opt_xml && opt_comments)
4604
fprintf(sql_file, "\n--\n-- Final view structure for view %s\n--\n\n",
4608
fprintf(sql_file, "/*!50001 DROP TABLE %s*/;\n", opt_quoted_table);
4611
fprintf(sql_file, "/*!50001 DROP VIEW IF EXISTS %s*/;\n",
4617
my_snprintf(query, sizeof(query),
4618
"SELECT CHECK_OPTION, DEFINER, SECURITY_TYPE, "
4619
" CHARACTER_SET_CLIENT, COLLATION_CONNECTION "
4620
"FROM information_schema.views "
4621
"WHERE table_name=\"%s\" AND table_schema=\"%s\"", table, db);
4623
if (mysql_query(mysql, query))
4626
Use the raw output from SHOW CREATE TABLE if
4627
information_schema query fails.
4629
row= mysql_fetch_row(table_res);
4630
fprintf(sql_file, "/*!50001 %s */;\n", row[1]);
4632
mysql_free_result(table_res);
4638
char search_buf[256], replace_buf[256];
4639
ulong search_len, replace_len;
4640
DYNAMIC_STRING ds_view;
4642
/* Save the result of SHOW CREATE TABLE in ds_view */
4643
row= mysql_fetch_row(table_res);
4644
lengths= mysql_fetch_lengths(table_res);
4645
init_dynamic_string_checked(&ds_view, row[1], lengths[1] + 1, 1024);
4646
mysql_free_result(table_res);
4648
/* Get the result from "select ... information_schema" */
4649
if (!(table_res= mysql_store_result(mysql)) ||
4650
!(row= mysql_fetch_row(table_res)))
4653
mysql_free_result(table_res);
4654
dynstr_free(&ds_view);
4655
DB_error(mysql, "when trying to save the result of SHOW CREATE TABLE in ds_view.");
4659
lengths= mysql_fetch_lengths(table_res);
4662
"WITH %s CHECK OPTION" is available from 5.0.2
4663
Surround it with !50002 comments
4665
if (strcmp(row[0], "NONE"))
4669
search_len= (ulong)(strxmov(ptr, "WITH ", row[0],
4670
" CHECK OPTION", NullS) - ptr);
4672
replace_len=(ulong)(strxmov(ptr, "*/\n/*!50002 WITH ", row[0],
4673
" CHECK OPTION", NullS) - ptr);
4674
replace(&ds_view, search_buf, search_len, replace_buf, replace_len);
4678
"DEFINER=%s SQL SECURITY %s" is available from 5.0.13
4679
Surround it with !50013 comments
4682
size_t user_name_len;
4683
char user_name_str[USERNAME_LENGTH + 1];
4684
char quoted_user_name_str[USERNAME_LENGTH * 2 + 3];
4685
size_t host_name_len;
4686
char host_name_str[HOSTNAME_LENGTH + 1];
4687
char quoted_host_name_str[HOSTNAME_LENGTH * 2 + 3];
4689
parse_user(row[1], lengths[1], user_name_str, &user_name_len,
4690
host_name_str, &host_name_len);
4694
(ulong)(strxmov(ptr, "DEFINER=",
4695
quote_name(user_name_str, quoted_user_name_str, FALSE),
4697
quote_name(host_name_str, quoted_host_name_str, FALSE),
4698
" SQL SECURITY ", row[2], NullS) - ptr);
4701
(ulong)(strxmov(ptr, "*/\n/*!50013 DEFINER=",
4702
quote_name(user_name_str, quoted_user_name_str, FALSE),
4704
quote_name(host_name_str, quoted_host_name_str, FALSE),
4705
" SQL SECURITY ", row[2],
4706
" */\n/*!50001", NullS) - ptr);
4707
replace(&ds_view, search_buf, search_len, replace_buf, replace_len);
4710
/* Dump view structure to file */
4713
"/*!50001 SET @saved_cs_client = @@character_set_client */;\n"
4714
"/*!50001 SET @saved_cs_results = @@character_set_results */;\n"
4715
"/*!50001 SET @saved_col_connection = @@collation_connection */;\n"
4716
"/*!50001 SET character_set_client = %s */;\n"
4717
"/*!50001 SET character_set_results = %s */;\n"
4718
"/*!50001 SET collation_connection = %s */;\n"
4720
"/*!50001 SET character_set_client = @saved_cs_client */;\n"
4721
"/*!50001 SET character_set_results = @saved_cs_results */;\n"
4722
"/*!50001 SET collation_connection = @saved_col_connection */;\n",
4723
(const char *) row[3],
4724
(const char *) row[3],
4725
(const char *) row[4],
4726
(const char *) ds_view.str);
4729
mysql_free_result(table_res);
4730
dynstr_free(&ds_view);
4733
if (switch_character_set_results(mysql, default_charset))
4736
/* If a separate .sql file was opened, close it now */
4737
if (sql_file != md_result_file)
4739
fputs("\n", sql_file);
4740
write_footer(sql_file);
4741
my_fclose(sql_file, MYF(MY_WME));
4747
3448
The following functions are wrappers for the dynamic string functions
4748
3449
and if they fail, the wrappers will terminate the current process.