null+****@clear*****
null+****@clear*****
2011年 6月 13日 (月) 18:25:33 JST
Kouhei Sutou 2011-06-13 09:25:33 +0000 (Mon, 13 Jun 2011) New Revision: 1a9255931612dfa47de1cc1a926a365c7e52175a Log: [wrapper][index] support drop table. fixes #928 Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+37 -4) =================================================================== --- ha_mroonga.cc 2011-06-13 09:14:41 +0000 (d6ce151) +++ ha_mroonga.cc 2011-06-13 09:25:33 +0000 (7481e0b) @@ -1756,7 +1756,8 @@ int ha_mroonga::close() DBUG_RETURN(0); } -int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share) +int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share, + const char *table_name) { int error; handler *hnd; @@ -1777,10 +1778,42 @@ int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share) DBUG_RETURN(error); } - /* TODO: create groonga index */ + error = wrapper_delete_index(name, tmp_share, table_name); delete hnd; - DBUG_RETURN(0); + DBUG_RETURN(error); +} + +int ha_mroonga::wrapper_delete_index(const char *name, MRN_SHARE *tmp_share, + const char *table_name) +{ + int error; + MRN_DBUG_ENTER_METHOD(); + + error = ensure_database_open(name); + if (error) + DBUG_RETURN(error); + + TABLE_SHARE *tmp_table_share = tmp_share->table_share; + + int i; + for (i = 0; i < tmp_table_share->keys; i++) { + char index_name[MRN_MAX_PATH_SIZE]; + mrn_index_name_gen(table_name, i, index_name); + grn_obj *index_table = grn_ctx_get(ctx, index_name, strlen(index_name)); + if (index_table != NULL) { + grn_obj_remove(ctx, index_table); + } + } + + grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name)); + if (ctx->rc) { + error = ER_CANT_OPEN_FILE; + my_message(error, ctx->errbuf, MYF(0)); + DBUG_RETURN(error); + } + error = grn_obj_remove(ctx, table); + DBUG_RETURN(error); } int ha_mroonga::default_delete_table(const char *name, MRN_SHARE *tmp_share, @@ -1859,7 +1892,7 @@ int ha_mroonga::delete_table(const char *name) if (tmp_share->wrapper_mode) { - error = wrapper_delete_table(name, tmp_share); + error = wrapper_delete_table(name, tmp_share, tbl_name); } else { error = default_delete_table(name, tmp_share, tbl_name); } Modified: ha_mroonga.h (+4 -1) =================================================================== --- ha_mroonga.h 2011-06-13 09:14:41 +0000 (c8acaa4) +++ ha_mroonga.h 2011-06-13 09:25:33 +0000 (b8888fe) @@ -220,7 +220,10 @@ private: int default_create_validate_index(TABLE *table); int ensure_database_create(const char *name); int ensure_database_open(const char *name); - int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share); + int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share, + const char *table_name); + int wrapper_delete_index(const char *name, MRN_SHARE *tmp_share, + const char *table_name); int default_delete_table(const char *name, MRN_SHARE *tmp_share, const char *tbl_name); int wrapper_open(const char *name, int mode, uint test_if_locked);