mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge
This commit is contained in:
@ -37,7 +37,7 @@
|
||||
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
|
||||
*/
|
||||
|
||||
#define DUMP_VERSION "10.3"
|
||||
#define DUMP_VERSION "10.4"
|
||||
|
||||
#include <my_global.h>
|
||||
#include <my_sys.h>
|
||||
@ -81,7 +81,7 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick= 1, extended_insert= 1,
|
||||
opt_alldbs=0,opt_create_db=0,opt_first_slave=0,opt_set_names=0,
|
||||
opt_autocommit=0,opt_master_data,opt_disable_keys=1,opt_xml=0,
|
||||
opt_delete_master_logs=0, tty_password=0,
|
||||
opt_single_transaction=0;
|
||||
opt_single_transaction=0, opt_comments= 0;
|
||||
static MYSQL mysql_connection,*sock=0;
|
||||
static char insert_pat[12 * 1024],*opt_password=0,*current_user=0,
|
||||
*current_host=0,*path=0,*fields_terminated=0,
|
||||
@ -276,12 +276,15 @@ static struct my_option my_long_options[] =
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, "",
|
||||
(gptr*) &max_allowed_packet, (gptr*) &max_allowed_packet, 0,
|
||||
GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096, 1024*1024L*1024L,
|
||||
MALLOC_OVERHEAD, 1024, 0},
|
||||
GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096,
|
||||
(longlong) 2L*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
|
||||
{"net_buffer_length", OPT_NET_BUFFER_LENGTH, "",
|
||||
(gptr*) &net_buffer_length, (gptr*) &net_buffer_length, 0,
|
||||
GET_ULONG, REQUIRED_ARG, 1024*1024L-1025, 4096, 16*1024L*1024L,
|
||||
MALLOC_OVERHEAD-1024, 1024, 0},
|
||||
{"comments", 'i', "Write additional information.",
|
||||
(gptr*) &opt_comments, (gptr*) &opt_comments, 0, GET_BOOL, NO_ARG,
|
||||
1, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@ -298,6 +301,8 @@ static int init_dumping(char *);
|
||||
static int dump_databases(char **);
|
||||
static int dump_all_databases();
|
||||
static char *quote_name(const char *name, char *buff, my_bool force);
|
||||
static const char *check_if_ignore_table(const char *table_name);
|
||||
|
||||
|
||||
static void print_version(void)
|
||||
{
|
||||
@ -341,7 +346,7 @@ static void write_header(FILE *sql_file, char *db_name)
|
||||
fputs("<?xml version=\"1.0\"?>\n", sql_file);
|
||||
fputs("<mysqldump>\n", sql_file);
|
||||
}
|
||||
else
|
||||
else if (opt_comments)
|
||||
{
|
||||
fprintf(sql_file, "-- MySQL dump %s\n--\n", DUMP_VERSION);
|
||||
fprintf(sql_file, "-- Host: %s Database: %s\n",
|
||||
@ -652,6 +657,23 @@ static char *quote_name(const char *name, char *buff, my_bool force)
|
||||
} /* quote_name */
|
||||
|
||||
|
||||
|
||||
static char *quote_for_like(const char *name, char *buff)
|
||||
{
|
||||
char *to= buff;
|
||||
*to++= '\'';
|
||||
while (*name)
|
||||
{
|
||||
if (*name == '\'' || *name == '_' || *name == '\\' || *name == '%')
|
||||
*to++= '\\';
|
||||
*to++= *name++;
|
||||
}
|
||||
to[0]= '\'';
|
||||
to[1]= 0;
|
||||
return buff;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Quote and print a string.
|
||||
|
||||
@ -850,7 +872,8 @@ static uint getTableStructure(char *table, char* db)
|
||||
}
|
||||
write_header(sql_file, db);
|
||||
}
|
||||
fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n",
|
||||
if (!opt_xml && opt_comments)
|
||||
fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n",
|
||||
result_table);
|
||||
if (opt_drop)
|
||||
fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n", opt_quoted_table);
|
||||
@ -926,7 +949,7 @@ static uint getTableStructure(char *table, char* db)
|
||||
}
|
||||
write_header(sql_file, db);
|
||||
}
|
||||
if (!opt_xml)
|
||||
if (!opt_xml && opt_comments)
|
||||
fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n",
|
||||
result_table);
|
||||
if (opt_drop)
|
||||
@ -1063,16 +1086,9 @@ static uint getTableStructure(char *table, char* db)
|
||||
/* Get MySQL specific create options */
|
||||
if (create_options)
|
||||
{
|
||||
ulong len= strlen(table);
|
||||
char *tmp= (char*) my_malloc(len * 2 + 1, MYF(MY_WME));
|
||||
if (!tmp)
|
||||
{
|
||||
ignore_errors= 0;
|
||||
safe_exit(EX_MYSQLERR);
|
||||
}
|
||||
mysql_real_escape_string(&mysql_connection, tmp, table, len);
|
||||
sprintf(buff,"show table status like \"%s\"", tmp);
|
||||
my_free(tmp, MYF(MY_WME));
|
||||
char show_name_buff[FN_REFLEN];
|
||||
sprintf(buff,"show table status like %s",
|
||||
quote_for_like(table, show_name_buff));
|
||||
if (mysql_query(sock, buff))
|
||||
{
|
||||
if (mysql_errno(sock) != ER_PARSE_ERROR)
|
||||
@ -1187,11 +1203,23 @@ static void dumpTable(uint numFields, char *table)
|
||||
MYSQL_FIELD *field;
|
||||
MYSQL_ROW row;
|
||||
ulong rownr, row_break, total_length, init_length;
|
||||
const char *table_type;
|
||||
|
||||
result_table= quote_name(table,table_buff, 1);
|
||||
opt_quoted_table= quote_name(table, table_buff2, 0);
|
||||
|
||||
/* Check table type */
|
||||
if ((table_type= check_if_ignore_table(table)))
|
||||
{
|
||||
if (verbose)
|
||||
fprintf(stderr,
|
||||
"-- Skipping data for table '%s' because it's of type %s\n",
|
||||
table, table_type);
|
||||
return;
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
fprintf(stderr, "-- Sending SELECT query...\n");
|
||||
result_table= quote_name(table,table_buff, 1);
|
||||
opt_quoted_table= quote_name(table, table_buff2, 0);
|
||||
if (path)
|
||||
{
|
||||
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
|
||||
@ -1230,14 +1258,14 @@ static void dumpTable(uint numFields, char *table)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!opt_xml)
|
||||
if (!opt_xml && opt_comments)
|
||||
fprintf(md_result_file,"\n--\n-- Dumping data for table %s\n--\n",
|
||||
result_table);
|
||||
sprintf(query, "SELECT /*!40001 SQL_NO_CACHE */ * FROM %s",
|
||||
result_table);
|
||||
if (where)
|
||||
{
|
||||
if (!opt_xml)
|
||||
if (!opt_xml && opt_comments)
|
||||
fprintf(md_result_file,"-- WHERE: %s\n",where);
|
||||
strxmov(strend(query), " WHERE ",where,NullS);
|
||||
}
|
||||
@ -1333,11 +1361,23 @@ static void dumpTable(uint numFields, char *table)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* change any strings ("inf","nan",..) into NULL */
|
||||
/* change any strings ("inf", "-inf", "nan") into NULL */
|
||||
char *ptr = row[i];
|
||||
dynstr_append(&extended_row,
|
||||
(!my_isalpha(charset_info,*ptr)) ?
|
||||
ptr : "NULL");
|
||||
if (my_isalpha(charset_info, *ptr) || (*ptr == '-' &&
|
||||
my_isalpha(charset_info, ptr[1])))
|
||||
dynstr_append(&extended_row, "NULL");
|
||||
else
|
||||
{
|
||||
if (field->type == FIELD_TYPE_DECIMAL)
|
||||
{
|
||||
/* add " signs around */
|
||||
dynstr_append(&extended_row, "\"");
|
||||
dynstr_append(&extended_row, ptr);
|
||||
dynstr_append(&extended_row, "\"");
|
||||
}
|
||||
else
|
||||
dynstr_append(&extended_row, ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1369,7 +1409,7 @@ static void dumpTable(uint numFields, char *table)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* change any strings ("inf","nan",..) into NULL */
|
||||
/* change any strings ("inf", "-inf", "nan") into NULL */
|
||||
char *ptr = row[i];
|
||||
if (opt_xml)
|
||||
{
|
||||
@ -1379,19 +1419,20 @@ static void dumpTable(uint numFields, char *table)
|
||||
md_result_file);
|
||||
fputs("</field>\n", md_result_file);
|
||||
}
|
||||
else if (my_isalpha(charset_info, *ptr) ||
|
||||
(*ptr == '-' && my_isalpha(charset_info, ptr[1])))
|
||||
fputs("NULL", md_result_file);
|
||||
else if (field->type == FIELD_TYPE_DECIMAL)
|
||||
{
|
||||
/* add " signs around */
|
||||
fputs("\"", md_result_file);
|
||||
fputs(ptr, md_result_file);
|
||||
fputs("\"", md_result_file);
|
||||
}
|
||||
else
|
||||
fputs((!my_isalpha(charset_info,*ptr)) ?
|
||||
ptr : "NULL", md_result_file);
|
||||
fputs(ptr, md_result_file);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (opt_xml)
|
||||
print_xml_tag1(md_result_file, "\t\t", "field name=",
|
||||
field->name, "NULL</field>\n");
|
||||
else
|
||||
fputs("NULL", md_result_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1529,8 +1570,8 @@ static int init_dumping(char *database)
|
||||
*/
|
||||
char quoted_database_buf[64*2+3];
|
||||
char *qdatabase= quote_name(database,quoted_database_buf,opt_quoted);
|
||||
|
||||
fprintf(md_result_file,"\n--\n-- Current Database: %s\n--\n", qdatabase);
|
||||
if (opt_comments)
|
||||
fprintf(md_result_file,"\n--\n-- Current Database: %s\n--\n", qdatabase);
|
||||
if (!opt_create_db)
|
||||
{
|
||||
char qbuf[256];
|
||||
@ -1726,6 +1767,61 @@ static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row,
|
||||
} /* print_value */
|
||||
|
||||
|
||||
/*
|
||||
Check if we the table is one of the table types that should be ignored:
|
||||
MRG_ISAM, MRG_MYISAM
|
||||
|
||||
SYNOPSIS
|
||||
check_if_ignore_table()
|
||||
table_name Table name to check
|
||||
|
||||
GLOBAL VARIABLES
|
||||
sock MySQL socket
|
||||
verbose Write warning messages
|
||||
|
||||
RETURN
|
||||
0 Table should be backuped
|
||||
# Type of table (that should be skipped)
|
||||
*/
|
||||
|
||||
static const char *check_if_ignore_table(const char *table_name)
|
||||
{
|
||||
char buff[FN_REFLEN+80], show_name_buff[FN_REFLEN];
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
const char *result= 0;
|
||||
|
||||
sprintf(buff,"show table status like %s",
|
||||
quote_for_like(table_name, show_name_buff));
|
||||
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_name,mysql_error(sock));
|
||||
return 0; /* assume table is ok */
|
||||
}
|
||||
}
|
||||
if (!(res= mysql_store_result(sock)) ||
|
||||
!(row= mysql_fetch_row(res)))
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Error: Couldn't read status information for table %s (%s)\n",
|
||||
table_name, mysql_error(sock));
|
||||
if (res)
|
||||
mysql_free_result(res);
|
||||
return 0; /* assume table is ok */
|
||||
}
|
||||
if (strcmp(row[1], (result= "MRG_MyISAM")) &&
|
||||
strcmp(row[1], (result= "MRG_ISAM")))
|
||||
result= 0;
|
||||
mysql_free_result(res);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
MYSQL_ROW row;
|
||||
@ -1795,8 +1891,9 @@ int main(int argc, char **argv)
|
||||
row = mysql_fetch_row(master);
|
||||
if (row && row[0] && row[1])
|
||||
{
|
||||
fprintf(md_result_file,
|
||||
"\n--\n-- Position to start replication from\n--\n\n");
|
||||
if (opt_comments)
|
||||
fprintf(md_result_file,
|
||||
"\n--\n-- Position to start replication from\n--\n\n");
|
||||
fprintf(md_result_file,
|
||||
"CHANGE MASTER TO MASTER_LOG_FILE='%s', \
|
||||
MASTER_LOG_POS=%s ;\n",row[0],row[1]);
|
||||
|
Reference in New Issue
Block a user