mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
mysqldump.c Dumping via SHOW CREATE added.
Autofallback to the old behaviour for pre-3.23.26 servers. client/mysqldump.c: Dumping via SHOW CREATE added. Autofallback to the old behaviour for pre-3.23.26 servers.
This commit is contained in:
@@ -594,176 +594,258 @@ static uint getTableStructure(char *table, char* db)
|
|||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "# Retrieving table structure for table %s...\n", table);
|
fprintf(stderr, "# Retrieving table structure for table %s...\n", table);
|
||||||
|
|
||||||
|
sprintf(insert_pat,"SET OPTION SQL_QUOTE_SHOW_CREATE=%d", opt_quoted);
|
||||||
table_name=quote_name(table,table_buff);
|
table_name=quote_name(table,table_buff);
|
||||||
sprintf(insert_pat,"show fields from %s",table_name);
|
|
||||||
if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock)))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: Can't get info about table: '%s'\nerror: %s\n",
|
|
||||||
my_progname, table, mysql_error(sock));
|
|
||||||
safe_exit(EX_MYSQLERR);
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make an sql-file, if path was given iow. option -T was given */
|
if (mysql_query(sock,insert_pat))
|
||||||
if (!tFlag)
|
|
||||||
{
|
{
|
||||||
if (path)
|
/* using SHOW CREATE statement */
|
||||||
{
|
|
||||||
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
|
|
||||||
strmov(tmp_path,path);
|
|
||||||
convert_dirname(tmp_path);
|
|
||||||
sql_file= my_fopen(fn_format(filename, table, tmp_path, ".sql", 4),
|
|
||||||
O_WRONLY, MYF(MY_WME));
|
|
||||||
if (!sql_file) /* If file couldn't be opened */
|
|
||||||
{
|
|
||||||
safe_exit(EX_MYSQLERR);
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
|
||||||
write_heder(sql_file, db);
|
|
||||||
}
|
|
||||||
fprintf(sql_file, "\n#\n# Table structure for table '%s'\n#\n\n", table);
|
|
||||||
if (opt_drop)
|
|
||||||
fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n",table_name);
|
|
||||||
fprintf(sql_file, "CREATE TABLE %s (\n", table_name);
|
|
||||||
}
|
|
||||||
if (cFlag)
|
|
||||||
sprintf(insert_pat, "INSERT %sINTO %s (", delayed, table_name);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf(insert_pat, "INSERT %sINTO %s VALUES ", delayed, table_name);
|
|
||||||
if (!extended_insert)
|
|
||||||
strcat(insert_pat,"(");
|
|
||||||
}
|
|
||||||
|
|
||||||
strpos=strend(insert_pat);
|
|
||||||
while ((row=mysql_fetch_row(tableRes)))
|
|
||||||
{
|
|
||||||
ulong *lengths=mysql_fetch_lengths(tableRes);
|
|
||||||
if (init)
|
|
||||||
{
|
|
||||||
if (!tFlag)
|
|
||||||
fputs(",\n",sql_file);
|
|
||||||
if (cFlag)
|
|
||||||
strpos=strmov(strpos,", ");
|
|
||||||
}
|
|
||||||
init=1;
|
|
||||||
if (cFlag)
|
|
||||||
strpos=strmov(strpos,quote_name(row[SHOW_FIELDNAME],name_buff));
|
|
||||||
if (!tFlag)
|
if (!tFlag)
|
||||||
{
|
{
|
||||||
if (opt_keywords)
|
/* Make an sql-file, if path was given iow. option -T was given */
|
||||||
fprintf(sql_file, " %s.%s %s", table_name,
|
char buff[20+FN_REFLEN];
|
||||||
quote_name(row[SHOW_FIELDNAME],name_buff), row[SHOW_TYPE]);
|
|
||||||
else
|
sprintf(buff,"show create table %s",table_name);
|
||||||
fprintf(sql_file, " %s %s", quote_name(row[SHOW_FIELDNAME],name_buff),
|
if (mysql_query(sock, buff))
|
||||||
row[SHOW_TYPE]);
|
|
||||||
if (row[SHOW_DEFAULT])
|
|
||||||
{
|
{
|
||||||
fputs(" DEFAULT ", sql_file);
|
fprintf(stderr, "%s: Can't get CREATE TABLE for table '%s' (%s)\n",
|
||||||
unescape(sql_file,row[SHOW_DEFAULT],lengths[SHOW_DEFAULT]);
|
my_progname, table, mysql_error(sock));
|
||||||
|
safe_exit(EX_MYSQLERR);
|
||||||
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
if (!row[SHOW_NULL][0])
|
|
||||||
fputs(" NOT NULL", sql_file);
|
if (path)
|
||||||
if (row[SHOW_EXTRA][0])
|
{
|
||||||
fprintf(sql_file, " %s",row[SHOW_EXTRA]);
|
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
|
||||||
|
strmov(tmp_path,path);
|
||||||
|
convert_dirname(tmp_path);
|
||||||
|
sql_file= my_fopen(fn_format(filename, table, tmp_path, ".sql", 4),
|
||||||
|
O_WRONLY, MYF(MY_WME));
|
||||||
|
if (!sql_file) /* If file couldn't be opened */
|
||||||
|
{
|
||||||
|
safe_exit(EX_MYSQLERR);
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
write_heder(sql_file, db);
|
||||||
|
}
|
||||||
|
fprintf(sql_file, "\n#\n# Table structure for table '%s'\n#\n\n", table);
|
||||||
|
if (opt_drop)
|
||||||
|
fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n",table_name);
|
||||||
|
|
||||||
|
tableRes=mysql_store_result(sock);
|
||||||
|
row=mysql_fetch_row(tableRes);
|
||||||
|
fprintf(sql_file, "%s;\n", row[1]);
|
||||||
|
mysql_free_result(tableRes);
|
||||||
}
|
}
|
||||||
}
|
sprintf(insert_pat,"show fields from %s",table_name);
|
||||||
numFields = (uint) mysql_num_rows(tableRes);
|
if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock)))
|
||||||
mysql_free_result(tableRes);
|
|
||||||
if (!tFlag)
|
|
||||||
{
|
|
||||||
/* Make an sql-file, if path was given iow. option -T was given */
|
|
||||||
char buff[20+FN_REFLEN];
|
|
||||||
uint keynr,primary_key;
|
|
||||||
sprintf(buff,"show keys from %s",table_name);
|
|
||||||
if (mysql_query(sock, buff))
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: Can't get keys for table '%s' (%s)\n",
|
fprintf(stderr, "%s: Can't get info about table: '%s'\nerror: %s\n",
|
||||||
my_progname, table, mysql_error(sock));
|
my_progname, table, mysql_error(sock));
|
||||||
if (sql_file != stdout)
|
|
||||||
my_fclose(sql_file, MYF(MY_WME));
|
|
||||||
safe_exit(EX_MYSQLERR);
|
safe_exit(EX_MYSQLERR);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tableRes=mysql_store_result(sock);
|
if (cFlag)
|
||||||
/* Find first which key is primary key */
|
sprintf(insert_pat, "INSERT %sINTO %s (", delayed, table_name);
|
||||||
keynr=0;
|
else
|
||||||
primary_key=INT_MAX;
|
|
||||||
while ((row=mysql_fetch_row(tableRes)))
|
|
||||||
{
|
{
|
||||||
if (atoi(row[3]) == 1)
|
sprintf(insert_pat, "INSERT %sINTO %s VALUES ", delayed, table_name);
|
||||||
{
|
if (!extended_insert)
|
||||||
keynr++;
|
strcat(insert_pat,"(");
|
||||||
#ifdef FORCE_PRIMARY_KEY
|
|
||||||
if (atoi(row[1]) == 0 && primary_key == INT_MAX)
|
|
||||||
primary_key=keynr;
|
|
||||||
#endif
|
|
||||||
if (!strcmp(row[2],"PRIMARY"))
|
|
||||||
{
|
|
||||||
primary_key=keynr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mysql_data_seek(tableRes,0);
|
|
||||||
keynr=0;
|
|
||||||
while ((row=mysql_fetch_row(tableRes)))
|
|
||||||
{
|
|
||||||
if (atoi(row[3]) == 1)
|
|
||||||
{
|
|
||||||
if (keynr++)
|
|
||||||
putc(')', sql_file);
|
|
||||||
if (atoi(row[1])) /* Test if duplicate key */
|
|
||||||
/* Duplicate allowed */
|
|
||||||
fprintf(sql_file, ",\n KEY %s (",quote_name(row[2],name_buff));
|
|
||||||
else if (keynr == primary_key)
|
|
||||||
fputs(",\n PRIMARY KEY (",sql_file); /* First UNIQUE is primary */
|
|
||||||
else
|
|
||||||
fprintf(sql_file, ",\n UNIQUE %s (",quote_name(row[2],name_buff));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
putc(',', sql_file);
|
|
||||||
fputs(quote_name(row[4],name_buff), sql_file);
|
|
||||||
if (row[7])
|
|
||||||
fprintf(sql_file, "(%s)",row[7]); /* Sub key */
|
|
||||||
}
|
|
||||||
if (keynr)
|
|
||||||
putc(')', sql_file);
|
|
||||||
fputs("\n)",sql_file);
|
|
||||||
|
|
||||||
/* Get MySQL specific create options */
|
strpos=strend(insert_pat);
|
||||||
if (create_options)
|
while ((row=mysql_fetch_row(tableRes)))
|
||||||
{
|
{
|
||||||
sprintf(buff,"show table status like '%s'",table);
|
ulong *lengths=mysql_fetch_lengths(tableRes);
|
||||||
|
if (init)
|
||||||
|
{
|
||||||
|
if (cFlag)
|
||||||
|
strpos=strmov(strpos,", ");
|
||||||
|
}
|
||||||
|
init=1;
|
||||||
|
if (cFlag)
|
||||||
|
strpos=strmov(strpos,quote_name(row[SHOW_FIELDNAME],name_buff));
|
||||||
|
}
|
||||||
|
numFields = (uint) mysql_num_rows(tableRes);
|
||||||
|
mysql_free_result(tableRes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* fprintf(stderr, "%s: Can't set SQL_QUOTE_SHOW_CREATE option (%s)\n",
|
||||||
|
my_progname, mysql_error(sock)); */
|
||||||
|
|
||||||
|
sprintf(insert_pat,"show fields from %s",table_name);
|
||||||
|
if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock)))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Can't get info about table: '%s'\nerror: %s\n",
|
||||||
|
my_progname, table, mysql_error(sock));
|
||||||
|
safe_exit(EX_MYSQLERR);
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make an sql-file, if path was given iow. option -T was given */
|
||||||
|
if (!tFlag)
|
||||||
|
{
|
||||||
|
if (path)
|
||||||
|
{
|
||||||
|
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
|
||||||
|
strmov(tmp_path,path);
|
||||||
|
convert_dirname(tmp_path);
|
||||||
|
sql_file= my_fopen(fn_format(filename, table, tmp_path, ".sql", 4),
|
||||||
|
O_WRONLY, MYF(MY_WME));
|
||||||
|
if (!sql_file) /* If file couldn't be opened */
|
||||||
|
{
|
||||||
|
safe_exit(EX_MYSQLERR);
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
write_heder(sql_file, db);
|
||||||
|
}
|
||||||
|
fprintf(sql_file, "\n#\n# Table structure for table '%s'\n#\n\n", table);
|
||||||
|
if (opt_drop)
|
||||||
|
fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n",table_name);
|
||||||
|
fprintf(sql_file, "CREATE TABLE %s (\n", table_name);
|
||||||
|
}
|
||||||
|
if (cFlag)
|
||||||
|
sprintf(insert_pat, "INSERT %sINTO %s (", delayed, table_name);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf(insert_pat, "INSERT %sINTO %s VALUES ", delayed, table_name);
|
||||||
|
if (!extended_insert)
|
||||||
|
strcat(insert_pat,"(");
|
||||||
|
}
|
||||||
|
|
||||||
|
strpos=strend(insert_pat);
|
||||||
|
while ((row=mysql_fetch_row(tableRes)))
|
||||||
|
{
|
||||||
|
ulong *lengths=mysql_fetch_lengths(tableRes);
|
||||||
|
if (init)
|
||||||
|
{
|
||||||
|
if (!tFlag)
|
||||||
|
fputs(",\n",sql_file);
|
||||||
|
if (cFlag)
|
||||||
|
strpos=strmov(strpos,", ");
|
||||||
|
}
|
||||||
|
init=1;
|
||||||
|
if (cFlag)
|
||||||
|
strpos=strmov(strpos,quote_name(row[SHOW_FIELDNAME],name_buff));
|
||||||
|
if (!tFlag)
|
||||||
|
{
|
||||||
|
if (opt_keywords)
|
||||||
|
fprintf(sql_file, " %s.%s %s", table_name,
|
||||||
|
quote_name(row[SHOW_FIELDNAME],name_buff), row[SHOW_TYPE]);
|
||||||
|
else
|
||||||
|
fprintf(sql_file, " %s %s", quote_name(row[SHOW_FIELDNAME],name_buff),
|
||||||
|
row[SHOW_TYPE]);
|
||||||
|
if (row[SHOW_DEFAULT])
|
||||||
|
{
|
||||||
|
fputs(" DEFAULT ", sql_file);
|
||||||
|
unescape(sql_file,row[SHOW_DEFAULT],lengths[SHOW_DEFAULT]);
|
||||||
|
}
|
||||||
|
if (!row[SHOW_NULL][0])
|
||||||
|
fputs(" NOT NULL", sql_file);
|
||||||
|
if (row[SHOW_EXTRA][0])
|
||||||
|
fprintf(sql_file, " %s",row[SHOW_EXTRA]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
numFields = (uint) mysql_num_rows(tableRes);
|
||||||
|
mysql_free_result(tableRes);
|
||||||
|
if (!tFlag)
|
||||||
|
{
|
||||||
|
/* Make an sql-file, if path was given iow. option -T was given */
|
||||||
|
char buff[20+FN_REFLEN];
|
||||||
|
uint keynr,primary_key;
|
||||||
|
sprintf(buff,"show keys from %s",table_name);
|
||||||
if (mysql_query(sock, buff))
|
if (mysql_query(sock, buff))
|
||||||
{
|
{
|
||||||
if (mysql_errno(sock) != ER_PARSE_ERROR)
|
fprintf(stderr, "%s: Can't get keys for table '%s' (%s)\n",
|
||||||
{ /* If old MySQL version */
|
my_progname, table, mysql_error(sock));
|
||||||
if (verbose)
|
if (sql_file != stdout)
|
||||||
fprintf(stderr,
|
my_fclose(sql_file, MYF(MY_WME));
|
||||||
"# Warning: Couldn't get status information for table '%s' (%s)\n",
|
safe_exit(EX_MYSQLERR);
|
||||||
table,mysql_error(sock));
|
DBUG_RETURN(0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (!(tableRes=mysql_store_result(sock)) ||
|
|
||||||
!(row=mysql_fetch_row(tableRes)))
|
tableRes=mysql_store_result(sock);
|
||||||
|
/* Find first which key is primary key */
|
||||||
|
keynr=0;
|
||||||
|
primary_key=INT_MAX;
|
||||||
|
while ((row=mysql_fetch_row(tableRes)))
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
if (atoi(row[3]) == 1)
|
||||||
"Error: Couldn't read status information for table '%s' (%s)\n",
|
{
|
||||||
table,mysql_error(sock));
|
keynr++;
|
||||||
|
#ifdef FORCE_PRIMARY_KEY
|
||||||
|
if (atoi(row[1]) == 0 && primary_key == INT_MAX)
|
||||||
|
primary_key=keynr;
|
||||||
|
#endif
|
||||||
|
if (!strcmp(row[2],"PRIMARY"))
|
||||||
|
{
|
||||||
|
primary_key=keynr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
mysql_data_seek(tableRes,0);
|
||||||
|
keynr=0;
|
||||||
|
while ((row=mysql_fetch_row(tableRes)))
|
||||||
{
|
{
|
||||||
fputs("/*!",sql_file);
|
if (atoi(row[3]) == 1)
|
||||||
print_value(sql_file,tableRes,row,"type=","Type",0);
|
{
|
||||||
print_value(sql_file,tableRes,row,"","Create_options",0);
|
if (keynr++)
|
||||||
print_value(sql_file,tableRes,row,"comment=","Comment",1);
|
putc(')', sql_file);
|
||||||
fputs(" */",sql_file);
|
if (atoi(row[1])) /* Test if duplicate key */
|
||||||
|
/* Duplicate allowed */
|
||||||
|
fprintf(sql_file, ",\n KEY %s (",quote_name(row[2],name_buff));
|
||||||
|
else if (keynr == primary_key)
|
||||||
|
fputs(",\n PRIMARY KEY (",sql_file); /* First UNIQUE is primary */
|
||||||
|
else
|
||||||
|
fprintf(sql_file, ",\n UNIQUE %s (",quote_name(row[2],name_buff));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
putc(',', sql_file);
|
||||||
|
fputs(quote_name(row[4],name_buff), sql_file);
|
||||||
|
if (row[7])
|
||||||
|
fprintf(sql_file, "(%s)",row[7]); /* Sub key */
|
||||||
}
|
}
|
||||||
mysql_free_result(tableRes); /* Is always safe to free */
|
if (keynr)
|
||||||
|
putc(')', sql_file);
|
||||||
|
fputs("\n)",sql_file);
|
||||||
|
|
||||||
|
/* Get MySQL specific create options */
|
||||||
|
if (create_options)
|
||||||
|
{
|
||||||
|
sprintf(buff,"show table status like '%s'",table);
|
||||||
|
if (mysql_query(sock, buff))
|
||||||
|
{
|
||||||
|
if (mysql_errno(sock) != ER_PARSE_ERROR)
|
||||||
|
{ /* If old MySQL version */
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr,
|
||||||
|
"# Warning: Couldn't get status information for table '%s' (%s)\n",
|
||||||
|
table,mysql_error(sock));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!(tableRes=mysql_store_result(sock)) ||
|
||||||
|
!(row=mysql_fetch_row(tableRes)))
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error: Couldn't read status information for table '%s' (%s)\n",
|
||||||
|
table,mysql_error(sock));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fputs("/*!",sql_file);
|
||||||
|
print_value(sql_file,tableRes,row,"type=","Type",0);
|
||||||
|
print_value(sql_file,tableRes,row,"","Create_options",0);
|
||||||
|
print_value(sql_file,tableRes,row,"comment=","Comment",1);
|
||||||
|
fputs(" */",sql_file);
|
||||||
|
}
|
||||||
|
mysql_free_result(tableRes); /* Is always safe to free */
|
||||||
|
}
|
||||||
|
fputs(";\n", sql_file);
|
||||||
}
|
}
|
||||||
fputs(";\n", sql_file);
|
|
||||||
}
|
}
|
||||||
if (cFlag)
|
if (cFlag)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user