mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Folow up on the CS patch:
1. Fix ddl_i18n_koi8r, ddl_i18n_utf8: explicitly specify character-sets directory for mysqldump; 2. Fix crash in mysqldump if collation is not found; 3. Use proper way to compare character set names.
This commit is contained in:
@ -1066,12 +1066,16 @@ static int switch_db_collation(FILE *sql_file,
|
||||
const char *db_name,
|
||||
const char *delimiter,
|
||||
const char *current_db_cl_name,
|
||||
const char *required_db_cl_name)
|
||||
const char *required_db_cl_name,
|
||||
int *db_cl_altered)
|
||||
{
|
||||
if (strcmp(current_db_cl_name, required_db_cl_name) != 0)
|
||||
{
|
||||
CHARSET_INFO *db_cl= get_charset_by_name(required_db_cl_name, MYF(0));
|
||||
|
||||
if (!db_cl)
|
||||
return 1;
|
||||
|
||||
fprintf(sql_file,
|
||||
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
|
||||
(const char *) db_name,
|
||||
@ -1079,26 +1083,35 @@ static int switch_db_collation(FILE *sql_file,
|
||||
(const char *) db_cl->name,
|
||||
(const char *) delimiter);
|
||||
|
||||
return 1;
|
||||
*db_cl_altered= 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
*db_cl_altered= 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void restore_db_collation(FILE *sql_file,
|
||||
const char *db_name,
|
||||
const char *delimiter,
|
||||
const char *db_cl_name)
|
||||
static int restore_db_collation(FILE *sql_file,
|
||||
const char *db_name,
|
||||
const char *delimiter,
|
||||
const char *db_cl_name)
|
||||
{
|
||||
CHARSET_INFO *db_cl= get_charset_by_name(db_cl_name, MYF(0));
|
||||
|
||||
if (!db_cl)
|
||||
return 1;
|
||||
|
||||
fprintf(sql_file,
|
||||
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
|
||||
(const char *) db_name,
|
||||
(const char *) db_cl->csname,
|
||||
(const char *) db_cl->name,
|
||||
(const char *) delimiter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -1724,11 +1737,11 @@ static uint dump_events_for_db(char *db)
|
||||
|
||||
fprintf(sql_file, "DELIMITER %s\n", delimiter);
|
||||
|
||||
db_cl_altered= switch_db_collation(sql_file,
|
||||
db_name_buff,
|
||||
delimiter,
|
||||
db_cl_name,
|
||||
row[6]);
|
||||
if (switch_db_collation(sql_file, db_name_buff, delimiter, db_cl_name,
|
||||
row[6], &db_cl_altered))
|
||||
{
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
switch_cs_variables(sql_file, delimiter,
|
||||
row[4], /* character_set_client */
|
||||
@ -1749,7 +1762,11 @@ static uint dump_events_for_db(char *db)
|
||||
restore_cs_variables(sql_file, delimiter);
|
||||
|
||||
if (db_cl_altered)
|
||||
restore_db_collation(sql_file, db_name_buff, delimiter, db_cl_name);
|
||||
{
|
||||
if (restore_db_collation(sql_file, db_name_buff, delimiter,
|
||||
db_cl_name))
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
} /* end of event printing */
|
||||
mysql_free_result(event_res);
|
||||
@ -1935,8 +1952,11 @@ static uint dump_routines_for_db(char *db)
|
||||
PROCEDURE/FUNCTION otherwise we may need to re-quote routine_name
|
||||
*/
|
||||
|
||||
db_cl_altered= switch_db_collation(sql_file, db_name_buff, ";",
|
||||
db_cl_name, row[5]);
|
||||
if (switch_db_collation(sql_file, db_name_buff, ";",
|
||||
db_cl_name, row[5], &db_cl_altered))
|
||||
{
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
switch_cs_variables(sql_file, ";",
|
||||
row[3], /* character_set_client */
|
||||
@ -1955,7 +1975,10 @@ static uint dump_routines_for_db(char *db)
|
||||
restore_cs_variables(sql_file, ";");
|
||||
|
||||
if (db_cl_altered)
|
||||
restore_db_collation(sql_file, db_name_buff, ";", db_cl_name);
|
||||
{
|
||||
if (restore_db_collation(sql_file, db_name_buff, ";", db_cl_name))
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
my_free(query_str, MYF(MY_ALLOW_ZERO_PTR));
|
||||
}
|
||||
@ -2581,8 +2604,9 @@ static void dump_triggers_for_table(char *table, char *db_name)
|
||||
}
|
||||
}
|
||||
|
||||
db_cl_altered= switch_db_collation(sql_file, db_name, ";",
|
||||
db_cl_name, row[5]);
|
||||
if (switch_db_collation(sql_file, db_name, ";",
|
||||
db_cl_name, row[5], &db_cl_altered))
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
switch_cs_variables(sql_file, ";",
|
||||
row[3], /* character_set_client */
|
||||
@ -2601,7 +2625,10 @@ static void dump_triggers_for_table(char *table, char *db_name)
|
||||
restore_cs_variables(sql_file, ";");
|
||||
|
||||
if (db_cl_altered)
|
||||
restore_db_collation(sql_file, db_name, ";", db_cl_name);
|
||||
{
|
||||
if (restore_db_collation(sql_file, db_name, ";", db_cl_name))
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
my_free(query_str, MYF(MY_ALLOW_ZERO_PTR));
|
||||
}
|
||||
|
Reference in New Issue
Block a user