summaryrefslogtreecommitdiffstats
path: root/storage/maria/ma_delete_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/maria/ma_delete_table.c')
-rw-r--r--storage/maria/ma_delete_table.c118
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);
+}