[Groonga-commit] groonga/groonga [master] [msgpack] explicitly pass # of tables. refs #1215

Back to archive index

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




Groonga-commit メーリングリストの案内
Back to archive index