20 #include "my_global.h"
24 #include "sql_cache.h"
26 #include "sql_table.h"
28 #include "sql_rename.h"
33 #include "sql_handler.h"
34 #include <mysys_err.h>
47 #define MAX_DROP_TABLE_Q_LEN 1024
49 const char *del_exts[]= {
".frm",
".BAK",
".TMD",
".opt",
".OLD", NullS};
50 static TYPELIB deletable_extentions=
51 {array_elements(del_exts)-1,
"del_exts", del_exts, NULL};
53 static bool find_db_tables_and_rm_known_files(THD *thd,
MY_DIR *dirp,
57 bool *found_other_files);
59 long mysql_rm_arc_files(THD *thd,
MY_DIR *dirp,
const char *org_path);
60 static my_bool rm_dir_w_symlink(
const char *org_path, my_bool send_error);
61 static void mysql_change_db_impl(THD *thd,
68 static HASH dboptions;
69 static my_bool dboptions_init= 0;
85 extern "C" uchar* dboptions_get_key(
my_dbopt_t *opt,
size_t *length,
88 uchar* dboptions_get_key(
my_dbopt_t *opt,
size_t *length,
89 my_bool not_used __attribute__((unused)))
91 *length= opt->name_length;
92 return (uchar*) opt->name;
100 static inline int write_to_binlog(THD *thd,
char *
query, uint q_len,
101 char *db, uint db_len)
105 qinfo.db_len= db_len;
114 extern "C" void free_dbopt(
void *dbopt);
116 void free_dbopt(
void *dbopt)
121 #ifdef HAVE_PSI_INTERFACE
122 static PSI_rwlock_key key_rwlock_LOCK_dboptions;
124 static PSI_rwlock_info all_database_names_rwlocks[]=
126 { &key_rwlock_LOCK_dboptions,
"LOCK_dboptions", PSI_FLAG_GLOBAL}
129 static void init_database_names_psi_keys(
void)
131 const char* category=
"sql";
134 count= array_elements(all_database_names_rwlocks);
148 bool my_dboptions_cache_init(
void)
150 #ifdef HAVE_PSI_INTERFACE
151 init_database_names_psi_keys();
159 error= my_hash_init(&dboptions, lower_case_table_names ?
160 &my_charset_bin : system_charset_info,
161 32, 0, 0, (my_hash_get_key) dboptions_get_key,
173 void my_dboptions_cache_free(
void)
178 my_hash_free(&dboptions);
188 void my_dbopt_cleanup(
void)
191 my_hash_free(&dboptions);
192 my_hash_init(&dboptions, lower_case_table_names ?
193 &my_charset_bin : system_charset_info,
194 32, 0, 0, (my_hash_get_key) dboptions_get_key,
212 static my_bool get_dbopt(
const char *dbname,
HA_CREATE_INFO *create)
218 length= (uint) strlen(dbname);
221 if ((opt= (
my_dbopt_t*) my_hash_search(&dboptions, (uchar*) dbname, length)))
223 create->default_table_charset= opt->charset;
243 static my_bool put_dbopt(
const char *dbname,
HA_CREATE_INFO *create)
248 DBUG_ENTER(
"put_dbopt");
250 length= (uint) strlen(dbname);
253 if (!(opt= (
my_dbopt_t*) my_hash_search(&dboptions, (uchar*) dbname,
258 if (!my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
259 &opt, (uint)
sizeof(*opt), &tmp_name, (uint) length+1,
267 strmov(opt->name, dbname);
268 opt->name_length= length;
270 if ((error= my_hash_insert(&dboptions, (uchar*) opt)))
278 opt->charset= create->default_table_charset;
290 static void del_dbopt(
const char *path)
294 if ((opt= (
my_dbopt_t *)my_hash_search(&dboptions, (
const uchar*) path,
296 my_hash_delete(&dboptions, (uchar*) opt);
312 static bool write_db_opt(THD *thd,
const char *path,
HA_CREATE_INFO *create)
318 if (!create->default_table_charset)
319 create->default_table_charset= thd->variables.collation_server;
321 if (put_dbopt(path, create))
325 O_RDWR | O_TRUNC, MYF(MY_WME))) >= 0)
328 length= (ulong) (strxnmov(buf,
sizeof(buf)-1,
"default-character-set=",
329 create->default_table_charset->csname,
330 "\ndefault-collation=",
331 create->default_table_charset->name,
358 bool load_db_opt(THD *thd,
const char *path,
HA_CREATE_INFO *create)
362 DBUG_ENTER(
"load_db_opt");
366 memset(create, 0,
sizeof(*create));
367 create->default_table_charset= thd->variables.collation_server;
370 if (!get_dbopt(path, create))
375 path, O_RDONLY | O_SHARE, MYF(0))) < 0)
379 if (init_io_cache(&cache, file, IO_SIZE, READ_CACHE, 0, 0, MYF(0)))
382 while ((
int) (nbytes= my_b_gets(&cache, (
char*) buf,
sizeof(buf))) > 0)
384 char *pos= buf+nbytes-1;
386 while (pos > buf && !my_isgraph(&my_charset_latin1, pos[-1]))
389 if ((pos= strchr(buf,
'=')))
391 if (!strncmp(buf,
"default-character-set", (pos-buf)))
400 if (!(create->default_table_charset=
401 get_charset_by_csname(pos+1, MY_CS_PRIMARY, MYF(0))) &&
402 !(create->default_table_charset=
403 get_charset_by_name(pos+1, MYF(0))))
405 sql_print_error(
"Error while loading database options: '%s':",path);
406 sql_print_error(ER(ER_UNKNOWN_CHARACTER_SET),pos+1);
407 create->default_table_charset= default_charset_info;
410 else if (!strncmp(buf,
"default-collation", (pos-buf)))
412 if (!(create->default_table_charset= get_charset_by_name(pos+1,
415 sql_print_error(
"Error while loading database options: '%s':",path);
416 sql_print_error(ER(ER_UNKNOWN_COLLATION),pos+1);
417 create->default_table_charset= default_charset_info;
429 error= put_dbopt(path, create);
431 end_io_cache(&cache);
469 bool load_db_opt_by_name(THD *thd,
const char *db_name,
472 char db_opt_path[FN_REFLEN + 1];
478 (void) build_table_filename(db_opt_path,
sizeof(db_opt_path) - 1,
479 db_name,
"", MY_DB_OPT_FILE, 0);
481 return load_db_opt(thd, db_opt_path, db_create_info);
495 const CHARSET_INFO *get_default_db_collation(THD *thd,
const char *db_name)
499 if (thd->db != NULL && strcmp(db_name, thd->db) == 0)
500 return thd->db_charset;
502 load_db_opt_by_name(thd, db_name, &db_info);
512 return db_info.default_table_charset;
540 int mysql_create_db(THD *thd,
char *db,
HA_CREATE_INFO *create_info,
543 char path[FN_REFLEN+16];
544 char tmp_query[FN_REFLEN+16];
548 uint create_options= create_info ? create_info->options : 0;
551 DBUG_ENTER(
"mysql_create_db");
554 if (is_infoschema_db(db))
556 my_error(ER_DB_CREATE_EXISTS, MYF(0), db);
564 path_len= build_table_filename(path,
sizeof(path) - 1, db,
"",
"", 0,
568 my_error(ER_IDENT_CAUSES_TOO_LONG_PATH, MYF(0),
sizeof(path)-1, path);
575 if (!(create_options & HA_LEX_CREATE_IF_NOT_EXISTS))
577 my_error(ER_DB_CREATE_EXISTS, MYF(0), db);
581 push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
582 ER_DB_CREATE_EXISTS, ER(ER_DB_CREATE_EXISTS), db);
588 if (my_errno != ENOENT)
590 char errbuf[MYSYS_STRERROR_SIZE];
591 my_error(EE_STAT, MYF(0), path,
592 my_errno, my_strerror(errbuf,
sizeof(errbuf), my_errno));
595 if (my_mkdir(path,0777,MYF(0)) < 0)
597 my_error(ER_CANT_CREATE_DB, MYF(0), db, my_errno);
603 path[path_len-1]= FN_LIBCHAR;
604 strmake(path+path_len, MY_DB_OPT_FILE,
sizeof(path)-path_len-1);
605 if (write_db_opt(thd, path, create_info))
612 if (rmdir(path) >= 0)
630 char db_name_quoted[2 * FN_REFLEN +
sizeof(
"create database ") + 2];
635 id_len= my_strmov_quoted_identifier(thd, (
char *) db_name_quoted, db,
637 db_name_quoted[id_len]=
'\0';
639 query_length= (uint) (strxmov(tmp_query,
"create database ",
640 db_name_quoted, NullS) - tmp_query);
645 query_length= thd->query_length();
648 ha_binlog_log_query(thd, 0, LOGCOM_CREATE_DB,
652 if (mysql_bin_log.is_open())
654 int errcode= query_error_code(thd, TRUE);
676 qinfo.db_len = strlen(db);
677 thd->add_to_binlog_accessed_dbs(db);
698 bool mysql_alter_db(THD *thd,
const char *db,
HA_CREATE_INFO *create_info)
700 char path[FN_REFLEN+16];
703 DBUG_ENTER(
"mysql_alter_db");
713 build_table_filename(path,
sizeof(path) - 1, db,
"", MY_DB_OPT_FILE, 0);
714 if ((error=write_db_opt(thd, path, create_info)))
719 if (thd->db && !strcmp(thd->db,db))
721 thd->db_charset= create_info->default_table_charset ?
722 create_info->default_table_charset :
723 thd->variables.collation_server;
724 thd->variables.collation_database= thd->db_charset;
727 ha_binlog_log_query(thd, 0, LOGCOM_ALTER_DB,
728 thd->query(), thd->query_length(),
731 if (mysql_bin_log.is_open())
733 int errcode= query_error_code(thd, TRUE);
734 Query_log_event qinfo(thd, thd->query(), thd->query_length(), FALSE, TRUE,
742 qinfo.db_len = strlen(db);
773 bool mysql_rm_db(THD *thd,
char *db,
bool if_exists,
bool silent)
775 ulong deleted_tables= 0;
777 char path[2 * FN_REFLEN + 16];
780 bool found_other_files=
false;
783 Drop_table_error_handler err_handler;
784 DBUG_ENTER(
"mysql_rm_db");
790 length= build_table_filename(path,
sizeof(path) - 1, db,
"",
"", 0);
791 strmov(path+length, MY_DB_OPT_FILE);
796 if (!(dirp= my_dir(path,MYF(MY_DONT_SORT))))
800 my_error(ER_DB_DROP_EXISTS, MYF(0), db);
805 push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
806 ER_DB_DROP_EXISTS, ER(ER_DB_DROP_EXISTS), db);
812 if (find_db_tables_and_rm_known_files(thd, dirp, db, path, &tables,
820 if ((my_strcasecmp(system_charset_info, MYSQL_SCHEMA_NAME.str, db) == 0))
822 for (table= tables;
table; table= table->next_local)
824 if (check_if_log_table(table->db_length, table->db,
825 table->table_name_length, table->table_name,
true))
827 my_error(ER_BAD_LOG_STATEMENT, MYF(0),
"DROP");
834 if (
lock_table_names(thd, tables, NULL, thd->variables.lock_wait_timeout, 0) ||
835 lock_db_routines(thd, db))
840 mysql_ha_rm_tables(thd, tables);
842 for (table= tables;
table; table= table->next_local)
849 thd->push_internal_handler(&err_handler);
852 mysql_rm_table_no_locks(thd, tables,
true,
false,
true,
true)))
873 ha_drop_database(path);
874 tmp_disable_binlog(thd);
875 query_cache_invalidate1(db);
876 (void) sp_drop_db_routines(thd, db);
877 #ifdef HAVE_EVENT_SCHEDULER
880 reenable_binlog(thd);
886 if (found_other_files)
887 my_error(ER_DB_DROP_RMDIR, MYF(0), path, EEXIST);
889 error= rm_dir_w_symlink(path,
true);
891 thd->pop_internal_handler();
894 if (!silent && !error)
899 char buffer_temp [2 * FN_REFLEN + 2];
905 id_len= my_strmov_quoted_identifier(thd, buffer_temp, db, strlen(db));
906 buffer_temp[id_len] =
'\0';
907 query_length= (uint) (strxmov(path,
"DROP DATABASE ", buffer_temp,
"",
913 query_length= thd->query_length();
915 if (mysql_bin_log.is_open())
917 int errcode= query_error_code(thd, TRUE);
926 qinfo.db_len = strlen(db);
939 thd->server_status|= SERVER_STATUS_DB_DROPPED;
940 my_ok(thd, deleted_tables);
942 else if (mysql_bin_log.is_open() && !silent)
944 char *query, *query_pos, *query_end, *query_data_start;
945 char temp_identifier[ 2 * FN_REFLEN + 2];
947 uint db_len, id_length=0;
949 if (!(query= (
char*) thd->alloc(MAX_DROP_TABLE_Q_LEN)))
951 query_pos= query_data_start= strmov(query,
"DROP TABLE IF EXISTS ");
952 query_end= query + MAX_DROP_TABLE_Q_LEN;
955 for (tbl= tables; tbl; tbl= tbl->next_local)
970 tbl_name_len= strlen(tbl->table_name) + 3;
971 if (query_pos + tbl_name_len + 1 >= query_end)
977 if (write_to_binlog(thd, query, query_pos -1 - query, db, db_len))
982 query_pos= query_data_start;
984 id_length= my_strmov_quoted_identifier(thd, (
char *)temp_identifier,
986 temp_identifier[id_length]=
'\0';
987 query_pos= strmov(query_pos,(
char *)&temp_identifier);
991 if (query_pos != query_data_start)
993 thd->add_to_binlog_accessed_dbs(db);
998 if (write_to_binlog(thd, query, query_pos -1 - query, db, db_len))
1013 if (thd->db && !strcmp(thd->db, db) && !error)
1014 mysql_change_db_impl(thd, NULL, 0, thd->variables.collation_server);
1020 static bool find_db_tables_and_rm_known_files(THD *thd,
MY_DIR *dirp,
1024 bool *found_other_files)
1026 char filePath[FN_REFLEN];
1027 TABLE_LIST *tot_list=0, **tot_list_next_local, **tot_list_next_global;
1028 DBUG_ENTER(
"find_db_tables_and_rm_known_files");
1029 DBUG_PRINT(
"enter",(
"path: %s", path));
1030 TYPELIB *known_extensions= ha_known_exts();
1032 tot_list_next_local= tot_list_next_global= &tot_list;
1035 idx < (uint) dirp->number_off_files && !thd->killed ;
1038 FILEINFO *file=dirp->dir_entry+idx;
1040 DBUG_PRINT(
"info",(
"Examining: %s", file->name));
1043 if (file->name[0] ==
'.' && (!file->name[1] ||
1044 (file->name[1] ==
'.' && !file->name[2])))
1047 if (file->name[0] ==
'a' && file->name[1] ==
'r' &&
1048 file->name[2] ==
'c' && file->name[3] ==
'\0')
1054 char newpath[FN_REFLEN];
1056 strxmov(newpath, path,
"/",
"arc", NullS);
1057 (void) unpack_filename(newpath, newpath);
1058 if ((new_dirp = my_dir(newpath, MYF(MY_DONT_SORT))))
1060 DBUG_PRINT(
"my",(
"Archive subdir found: %s", newpath));
1061 if ((mysql_rm_arc_files(thd, new_dirp, newpath)) < 0)
1065 *found_other_files=
true;
1068 if (!(extension= strrchr(file->name,
'.')))
1069 extension= strend(file->name);
1070 if (find_type(extension, &deletable_extentions, FIND_TYPE_NO_PREFIX) <= 0)
1072 if (find_type(extension, known_extensions, FIND_TYPE_NO_PREFIX) <= 0)
1073 *found_other_files=
true;
1077 if (db && !my_strcasecmp(files_charset_info,
1078 extension, reg_ext))
1083 thd->calloc(
sizeof(*table_list) +
1085 MYSQL50_TABLE_NAME_PREFIX_LENGTH +
1086 strlen(file->name) + 1);
1090 table_list->db= (
char*) (table_list+1);
1091 table_list->db_length= strmov(table_list->db, db) - table_list->db;
1092 table_list->table_name= table_list->db + table_list->db_length + 1;
1093 table_list->table_name_length= filename_to_tablename(file->name,
1094 table_list->table_name,
1095 MYSQL50_TABLE_NAME_PREFIX_LENGTH +
1096 strlen(file->name) + 1);
1100 if (lower_case_table_names)
1101 table_list->table_name_length= my_casedn_str(files_charset_info,
1102 table_list->table_name);
1104 table_list->alias= table_list->table_name;
1105 table_list->internal_tmp_table= is_prefix(file->name,
tmp_file_prefix);
1106 table_list->mdl_request.
init(MDL_key::TABLE, table_list->db,
1107 table_list->table_name, MDL_EXCLUSIVE,
1110 (*tot_list_next_local)= table_list;
1111 (*tot_list_next_global)= table_list;
1112 tot_list_next_local= &table_list->next_local;
1113 tot_list_next_global= &table_list->next_global;
1117 strxmov(filePath, path,
"/", file->name, NullS);
1122 if (my_delete_with_symlink(filePath, MYF(0)) &&
1125 char errbuf[MYSYS_STRERROR_SIZE];
1126 my_error(EE_DELETE, MYF(0), filePath,
1127 my_errno, my_strerror(errbuf,
sizeof(errbuf), my_errno));
1149 static my_bool rm_dir_w_symlink(
const char *org_path, my_bool send_error)
1151 char tmp_path[FN_REFLEN], *pos;
1152 char *path= tmp_path;
1153 DBUG_ENTER(
"rm_dir_w_symlink");
1154 unpack_filename(tmp_path, org_path);
1155 #ifdef HAVE_READLINK
1157 char tmp2_path[FN_REFLEN];
1161 if (pos > path && pos[-1] == FN_LIBCHAR)
1164 if ((error= my_readlink(tmp2_path, path, MYF(MY_WME))) < 0)
1170 DBUG_RETURN(send_error);
1179 if (pos > path && pos[-1] == FN_LIBCHAR)
1181 if (rmdir(path) < 0 && send_error)
1183 my_error(ER_DB_DROP_RMDIR, MYF(0), path, errno);
1207 long mysql_rm_arc_files(THD *thd,
MY_DIR *dirp,
const char *org_path)
1210 ulong found_other_files= 0;
1211 char filePath[FN_REFLEN];
1212 DBUG_ENTER(
"mysql_rm_arc_files");
1213 DBUG_PRINT(
"enter", (
"path: %s", org_path));
1216 idx < (uint) dirp->number_off_files && !thd->killed ;
1219 FILEINFO *file=dirp->dir_entry+idx;
1220 char *extension, *revision;
1221 DBUG_PRINT(
"info",(
"Examining: %s", file->name));
1224 if (file->name[0] ==
'.' && (!file->name[1] ||
1225 (file->name[1] ==
'.' && !file->name[2])))
1228 extension= fn_ext(file->name);
1229 if (extension[0] !=
'.' ||
1230 extension[1] !=
'f' || extension[2] !=
'r' ||
1231 extension[3] !=
'm' || extension[4] !=
'-')
1233 found_other_files++;
1236 revision= extension+5;
1237 while (*revision && my_isdigit(system_charset_info, *revision))
1241 found_other_files++;
1244 strxmov(filePath, org_path,
"/", file->name, NullS);
1260 if (!found_other_files &&
1261 rm_dir_w_symlink(org_path, 0))
1263 DBUG_RETURN(deleted);
1283 static void mysql_change_db_impl(THD *thd,
1285 ulong new_db_access,
1290 if (new_db_name == NULL)
1297 thd->set_db(NULL, 0);
1299 else if (new_db_name == &INFORMATION_SCHEMA_NAME)
1306 thd->set_db(INFORMATION_SCHEMA_NAME.str, INFORMATION_SCHEMA_NAME.length);
1318 DEBUG_SYNC(thd,
"after_freeing_thd_db");
1319 thd->reset_db(new_db_name->str, new_db_name->length);
1325 #ifndef NO_EMBEDDED_ACCESS_CHECKS
1326 thd->security_ctx->db_access= new_db_access;
1331 thd->db_charset= new_db_charset;
1332 thd->variables.collation_database= new_db_charset;
1352 static void backup_current_db_name(THD *thd,
1359 saved_db_name->str= NULL;
1360 saved_db_name->length= 0;
1364 strmake(saved_db_name->str, thd->db, saved_db_name->length - 1);
1365 saved_db_name->length= thd->db_length;
1382 cmp_db_names(
const char *db1_name,
1383 const char *db2_name)
1387 (!db1_name && !db2_name) ||
1390 (db1_name && db2_name &&
1391 my_strcasecmp(system_charset_info, db1_name, db2_name) == 0);
1457 bool mysql_change_db(THD *thd,
const LEX_STRING *new_db_name,
bool force_switch)
1461 Security_context *sctx= thd->security_ctx;
1462 ulong db_access= sctx->db_access;
1465 DBUG_ENTER(
"mysql_change_db");
1466 DBUG_PRINT(
"enter",(
"name: '%s'", new_db_name->str));
1468 if (new_db_name == NULL ||
1469 new_db_name->length == 0)
1483 mysql_change_db_impl(thd, NULL, 0, thd->variables.collation_server);
1489 my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1495 if (is_infoschema_db(new_db_name->str, new_db_name->length))
1499 mysql_change_db_impl(thd, &INFORMATION_SCHEMA_NAME, SELECT_ACL,
1500 system_charset_info);
1512 new_db_file_name.str= my_strndup(new_db_name->str, new_db_name->length,
1514 new_db_file_name.length= new_db_name->length;
1516 if (new_db_file_name.str == NULL)
1528 if (check_and_convert_db_name(&new_db_file_name, FALSE) != IDENT_NAME_OK)
1530 my_free(new_db_file_name.str);
1533 mysql_change_db_impl(thd, NULL, 0, thd->variables.collation_server);
1537 DBUG_PRINT(
"info",(
"Use database: %s", new_db_file_name.str));
1539 #ifndef NO_EMBEDDED_ACCESS_CHECKS
1541 test_all_bits(sctx->master_access, DB_ACLS) ?
1543 acl_get(sctx->get_host()->ptr(),
1544 sctx->get_ip()->ptr(),
1546 new_db_file_name.str,
1547 FALSE) | sctx->master_access;
1549 if (!force_switch &&
1550 !(db_access & DB_ACLS) &&
1551 check_grant_db(thd, new_db_file_name.str))
1553 my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
1556 new_db_file_name.str);
1557 general_log_print(thd, COM_INIT_DB, ER(ER_DBACCESS_DENIED_ERROR),
1558 sctx->priv_user, sctx->priv_host, new_db_file_name.str);
1559 my_free(new_db_file_name.str);
1564 DEBUG_SYNC(thd,
"before_db_dir_check");
1566 if (check_db_dir_existence(new_db_file_name.str))
1572 push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
1573 ER_BAD_DB_ERROR, ER(ER_BAD_DB_ERROR),
1574 new_db_file_name.str);
1576 my_free(new_db_file_name.str);
1580 mysql_change_db_impl(thd, NULL, 0, thd->variables.collation_server);
1590 my_error(ER_BAD_DB_ERROR, MYF(0), new_db_file_name.str);
1591 my_free(new_db_file_name.str);
1604 db_default_cl= get_default_db_collation(thd, new_db_file_name.str);
1606 mysql_change_db_impl(thd, &new_db_file_name, db_access, db_default_cl);
1632 bool mysql_opt_change_db(THD *thd,
1636 bool *cur_db_changed)
1638 *cur_db_changed= !cmp_db_names(thd->db, new_db_name->str);
1640 if (!*cur_db_changed)
1643 backup_current_db_name(thd, saved_db_name);
1645 return mysql_change_db(thd, new_db_name, force_switch);
1663 bool mysql_upgrade_db(THD *thd,
LEX_STRING *old_db)
1665 int error= 0, change_to_newdb= 0;
1666 char path[FN_REFLEN+16];
1671 SELECT_LEX *sl= thd->lex->current_select;
1673 DBUG_ENTER(
"mysql_upgrade_db");
1675 if ((old_db->length <= MYSQL50_TABLE_NAME_PREFIX_LENGTH) ||
1676 (strncmp(old_db->str,
1677 MYSQL50_TABLE_NAME_PREFIX,
1678 MYSQL50_TABLE_NAME_PREFIX_LENGTH) != 0))
1680 my_error(ER_WRONG_USAGE, MYF(0),
1681 "ALTER DATABASE UPGRADE DATA DIRECTORY NAME",
1687 new_db.str= old_db->str + MYSQL50_TABLE_NAME_PREFIX_LENGTH;
1688 new_db.length= old_db->length - MYSQL50_TABLE_NAME_PREFIX_LENGTH;
1698 if (thd->db && !strcmp(thd->db, old_db->str))
1701 build_table_filename(path,
sizeof(path)-1,
1702 old_db->str,
"", MY_DB_OPT_FILE, 0);
1703 if ((load_db_opt(thd, path, &create_info)))
1704 create_info.default_table_charset= thd->variables.collation_server;
1706 length= build_table_filename(path,
sizeof(path)-1, old_db->str,
"",
"", 0);
1707 if (length && path[length-1] == FN_LIBCHAR)
1709 if ((error= my_access(path,F_OK)))
1711 my_error(ER_BAD_DB_ERROR, MYF(0), old_db->str);
1716 if ((error= mysql_create_db(thd, new_db.str, &create_info, 1)))
1720 if ((dirp = my_dir(path,MYF(MY_DONT_SORT))))
1722 uint nfiles= (uint) dirp->number_off_files;
1723 for (uint idx=0 ; idx < nfiles && !thd->killed ; idx++)
1725 FILEINFO *file= dirp->dir_entry + idx;
1726 char *extension, tname[FN_REFLEN + 1];
1728 DBUG_PRINT(
"info",(
"Examining: %s", file->name));
1731 if (my_strcasecmp(files_charset_info,
1732 (extension= fn_rext(file->name)), reg_ext))
1738 table_str.length= filename_to_tablename(file->name,
1739 tname,
sizeof(tname)-1);
1740 table_str.str= (
char*) sql_memdup(tname, table_str.length + 1);
1741 Table_ident *old_ident=
new Table_ident(thd, *old_db, table_str, 0);
1742 Table_ident *new_ident=
new Table_ident(thd, new_db, table_str, 0);
1743 if (!old_ident || !new_ident ||
1744 !sl->add_table_to_list(thd, old_ident, NULL,
1745 TL_OPTION_UPDATING, TL_IGNORE,
1747 !sl->add_table_to_list(thd, new_ident, NULL,
1748 TL_OPTION_UPDATING, TL_IGNORE,
1759 if ((table_list= thd->lex->query_tables) &&
1760 (error= mysql_rename_tables(thd, table_list, 1)))
1773 build_table_filename(path,
sizeof(path)-1,
1774 new_db.str,
"",MY_DB_OPT_FILE, 0);
1776 length= build_table_filename(path,
sizeof(path)-1, new_db.str,
"",
"", 0);
1777 if (length && path[length-1] == FN_LIBCHAR)
1811 if ((dirp = my_dir(path,MYF(MY_DONT_SORT))))
1813 uint nfiles= (uint) dirp->number_off_files;
1814 for (uint idx=0 ; idx < nfiles ; idx++)
1816 FILEINFO *file= dirp->dir_entry + idx;
1817 char oldname[FN_REFLEN + 1], newname[FN_REFLEN + 1];
1818 DBUG_PRINT(
"info",(
"Examining: %s", file->name));
1821 if ((file->name[0] ==
'.' &&
1822 (!file->name[1] || (file->name[1] ==
'.' && !file->name[2]))) ||
1823 !my_strcasecmp(files_charset_info, file->name, MY_DB_OPT_FILE))
1827 build_table_filename(oldname,
sizeof(oldname)-1,
1828 old_db->str,
"", file->name, 0);
1829 build_table_filename(newname,
sizeof(newname)-1,
1830 new_db.str,
"", file->name, 0);
1842 error= mysql_rm_db(thd, old_db->str, 0, 1);
1845 if (mysql_bin_log.is_open())
1847 int errcode= query_error_code(thd, TRUE);
1849 FALSE, TRUE, TRUE, errcode);
1855 if (change_to_newdb)
1856 error|= mysql_change_db(thd, & new_db, FALSE);
1876 bool check_db_dir_existence(
const char *db_name)
1878 char db_dir_path[FN_REFLEN + 1];
1879 uint db_dir_path_len;
1881 db_dir_path_len= build_table_filename(db_dir_path,
sizeof(db_dir_path) - 1,
1882 db_name,
"",
"", 0);
1884 if (db_dir_path_len && db_dir_path[db_dir_path_len - 1] == FN_LIBCHAR)
1885 db_dir_path[db_dir_path_len - 1]= 0;
1889 return my_access(db_dir_path, F_OK);