morit****@razil*****
morit****@razil*****
2009年 4月 15日 (水) 22:53:30 JST
森です。 すみません。。 一時テーブルであることと、**_TINYであることとは実は別なのです。 **_TINY flagの立ったテーブルは内部使用のためのもので、 DB_API経由でユーザが使用することを想定していません。 GRN_OBJ_PERSISTENTが立っていない場合でも、GRN_IO_HASHやGRN_IO_ARRAYが作成されますが、 この時のioは永続化されないので、一時テーブルとしての仕様を満たしているという考えです。 >>> Kouhei Sutou さんは書きました: > 須藤です。 > > GRN_OBJ_PERSISTENTを指定せずにgrn_table_create()でテーブルを > 作成しても永続テーブルになってしまいます。 > > GRN_{ARRAY,HASH}_TINYをGRN_OBJ_TEMPORARYにする方がよい気もし > ますが、とりあえず、grn_table_create()でごにょごにょするパッ > チです。 > > diff --git a/lib/db.c b/lib/db.c > index 0c1f05e..6711aee 100644 > --- a/lib/db.c > +++ b/lib/db.c > @@ -509,12 +509,16 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned name_size, > &subrec_offset, &key_size, &value_size); > switch (flags & GRN_OBJ_TABLE_TYPE_MASK) { > case GRN_OBJ_TABLE_HASH_KEY : > + if (!(flags & GRN_OBJ_PERSISTENT)) > + flags |= GRN_HASH_TINY; > res = (grn_obj *)grn_hash_create(ctx, path, key_size, value_size, flags, encoding); > break; > case GRN_OBJ_TABLE_PAT_KEY : > res = (grn_obj *)grn_pat_create(ctx, path, key_size, value_size, flags, encoding); > break; > case GRN_OBJ_TABLE_NO_KEY : > + if (!(flags & GRN_OBJ_PERSISTENT)) > + flags |= GRN_ARRAY_TINY; > res = (grn_obj *)grn_array_create(ctx, path, value_size, flags); > break; > } > diff --git a/test/unit/core/test-table.c b/test/unit/core/test-table.c > index c58786f..19c9374 100644 > --- a/test/unit/core/test-table.c > +++ b/test/unit/core/test-table.c > @@ -24,6 +24,8 @@ > #include "../lib/grn-assertions.h" > > void test_array_set_data(void); > +void test_array_create_temporary(void); > +void test_hash_create_temporary(void); > > static grn_logger_info *logger; > static grn_ctx context; > @@ -66,3 +68,25 @@ test_array_set_data(void) > retrieved_record_value = grn_obj_get_value(&context, table, record_id, NULL); > cut_assert_equal_string(value, GRN_BULK_HEAD(retrieved_record_value)); > } > + > +void > +test_array_create_temporary(void) > +{ > + grn_obj *table; > + > + table = grn_table_create(&context, NULL, 0, NULL, > + GRN_OBJ_TABLE_NO_KEY, > + NULL, sizeof(grn_id), GRN_ENC_DEFAULT); > + cut_assert_equal_string(NULL, grn_obj_path(&context, table)); > +} > + > +void > +test_hash_create_temporary(void) > +{ > + grn_obj *table; > + > + table = grn_table_create(&context, NULL, 0, NULL, > + GRN_OBJ_TABLE_HASH_KEY, > + NULL, sizeof(grn_id), GRN_ENC_DEFAULT); > + cut_assert_equal_string(NULL, grn_obj_path(&context, table)); > +} > > -- > 須藤 功平 <kou****@clear*****> > > 株式会社クリアコード (http://www.clear-code.com/) > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev > -- morita