null+****@clear*****
null+****@clear*****
2010年 7月 15日 (木) 17:10:04 JST
Kouhei Sutou 2010-07-15 08:10:04 +0000 (Thu, 15 Jul 2010) New Revision: 5426f5c0626bd4db7c7f71bbcfbaf07ce993507e Log: support record inspection. Modified files: lib/util.c test/unit/core/test-inspect.c Modified: lib/util.c (+94 -12) =================================================================== --- lib/util.c 2010-07-15 07:37:24 +0000 (226db73) +++ lib/util.c 2010-07-15 08:10:04 +0000 (5a3c7f9) @@ -250,13 +250,8 @@ grn_ii_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) } static grn_rc -grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) +grn_table_type_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) { - grn_hash *cols; - grn_id range_id; - grn_obj *range; - - GRN_TEXT_PUTS(ctx, buf, "#<table:"); switch (obj->header.type) { case GRN_TABLE_HASH_KEY: GRN_TEXT_PUTS(ctx, buf, "hash"); @@ -268,6 +263,19 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) GRN_TEXT_PUTS(ctx, buf, "no_key"); break; } + + return GRN_SUCCESS; +} + +static grn_rc +grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) +{ + grn_hash *cols; + grn_id range_id; + grn_obj *range; + + GRN_TEXT_PUTS(ctx, buf, "#<table:"); + grn_table_type_inspect(ctx, buf, obj); GRN_TEXT_PUTS(ctx, buf, " "); grn_name_inspect(ctx, buf, obj); @@ -309,12 +317,13 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) int i = 0; grn_id *key; GRN_HASH_EACH(ctx, cols, id, &key, NULL, NULL, { - grn_obj *col = grn_ctx_at(ctx, *key); - if (col) { - if (i++ > 0) { GRN_TEXT_PUTS(ctx, buf, ", "); } - grn_column_name_(ctx, col, buf); - } - }); + grn_obj *col = grn_ctx_at(ctx, *key); + if (col) { + if (i++ > 0) { GRN_TEXT_PUTS(ctx, buf, ", "); } + grn_column_name_(ctx, col, buf); + grn_obj_unlink(ctx, col); + } + }); } grn_hash_close(ctx, cols); } @@ -373,9 +382,66 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) return GRN_SUCCESS; } +static grn_rc +grn_record_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) +{ + grn_id id; + grn_obj *table; + grn_hash *cols; + + table = grn_ctx_at(ctx, obj->header.domain); + GRN_TEXT_PUTS(ctx, buf, "#<record:"); + grn_table_type_inspect(ctx, buf, table); + + GRN_TEXT_PUTS(ctx, buf, " id:"); + id = GRN_RECORD_VALUE(obj); + grn_text_lltoa(ctx, buf, id); + + if (grn_table_at(ctx, table, id)) { + if (table->header.type != GRN_TABLE_NO_KEY) { + grn_obj key; + GRN_TEXT_PUTS(ctx, buf, " key:"); + GRN_OBJ_INIT(&key, GRN_BULK, 0, table->header.domain); + grn_table_get_key2(ctx, table, id, &key); + grn_inspect(ctx, buf, &key); + GRN_OBJ_FIN(ctx, &key); + } + if ((cols = grn_hash_create(ctx, NULL, sizeof(grn_id), 0, + GRN_OBJ_TABLE_HASH_KEY|GRN_HASH_TINY))) { + if (grn_table_columns(ctx, table, "", 0, (grn_obj *)cols)) { + grn_id *key; + GRN_HASH_EACH(ctx, cols, id, &key, NULL, NULL, { + grn_obj *col = grn_ctx_at(ctx, *key); + if (col) { + grn_obj value; + GRN_TEXT_INIT(&value, 0); + GRN_TEXT_PUTS(ctx, buf, " "); + grn_column_name_(ctx, col, buf); + GRN_TEXT_PUTS(ctx, buf, ":"); + grn_obj_get_value(ctx, col, id, &value); + grn_inspect(ctx, buf, &value); + GRN_OBJ_FIN(ctx, &value); + grn_obj_unlink(ctx, col); + } + }); + } + grn_hash_close(ctx, cols); + } + } else { + GRN_TEXT_PUTS(ctx, buf, "(nonexistent)"); + } + GRN_TEXT_PUTS(ctx, buf, ">"); + + grn_obj_unlink(ctx, table); + + return GRN_SUCCESS; +} + grn_obj * grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj) { + grn_obj *domain; + if (!buffer) { buffer = grn_obj_open(ctx, GRN_BULK, 0, GRN_DB_TEXT); } @@ -386,6 +452,22 @@ grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj) } switch (obj->header.type) { + case GRN_BULK : + domain = grn_ctx_at(ctx, obj->header.domain); + if (domain) { + grn_id type = domain->header.type; + grn_obj_unlink(ctx, domain); + switch (type) { + case GRN_TABLE_HASH_KEY : + case GRN_TABLE_PAT_KEY : + case GRN_TABLE_NO_KEY : + grn_record_inspect(ctx, buffer, obj); + return buffer; + default : + break; + } + } + break; case GRN_EXPR : grn_expr_inspect(ctx, buffer, obj); return buffer; Modified: test/unit/core/test-inspect.c (+29 -0) =================================================================== --- test/unit/core/test-inspect.c 2010-07-15 07:37:24 +0000 (c9ce4b5) +++ test/unit/core/test-inspect.c 2010-07-15 08:10:04 +0000 (e6dd6ed) @@ -63,6 +63,7 @@ void test_column_fix_size(void); void test_column_var_size(void); void test_column_index(void); void test_type(void); +void test_record(void); static gchar *tmp_directory; @@ -82,6 +83,7 @@ static grn_obj *geo_point_tokyo, *geo_point_wgs84; static grn_obj *uvector; static grn_obj *pvector; static grn_obj *vector; +static grn_obj *record; void cut_startup(void) @@ -118,6 +120,7 @@ setup_values(void) uvector = NULL; pvector = NULL; vector = NULL; + record = NULL; } void @@ -159,6 +162,7 @@ teardown_values(void) grn_obj_unlink(context, uvector); grn_obj_unlink(context, pvector); grn_obj_unlink(context, vector); + grn_obj_unlink(context, record); } void @@ -703,3 +707,28 @@ test_type(void) ">", inspected_string()); } + +void +test_record(void) +{ + assert_send_command("table_create Sites TABLE_HASH_KEY ShortText"); + assert_send_command("column_create Sites name COLUMN_SCALAR Text"); + assert_send_command("load " + "'[" + "[\"_key\",\"name\"]," + "[\"groonga.org\",\"groonga\"]," + "[\"razil.jp\",\"Brazil\"]" + "]' " + "Sites"); + + record = grn_obj_open(context, GRN_BULK, 0, + grn_obj_id(context, get_object("Sites"))); + GRN_RECORD_SET(context, record, 1); + inspected = grn_inspect(context, NULL, record); + cut_assert_equal_string("#<record:hash " + "id:1 " + "key:\"groonga.org\" " + "name:\"groonga\"" + ">", + inspected_string()); +}