diff options
author | unknown <mskold@mysql.com> | 2005-04-22 15:28:23 +0200 |
---|---|---|
committer | unknown <mskold@mysql.com> | 2005-04-22 15:28:23 +0200 |
commit | 639d4295c69dbe32076979c0854ac40b42820223 (patch) | |
tree | a8af3475b78c7c08f7ce31b2bde9079f8920cec3 | |
parent | e2f5671064639b4dfe22fda07349fa00220a9af2 (diff) | |
download | mariadb-git-639d4295c69dbe32076979c0854ac40b42820223.tar.gz |
Fix for Bug #9318 drop database does not drop ndb tables
-rw-r--r-- | mysql-test/r/ndb_database.result | 27 | ||||
-rw-r--r-- | mysql-test/t/ndb_database.test | 50 | ||||
-rw-r--r-- | sql/ha_ndbcluster.cc | 123 | ||||
-rw-r--r-- | sql/ha_ndbcluster.h | 6 |
4 files changed, 154 insertions, 52 deletions
diff --git a/mysql-test/r/ndb_database.result b/mysql-test/r/ndb_database.result new file mode 100644 index 00000000000..566a3eaf3dd --- /dev/null +++ b/mysql-test/r/ndb_database.result @@ -0,0 +1,27 @@ +drop table if exists t1; +drop database if exists mysqltest; +drop table if exists t1; +drop database if exists mysqltest; +create database mysqltest; +create database mysqltest; +create table mysqltest.t1 (a int primary key, b int) engine=ndb; +use mysqltest; +show tables; +Tables_in_mysqltest +t1 +drop database mysqltest; +use mysqltest; +show tables; +Tables_in_mysqltest +create database mysqltest; +create table mysqltest.t1 (c int, d int primary key) engine=ndb; +use mysqltest; +show tables; +Tables_in_mysqltest +t1 +drop database mysqltest; +use mysqltest; +show tables; +Tables_in_mysqltest +drop table if exists t1; +drop database if exists mysqltest; diff --git a/mysql-test/t/ndb_database.test b/mysql-test/t/ndb_database.test new file mode 100644 index 00000000000..1264c3fa73b --- /dev/null +++ b/mysql-test/t/ndb_database.test @@ -0,0 +1,50 @@ +-- source include/have_ndb.inc +-- source include/have_multi_ndb.inc +-- source include/not_embedded.inc + +--disable_warnings +connection server1; +drop table if exists t1; +drop database if exists mysqltest; +connection server2; +drop table if exists t1; +drop database if exists mysqltest; +--enable_warnings + +# +# Check that all tables in a database are dropped when database is dropped +# + +connection server1; +create database mysqltest; + +connection server2; +create database mysqltest; +create table mysqltest.t1 (a int primary key, b int) engine=ndb; +use mysqltest; +show tables; + +connection server1; +drop database mysqltest; + +connection server2; +use mysqltest; +show tables; + +connection server1; +create database mysqltest; +create table mysqltest.t1 (c int, d int primary key) engine=ndb; +use mysqltest; +show tables; + +connection server2; +drop database mysqltest; + +connection server1; +use mysqltest; +show tables; + +--disable_warnings +drop table if exists t1; +drop database if exists mysqltest; +--enable_warnings diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index bf8db96c76f..230ca2826b2 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -3965,18 +3965,6 @@ int ha_ndbcluster::drop_table() } -/* - Drop a database in NDB Cluster - */ - -int ndbcluster_drop_database(const char *path) -{ - DBUG_ENTER("ndbcluster_drop_database"); - // TODO drop all tables for this database - DBUG_RETURN(1); -} - - longlong ha_ndbcluster::get_auto_increment() { DBUG_ENTER("get_auto_increment"); @@ -4325,6 +4313,53 @@ extern "C" byte* tables_get_key(const char *entry, uint *length, } +/* + Drop a database in NDB Cluster + */ + +int ndbcluster_drop_database(const char *path) +{ + DBUG_ENTER("ndbcluster_drop_database"); + THD *thd= current_thd; + char dbname[FN_HEADLEN]; + Ndb* ndb; + NdbDictionary::Dictionary::List list; + uint i; + char *tabname; + List<char> drop_list; + ha_ndbcluster::set_dbname(path, (char *)&dbname); + DBUG_PRINT("enter", ("db: %s", dbname)); + + if (!(ndb= check_ndb_in_thd(thd))) + DBUG_RETURN(HA_ERR_NO_CONNECTION); + + // List tables in NDB + NDBDICT *dict= ndb->getDictionary(); + if (dict->listObjects(list, + NdbDictionary::Object::UserTable) != 0) + ERR_RETURN(dict->getNdbError()); + for (i= 0 ; i < list.count ; i++) + { + NdbDictionary::Dictionary::List::Element& t= list.elements[i]; + DBUG_PRINT("info", ("Found %s/%s in NDB", t.database, t.name)); + + // Add only tables that belongs to db + if (my_strcasecmp(system_charset_info, t.database, dbname)) + continue; + DBUG_PRINT("info", ("%s must be dropped", t.name)); + drop_list.push_back(thd->strdup(t.name)); + } + // Drop any tables belonging to database + ndb->setDatabaseName(dbname); + List_iterator_fast<char> it(drop_list); + while ((tabname=it++)) + if (dict->dropTable(tabname)) + ERR_RETURN(dict->getNdbError()); + + DBUG_RETURN(0); +} + + int ndbcluster_find_files(THD *thd,const char *db,const char *path, const char *wild, bool dir, List<char> *files) { @@ -4595,26 +4630,31 @@ void ndbcluster_print_error(int error, const NdbOperation *error_op) DBUG_VOID_RETURN; } -/* - Set m_tabname from full pathname to table file +/** + * Set a given location from full pathname to database name + * */ - -void ha_ndbcluster::set_tabname(const char *path_name) +void ha_ndbcluster::set_dbname(const char *path_name, char *dbname) { char *end, *ptr; /* Scan name from the end */ - end= strend(path_name)-1; - ptr= end; + ptr= strend(path_name)-1; + while (ptr >= path_name && *ptr != '\\' && *ptr != '/') { + ptr--; + } + ptr--; + end= ptr; while (ptr >= path_name && *ptr != '\\' && *ptr != '/') { ptr--; } uint name_len= end - ptr; - memcpy(m_tabname, ptr + 1, end - ptr); - m_tabname[name_len]= '\0'; + memcpy(dbname, ptr + 1, name_len); + dbname[name_len]= '\0'; #ifdef __WIN__ /* Put to lower case */ - ptr= m_tabname; + + ptr= dbname; while (*ptr != '\0') { *ptr= tolower(*ptr); @@ -4623,6 +4663,15 @@ void ha_ndbcluster::set_tabname(const char *path_name) #endif } +/* + Set m_dbname from full pathname to table file + */ + +void ha_ndbcluster::set_dbname(const char *path_name) +{ + set_dbname(path_name, m_dbname); +} + /** * Set a given location from full pathname to table file * @@ -4652,39 +4701,13 @@ ha_ndbcluster::set_tabname(const char *path_name, char * tabname) #endif } - /* - Set m_dbname from full pathname to table file - + Set m_tabname from full pathname to table file */ -void ha_ndbcluster::set_dbname(const char *path_name) +void ha_ndbcluster::set_tabname(const char *path_name) { - char *end, *ptr; - - /* Scan name from the end */ - ptr= strend(path_name)-1; - while (ptr >= path_name && *ptr != '\\' && *ptr != '/') { - ptr--; - } - ptr--; - end= ptr; - while (ptr >= path_name && *ptr != '\\' && *ptr != '/') { - ptr--; - } - uint name_len= end - ptr; - memcpy(m_dbname, ptr + 1, name_len); - m_dbname[name_len]= '\0'; -#ifdef __WIN__ - /* Put to lower case */ - - ptr= m_dbname; - - while (*ptr != '\0') { - *ptr= tolower(*ptr); - ptr++; - } -#endif + set_tabname(path_name, m_tabname); } diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h index 9fab34448ce..ac2d27b9ec7 100644 --- a/sql/ha_ndbcluster.h +++ b/sql/ha_ndbcluster.h @@ -147,7 +147,10 @@ class ha_ndbcluster: public handler static Thd_ndb* seize_thd_ndb(); static void release_thd_ndb(Thd_ndb* thd_ndb); uint8 table_cache_type(); - + + static void set_dbname(const char *pathname, char *dbname); + static void set_tabname(const char *pathname, char *tabname); + private: int alter_table_name(const char *to); int drop_table(); @@ -183,7 +186,6 @@ class ha_ndbcluster: public handler void set_dbname(const char *pathname); void set_tabname(const char *pathname); - void set_tabname(const char *pathname, char *tabname); bool set_hidden_key(NdbOperation*, uint fieldnr, const byte* field_ptr); |