[Groonga-mysql-commit] mroonga/mroonga [master] clean up initialization.

Zurück zum Archiv-Index

null+****@clear***** null+****@clear*****
2011年 10月 6日 (木) 11:51:05 JST


Kouhei Sutou	2011-10-06 02:51:05 +0000 (Thu, 06 Oct 2011)

  New Revision: df6926014cee8c5976ed85771f1983a317ac724b

  Log:
    clean up initialization.

  Modified files:
    ha_mroonga.cc

  Modified: ha_mroonga.cc (+38 -32)
===================================================================
--- ha_mroonga.cc    2011-10-05 17:04:20 +0000 (606ee21)
+++ ha_mroonga.cc    2011-10-06 02:51:05 +0000 (4f3acc7)
@@ -97,13 +97,17 @@ extern "C" {
 #endif
 
 /* global variables */
-grn_obj *mrn_db;
-grn_hash *mrn_hash;
 pthread_mutex_t mrn_db_mutex;
 pthread_mutex_t mrn_log_mutex;
 handlerton *mrn_hton_ptr;
 HASH mrn_open_tables;
 pthread_mutex_t mrn_open_tables_mutex;
+
+/* internal variables */
+static grn_ctx mrn_ctx;
+static grn_obj *mrn_db;
+static grn_hash *mrn_hash;
+
 static uchar *mrn_open_tables_get_key(MRN_SHARE *share,
                                       size_t *length,
                                       my_bool not_used __attribute__ ((unused)))
@@ -121,7 +125,7 @@ long mrn_fast_order_limit = 0;
 /* logging */
 const char *mrn_logfile_name = MRN_LOG_FILE_NAME;
 FILE *mrn_logfile = NULL;
-int mrn_logfile_opened = 0;
+static bool mrn_logfile_opened = false;
 grn_log_level mrn_log_level_default = GRN_LOG_DEFAULT_LEVEL;
 ulong mrn_log_level = (ulong) mrn_log_level_default;
 char mrn_default_parser_name[MRN_MAX_KEY_SIZE];
@@ -917,9 +921,8 @@ static void mrn_store_field(grn_ctx *ctx, Field *field, grn_obj *col, grn_id id)
 
 static int mrn_init(void *p)
 {
-  grn_ctx *ctx;
-
   // init handlerton
+  grn_ctx *ctx = NULL;
   handlerton *hton;
   hton = (handlerton *)p;
   hton->state = SHOW_OPTION_YES;
@@ -932,19 +935,20 @@ static int mrn_init(void *p)
 
   // init groonga
   if (grn_init() != GRN_SUCCESS) {
-    goto err;
+    goto err_grn_init;
   }
 
-  ctx = grn_ctx_open(0);
+  grn_ctx_init(&mrn_ctx, 0);
+  ctx = &mrn_ctx;
 
   if (pthread_mutex_init(&mrn_log_mutex, NULL) != 0) {
     goto err_log_mutex_init;
   }
   grn_logger_info_set(ctx, &mrn_logger_info);
   if (!(mrn_logfile = fopen(mrn_logfile_name, "a"))) {
-    goto err;
+    goto err_log_file_open;
   }
-  mrn_logfile_opened = 1;
+  mrn_logfile_opened = true;
   GRN_LOG(ctx, GRN_LOG_NOTICE, "%s started.", MRN_PACKAGE_STRING);
   GRN_LOG(ctx, GRN_LOG_NOTICE, "log level is '%s'",
           mrn_log_level_type_names[mrn_log_level]);
@@ -952,7 +956,7 @@ static int mrn_init(void *p)
   // init meta-info database
   if (!(mrn_db = grn_db_create(ctx, NULL, NULL))) {
     GRN_LOG(ctx, GRN_LOG_ERROR, "cannot create system database, exiting");
-    goto err;
+    goto err_db_create;
   }
   grn_ctx_use(ctx, mrn_db);
 
@@ -961,7 +965,7 @@ static int mrn_init(void *p)
                                    MRN_MAX_KEY_SIZE, sizeof(size_t),
                                    GRN_OBJ_KEY_VAR_SIZE))) {
     GRN_LOG(ctx, GRN_LOG_ERROR, "cannot init hash, exiting");
-    goto err;
+    goto err_hash_create;
   }
 
   // init lock
@@ -983,7 +987,6 @@ static int mrn_init(void *p)
     goto error_allocated_open_tables_hash_init;
   }
 
-  grn_ctx_fin(ctx);
   return 0;
 
 error_allocated_open_tables_hash_init:
@@ -995,19 +998,27 @@ error_allocated_thds_hash_init:
 err_allocated_thds_mutex_init:
   pthread_mutex_destroy(&mrn_db_mutex);
 err_db_mutex_init:
-err:
+  grn_hash_close(ctx, mrn_hash);
+err_hash_create:
+  grn_obj_unlink(ctx, mrn_db);
+err_db_create:
+  if (mrn_logfile_opened) {
+    fclose(mrn_logfile);
+    mrn_logfile_opened = false;
+  }
+err_log_file_open:
   pthread_mutex_destroy(&mrn_log_mutex);
 err_log_mutex_init:
   grn_ctx_fin(ctx);
   grn_fin();
+err_grn_init:
   return -1;
 }
 
 static int mrn_deinit(void *p)
 {
   THD *thd = current_thd, *tmp_thd;
-  grn_ctx *ctx;
-  ctx = grn_ctx_open(0);
+  grn_ctx *ctx = &mrn_ctx;
 
   GRN_LOG(ctx, GRN_LOG_NOTICE, "%s deinit", MRN_PACKAGE_STRING);
 
@@ -1034,7 +1045,7 @@ static int mrn_deinit(void *p)
 
   if (mrn_logfile_opened) {
     fclose(mrn_logfile);
-    mrn_logfile_opened = 0;
+    mrn_logfile_opened = false;
   }
 
   grn_ctx_fin(ctx);
@@ -1947,9 +1958,7 @@ int ha_mroonga::storage_create_index(TABLE *table, const char *grn_table_name,
 int ha_mroonga::close_databases()
 {
   int error = 0;
-  grn_obj *tmp_db;
   grn_hash_cursor *hash_cursor;
-  grn_id tmp_id;
   MRN_DBUG_ENTER_METHOD();
   pthread_mutex_lock(&mrn_db_mutex);
   hash_cursor =
@@ -1959,28 +1968,25 @@ int ha_mroonga::close_databases()
     DBUG_RETURN(ER_ERROR_ON_READ);
   }
 
-  do {
-    tmp_id = grn_hash_cursor_next(ctx, hash_cursor);
+  while (grn_hash_cursor_next(ctx, hash_cursor) != GRN_ID_NIL) {
     if (ctx->rc) {
       error = ER_ERROR_ON_READ;
       my_message(error, ctx->errbuf, MYF(0));
       break;
     }
-    if (tmp_id != GRN_ID_NIL)
+    grn_obj *db;
+    grn_hash_cursor_get_value(ctx, hash_cursor, (void **)&(db));
+    grn_rc rc = grn_hash_cursor_delete(ctx, hash_cursor, NULL);
+    if (rc)
     {
-      grn_hash_cursor_get_value(ctx, hash_cursor, (void **) &(tmp_db));
-      grn_rc rc = grn_hash_cursor_delete(ctx, hash_cursor, NULL);
-      if (rc)
-      {
-        error = ER_ERROR_ON_READ;
-        my_message(error, ctx->errbuf, MYF(0));
-        break;
-      }
-      grn_obj_close(ctx, tmp_db);
+      error = ER_ERROR_ON_READ;
+      my_message(error, ctx->errbuf, MYF(0));
+      break;
     }
-  } while (tmp_id != GRN_ID_NIL);
-
+    grn_obj_close(ctx, db);
+  }
   grn_hash_cursor_close(ctx, hash_cursor);
+
   pthread_mutex_unlock(&mrn_db_mutex);
   DBUG_RETURN(error);
 }




Groonga-mysql-commit メーリングリストの案内
Zurück zum Archiv-Index