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