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/)