[Groonga-mysql-commit] mroonga/mroonga [master] fixes #985 add wrapper_open() and wrapper_close()

Back to archive index

null+****@clear***** null+****@clear*****
2011年 6月 10日 (金) 00:02:01 JST


Kentoku	2011-06-09 15:02:01 +0000 (Thu, 09 Jun 2011)

  New Revision: 12cd502dcda735357423085c4cd761429a7d0ab6

  Log:
    fixes #985 add wrapper_open() and wrapper_close()

  Modified files:
    ha_mroonga.cc
    ha_mroonga.h

  Modified: ha_mroonga.cc (+105 -5)
===================================================================
--- ha_mroonga.cc    2011-06-09 10:08:37 +0000 (3a899ba)
+++ ha_mroonga.cc    2011-06-09 15:02:01 +0000 (bc706be)
@@ -1333,12 +1333,52 @@ int ha_mroonga::create(const char *name, TABLE *table, HA_CREATE_INFO *info)
   DBUG_RETURN(error);
 }
 
-int ha_mroonga::open(const char *name, int mode, uint test_if_locked)
+int ha_mroonga::wrapper_open(const char *name, int mode, uint test_if_locked)
 {
+  int error;
   MRN_DBUG_ENTER_METHOD();
-  thr_lock_init(&thr_lock);
-  thr_lock_data_init(&thr_lock, &thr_lock_data, NULL);
+  wrap_key_info = mrn_create_key_info_for_table(share, table, &error);
+  if (error)
+    DBUG_RETURN(error);
+  base_key_info = table->key_info;
+
+  MRN_SET_WRAP_SHARE_KEY(share, table->s);
+  MRN_SET_WRAP_TABLE_KEY(this, table);
+  if (!(wrap_handler =
+      share->hton->create(share->hton, table->s,
+        current_thd->mem_root)))
+  {
+    MRN_SET_BASE_SHARE_KEY(share, table->s);
+    MRN_SET_BASE_TABLE_KEY(this, table);
+    if (wrap_key_info)
+    {
+      my_free(wrap_key_info, MYF(0));
+      wrap_key_info = NULL;
+    }
+    base_key_info = NULL;
+    DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+  }
+  error = wrap_handler->ha_open(table, name, mode, test_if_locked);
+  MRN_SET_BASE_SHARE_KEY(share, table->s);
+  MRN_SET_BASE_TABLE_KEY(this, table);
 
+  if (error)
+  {
+    delete wrap_handler;
+    wrap_handler = NULL;
+    if (wrap_key_info)
+    {
+      my_free(wrap_key_info, MYF(0));
+      wrap_key_info = NULL;
+    }
+    base_key_info = NULL;
+  }
+  DBUG_RETURN(error);
+}
+
+int ha_mroonga::default_open(const char *name, int mode, uint test_if_locked)
+{
+  MRN_DBUG_ENTER_METHOD();
   /* First, we must check if database is alreadly opened */
   char db_name[MRN_MAX_PATH_SIZE];
   char db_path[MRN_MAX_PATH_SIZE];
@@ -1442,11 +1482,54 @@ int ha_mroonga::open(const char *name, int mode, uint test_if_locked)
   DBUG_RETURN(0);
 }
 
-int ha_mroonga::close()
+int ha_mroonga::open(const char *name, int mode, uint test_if_locked)
 {
+  int error;
   MRN_DBUG_ENTER_METHOD();
-  thr_lock_delete(&thr_lock);
+  thr_lock_init(&thr_lock);
+  thr_lock_data_init(&thr_lock, &thr_lock_data, NULL);
 
+  if (!(share = mrn_get_share(name, table, &error)))
+    DBUG_RETURN(error);
+
+  if (share->wrapper_mode)
+  {
+    error = wrapper_open(name, mode, test_if_locked);
+  } else {
+    error = default_open(name, mode, test_if_locked);
+  }
+
+  if (error)
+  {
+    mrn_free_share(share);
+    share = NULL;
+  }
+  DBUG_RETURN(error);
+}
+
+int ha_mroonga::wrapper_close()
+{
+  int error;
+  MRN_DBUG_ENTER_METHOD();
+  MRN_SET_WRAP_SHARE_KEY(share, table->s);
+  MRN_SET_WRAP_TABLE_KEY(this, table);
+  error = wrap_handler->close();
+  MRN_SET_BASE_SHARE_KEY(share, table->s);
+  MRN_SET_BASE_TABLE_KEY(this, table);
+  delete wrap_handler;
+  wrap_handler = NULL;
+  if (wrap_key_info)
+  {
+    my_free(wrap_key_info, MYF(0));
+    wrap_key_info = NULL;
+  }
+  base_key_info = NULL;
+  DBUG_RETURN(error);
+}
+
+int ha_mroonga::default_close()
+{
+  MRN_DBUG_ENTER_METHOD();
   int i;
   uint n_keys = table->s->keys;
   uint pkeynr = table->s->primary_key;
@@ -1471,6 +1554,23 @@ int ha_mroonga::close()
   DBUG_RETURN(0);
 }
 
+int ha_mroonga::close()
+{
+  int error;
+  MRN_DBUG_ENTER_METHOD();
+  if (share->wrapper_mode)
+  {
+    error = wrapper_close();
+  } else {
+    error = default_close();
+  }
+
+  mrn_free_share(share);
+  share = NULL;
+  thr_lock_delete(&thr_lock);
+  DBUG_RETURN(0);
+}
+
 int ha_mroonga::wrapper_delete_table(const char *name, MRN_SHARE *tmp_share)
 {
   int error;

  Modified: ha_mroonga.h (+5 -0)
===================================================================
--- ha_mroonga.h    2011-06-09 10:08:37 +0000 (fc14bf9)
+++ ha_mroonga.h    2011-06-09 15:02:01 +0000 (0e23694)
@@ -61,6 +61,7 @@ class ha_mroonga: public handler
   MRN_SHARE *share;
   KEY       *wrap_key_info;
   KEY       *base_key_info;
+  handler   *wrap_handler;
 
   grn_ctx *ctx;
 
@@ -210,6 +211,10 @@ private:
   int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share);
   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);
+  int default_open(const char *name, int mode, uint test_if_locked);
+  int wrapper_close();
+  int default_close();
 };
 
 #ifdef __cplusplus




Groonga-mysql-commit メーリングリストの案内
Back to archive index