null+****@clear*****
null+****@clear*****
2011年 12月 19日 (月) 09:54:29 JST
Yoji SHIDARA 2011-12-19 00:54:29 +0000 (Mon, 19 Dec 2011) New Revision: 1e88ed7d24aefa654427f56d08dc3d7ab298b778 Log: [msgpack] explicitly pass # of tables. refs #1215 this commit enable table_list to produce valid msgpack binary. Modified files: lib/proc.c Modified: lib/proc.c (+38 -10) =================================================================== --- lib/proc.c 2011-12-18 11:47:31 +0000 (3574d90) +++ lib/proc.c 2011-12-19 00:54:29 +0000 (aba9688) @@ -1131,22 +1131,28 @@ proc_column_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_da return NULL; } -static int -print_tableinfo(grn_ctx *ctx, grn_obj *table) +static grn_bool +is_table(grn_obj *obj) { - grn_id id; - grn_obj o; - const char *path; - switch (table->header.type) { + switch (obj->header.type) { case GRN_TABLE_HASH_KEY: case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: case GRN_TABLE_VIEW: - break; + return GRN_TRUE; default: - return 0; + return GRN_FALSE; } +} + +static int +print_tableinfo(grn_ctx *ctx, grn_obj *table) +{ + grn_id id; + grn_obj o; + const char *path; + id = grn_obj_id(ctx, table); path = grn_obj_path(ctx, table); GRN_TEXT_INIT(&o, 0); @@ -1170,9 +1176,29 @@ static grn_obj * proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { grn_table_cursor *cur; + int table_list_length = -1; + +#ifdef HAVE_MESSAGE_PACK + if (ctx->impl->output_type == GRN_CONTENT_MSGPACK) { + table_list_length = 1; /* header */ + if ((cur = grn_table_cursor_open(ctx, ctx->impl->db, NULL, 0, NULL, 0, 0, -1, 0))) { + grn_id id; + while ((id = grn_table_cursor_next(ctx, cur)) != GRN_ID_NIL) { + grn_obj *o; + if ((o = grn_ctx_at(ctx, id))) { + if (is_table(o)) { + table_list_length++; + } + grn_obj_unlink(ctx, o); + } + } + } + } +#endif + if ((cur = grn_table_cursor_open(ctx, ctx->impl->db, NULL, 0, NULL, 0, 0, -1, 0))) { grn_id id; - GRN_OUTPUT_ARRAY_OPEN("TABLE_LIST", -1); + GRN_OUTPUT_ARRAY_OPEN("TABLE_LIST", table_list_length); GRN_OUTPUT_ARRAY_OPEN("HEADER", 6); GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2); GRN_OUTPUT_CSTR("id"); @@ -1202,7 +1228,9 @@ proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat while ((id = grn_table_cursor_next(ctx, cur)) != GRN_ID_NIL) { grn_obj *o; if ((o = grn_ctx_at(ctx, id))) { - print_tableinfo(ctx, o); + if (is_table(o)) { + print_tableinfo(ctx, o); + } grn_obj_unlink(ctx, o); } }