[Groonga-commit] groonga/groonga [master] table_list: ignore unloadable objects

Back to archive index

null+****@clear***** null+****@clear*****
2012年 7月 19日 (木) 12:22:14 JST


Kouhei Sutou	2012-07-19 12:22:14 +0900 (Thu, 19 Jul 2012)

  New Revision: 5786bf4fe124aa2b96f0414f0493e050ec1d3e09
  https://github.com/groonga/groonga/commit/5786bf4fe124aa2b96f0414f0493e050ec1d3e09

  Log:
    table_list: ignore unloadable objects
    
    "add" and "set" commands moved to "table" plugin from built-in. It
    causes database incompatible. Old version databases has "add" and
    "set" but the current database doesn't register "add" and "set" by
    default.
    
    This change ignores unloadable objects such as "add" and "set" command
    in "table_list" command to solve the above problem.
    
    refs #1429
    
    Reported by IWAI, Masaharu. Thanks!!!

  Modified files:
    lib/proc.c

  Modified: lib/proc.c (+57 -51)
===================================================================
--- lib/proc.c    2012-07-19 11:28:10 +0900 (3b92991)
+++ lib/proc.c    2012-07-19 12:22:14 +0900 (51f10d5)
@@ -1330,67 +1330,73 @@ 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;
+  grn_obj tables;
+  int n_top_level_elements;
+  int n_elements_for_header = 1;
+  int n_tables;
+  int i;
 
-#ifdef WITH_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
+  GRN_PTR_INIT(&tables, GRN_OBJ_VECTOR, GRN_ID_NIL);
 
   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", table_list_length);
-    GRN_OUTPUT_ARRAY_OPEN("HEADER", 6);
-    GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
-    GRN_OUTPUT_CSTR("id");
-    GRN_OUTPUT_CSTR("UInt32");
-    GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
-    GRN_OUTPUT_CSTR("name");
-    GRN_OUTPUT_CSTR("ShortText");
-    GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
-    GRN_OUTPUT_CSTR("path");
-    GRN_OUTPUT_CSTR("ShortText");
-    GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
-    GRN_OUTPUT_CSTR("flags");
-    GRN_OUTPUT_CSTR("ShortText");
-    GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
-    GRN_OUTPUT_CSTR("domain");
-    GRN_OUTPUT_CSTR("ShortText");
-    GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
-    GRN_OUTPUT_CSTR("range");
-    GRN_OUTPUT_CSTR("ShortText");
-    GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_CLOSE();
     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)) {
-          print_tableinfo(ctx, o);
+      grn_obj *object;
+      if ((object = grn_ctx_at(ctx, id))) {
+        if (is_table(object)) {
+          GRN_PTR_PUT(ctx, &tables, object);
+        } else {
+          grn_obj_unlink(ctx, object);
+        }
+      } else {
+        if (ctx->rc != GRN_SUCCESS) {
+          ERRCLR(ctx);
         }
-        grn_obj_unlink(ctx, o);
       }
     }
-    GRN_OUTPUT_ARRAY_CLOSE();
     grn_table_cursor_close(ctx, cur);
   }
+
+  n_tables = GRN_BULK_VSIZE(&tables) / sizeof(grn_obj *);
+  n_top_level_elements = n_elements_for_header + n_tables;
+  GRN_OUTPUT_ARRAY_OPEN("TABLE_LIST", n_top_level_elements);
+
+  GRN_OUTPUT_ARRAY_OPEN("HEADER", 6);
+  GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
+  GRN_OUTPUT_CSTR("id");
+  GRN_OUTPUT_CSTR("UInt32");
+  GRN_OUTPUT_ARRAY_CLOSE();
+  GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
+  GRN_OUTPUT_CSTR("name");
+  GRN_OUTPUT_CSTR("ShortText");
+  GRN_OUTPUT_ARRAY_CLOSE();
+  GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
+  GRN_OUTPUT_CSTR("path");
+  GRN_OUTPUT_CSTR("ShortText");
+  GRN_OUTPUT_ARRAY_CLOSE();
+  GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
+  GRN_OUTPUT_CSTR("flags");
+  GRN_OUTPUT_CSTR("ShortText");
+  GRN_OUTPUT_ARRAY_CLOSE();
+  GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
+  GRN_OUTPUT_CSTR("domain");
+  GRN_OUTPUT_CSTR("ShortText");
+  GRN_OUTPUT_ARRAY_CLOSE();
+  GRN_OUTPUT_ARRAY_OPEN("PROPERTY", 2);
+  GRN_OUTPUT_CSTR("range");
+  GRN_OUTPUT_CSTR("ShortText");
+  GRN_OUTPUT_ARRAY_CLOSE();
+  GRN_OUTPUT_ARRAY_CLOSE();
+
+  for (i = 0; i < n_tables; i++) {
+    grn_obj *table = ((grn_obj **)GRN_BULK_HEAD(&tables))[i];
+    print_tableinfo(ctx, table);
+    grn_obj_unlink(ctx, table);
+  }
+  GRN_OBJ_FIN(ctx, &tables);
+
+  GRN_OUTPUT_ARRAY_CLOSE();
+
   return NULL;
 }
 
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
下载 



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