[groonga-dev,00008] GRN_OBJ_TABLE_NO_KEYと永続テーブル

Back to archive index

Kouhei Sutou kou****@clear*****
2009年 4月 6日 (月) 08:49:09 JST


須藤です。

grn_table_create()はflagsをそのままキーストアのバックエンド
に渡していますが、GRN_OBJ_TABLE_NO_KEY(3)を指定すると、
GRN_ARRAY_TINY(2)ビットが立ってしまいます。
そのため、pathを指定して永続テーブルにしようとすると、
grn_arrayの作成に失敗してしまいます。

これは、NO_KEYでは永続テーブルを作成できないということでしょ
うか?

とりあえず、こうすれば作成できるようになります。

diff --git a/groonga.h b/groonga.h
index b4a08ea..13a5154 100644
--- a/groonga.h
+++ b/groonga.h
@@ -182,7 +182,7 @@ typedef unsigned int grn_obj_flags;
 #define GRN_OBJ_TABLE_TYPE_MASK        (0x07)
 #define GRN_OBJ_TABLE_HASH_KEY         (0x00)
 #define GRN_OBJ_TABLE_PAT_KEY          (0x01)
-#define GRN_OBJ_TABLE_NO_KEY           (0x03)
+#define GRN_OBJ_TABLE_NO_KEY           (0x05)
 #define GRN_OBJ_TABLE_ALIAS            (0x04)
 
 #define GRN_OBJ_KEY_MASK               (0x07<<3)


あと、grn_array_create()が失敗したらgrn_ctxにエラー情報を設定
してくれるようになると、問題を早く見つけられるようになって便
利です。

diff --git a/lib/hash.c b/lib/hash.c
index 1ad35eb..2425ff2 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -183,11 +183,14 @@ grn_array_create(grn_ctx *ctx, const char *path,
uint32_t value_size, uint32_t f
 {
   grn_array *array;
   if (ctx && (array = GRN_MALLOC(sizeof(grn_array)))) {
-    if (!((flags & GRN_ARRAY_TINY) ?
-          tiny_array_init(array, ctx, path, value_size, flags) :
-          io_array_init(ctx, array, path, value_size, flags))) {
+    grn_rc rc;
+    if (flags & GRN_ARRAY_TINY)
+      rc = tiny_array_init(array, ctx, path, value_size, flags);
+    else
+      rc = io_array_init(ctx, array, path, value_size, flags);
+    if (!rc)
       return array;
-    }
+    ERR(rc, "failed to create array");
     GRN_FREE(array);
   }
   return NULL;

grn_array_create()ではなくて、tiny_array_init()や
io_array_init()でエラーを設定した方がよいかもしれませんが。。。

--
須藤 功平 <kou****@clear*****>

株式会社クリアコード (http://www.clear-code.com/)




groonga-dev メーリングリストの案内
Back to archive index