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);
}
}