diff options
Diffstat (limited to 'storage/maria/ma_delete_table.c')
-rw-r--r-- | storage/maria/ma_delete_table.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/storage/maria/ma_delete_table.c b/storage/maria/ma_delete_table.c new file mode 100644 index 00000000..ebd94cdb --- /dev/null +++ b/storage/maria/ma_delete_table.c @@ -0,0 +1,118 @@ +/* Copyright (C) 2006 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ + +#include "ma_fulltext.h" +#include "trnman_public.h" + +/** + @brief drops (deletes) a table + + @param name table's name + + @return Operation status + @retval 0 ok + @retval 1 error +*/ + +int maria_delete_table(const char *name) +{ + MARIA_HA *info; + myf sync_dir; + int got_error= 0, error; + DBUG_ENTER("maria_delete_table"); + +#ifdef EXTRA_DEBUG + _ma_check_table_is_closed(name,"delete"); +#endif + /** @todo LOCK take X-lock on table */ + /* + We need to know if this table is transactional. + Unfortunately it is necessary to open the table just to check this. We use + 'open_for_repair' to be able to open even a crashed table. + */ + my_errno= 0; + if (!(info= maria_open(name, O_RDONLY, + (HA_OPEN_FOR_DROP | HA_OPEN_FOR_REPAIR), 0))) + { + sync_dir= 0; + /* Ignore not found errors and wrong symlink errors */ + if (my_errno != ENOENT && my_errno != HA_WRONG_CREATE_OPTION && + my_errno != HA_ERR_NO_ENCRYPTION) + got_error= my_errno; + } + else + { + sync_dir= (info->s->now_transactional && !info->s->temporary && + !maria_in_recovery) ? + MY_SYNC_DIR : 0; + /* Remove history for table */ + _ma_reset_state(info); + maria_close(info); + } + + if (sync_dir) + { + /* + For this log record to be of any use for Recovery, we need the upper + MySQL layer to be crash-safe in DDLs. + For now this record can serve when we apply logs to a backup, so we sync + it. + */ + LSN lsn; + LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 1]; + log_array[TRANSLOG_INTERNAL_PARTS + 0].str= (uchar*)name; + log_array[TRANSLOG_INTERNAL_PARTS + 0].length= strlen(name) + 1; + if (unlikely(translog_write_record(&lsn, LOGREC_REDO_DROP_TABLE, + &dummy_transaction_object, NULL, + (translog_size_t) + log_array[TRANSLOG_INTERNAL_PARTS + + 0].length, + sizeof(log_array)/sizeof(log_array[0]), + log_array, NULL, NULL) || + translog_flush(lsn))) + DBUG_RETURN(1); + } + + if (!(error= maria_delete_table_files(name, 0, sync_dir | MY_WME))) + error= got_error; + DBUG_RETURN(error); +} + +/** + Delete all files related to a aria table +*/ + +int maria_delete_table_files(const char *name, my_bool temporary, myf flags) +{ + int error= 0; + DBUG_ENTER("maria_delete_table_files"); + + if (mysql_file_delete_with_symlink(key_file_kfile, name, MARIA_NAME_IEXT, + flags)) + error= my_errno; + if (mysql_file_delete_with_symlink(key_file_dfile, name, MARIA_NAME_DEXT, + flags)) + error= my_errno; + if (!temporary) + { + /* This is delete a possible temporary aria_chk file */ + mysql_file_delete_with_symlink(key_file_dfile, name, DATA_TMP_EXT, MYF(0)); +#ifdef SUPPORT_ARIA_PACK + /* This is delete a possible temporary aria_pack file */ + mysql_file_delete_with_symlink(key_file_dfile, name, ".OLD", MYF(0)); +#endif + } + DBUG_RETURN(error); +} |