[Groonga-commit] groonga/groonga [master] Assign nelements argument for grn_output_array_open() properly as possible.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 6月 23日 (水) 11:08:49 JST


Daijiro MORI	2010-06-23 02:08:49 +0000 (Wed, 23 Jun 2010)

  New Revision: 12db8a40e725f7f0e39028ef38ddaba3a2ead69b

  Log:
    Assign nelements argument for grn_output_array_open() properly as possible.

  Modified files:
    lib/output.c
    lib/proc.c
    lib/str.c

  Modified: lib/output.c (+21 -13)
===================================================================
--- lib/output.c    2010-06-22 13:38:30 +0000 (88cb4e0)
+++ lib/output.c    2010-06-23 02:08:49 +0000 (064a766)
@@ -416,17 +416,19 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
         if ((a->obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
           grn_id *idp = (grn_id *)GRN_BULK_HEAD(&buf);
           if (a->next) {
-            grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1);
-            for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) {
+            vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id);
+            grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs);
+            for (; vs--; idp++) {
               grn_text_atoj(ctx, outbuf, output_type, (grn_obj *)a->next, *idp);
             }
             grn_output_array_close(ctx, outbuf, output_type);
           } else {
             grn_obj b;
             GRN_RECORD_INIT(&b, 0, DB_OBJ(a->obj)->range);
-            grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1);
+            vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id);
+            grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs);
             /* todo: support other fixe sized data types */
-            for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) {
+            for (; vs--; idp++) {
               GRN_RECORD_SET(ctx, &b, *idp);
               grn_output_obj(ctx, outbuf, output_type, &b, NULL);
             }
@@ -584,10 +586,10 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
         int ncolumns = GRN_BULK_VSIZE(&format->columns)/sizeof(grn_obj *);
         grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns);
         if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) {
-          grn_output_array_open(ctx, outbuf, output_type, "FIELDS", -1);
+          grn_output_array_open(ctx, outbuf, output_type, "COLUMNS", ncolumns);
           for (j = 0; j < ncolumns; j++) {
             grn_id range_id;
-            grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1);
+            grn_output_array_open(ctx, outbuf, output_type, "COLUMN", 2);
             GRN_BULK_REWIND(&buf);
             grn_column_name_(ctx, columns[j], &buf);
             grn_output_obj(ctx, outbuf, output_type, &buf, NULL);
@@ -611,7 +613,7 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
           }
           grn_output_array_close(ctx, outbuf, output_type);
         }
-        grn_output_array_open(ctx, outbuf, output_type, "HIT", -1);
+        grn_output_array_open(ctx, outbuf, output_type, "HIT", ncolumns);
         for (j = 0; j < ncolumns; j++) {
           grn_text_atoj_o(ctx, outbuf, output_type, columns[j], obj);
         }
@@ -640,15 +642,15 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
       int ncolumns = GRN_BULK_VSIZE(&format->columns) / sizeof(grn_obj *);
       grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns);
       grn_output_array_open(ctx, outbuf, output_type, "RESULTSET", -1);
-      grn_output_array_open(ctx, outbuf, output_type, "NHITS", -1);
+      grn_output_array_open(ctx, outbuf, output_type, "NHITS", 1);
       grn_text_itoa(ctx, outbuf, ve - v);
       grn_output_array_close(ctx, outbuf, output_type);
       if (v < ve) {
         if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) {
-          grn_output_array_open(ctx, outbuf, output_type, "FIELDS", -1);
+          grn_output_array_open(ctx, outbuf, output_type, "COLUMNS", -1);
           for (j = 0; j < ncolumns; j++) {
             grn_id range_id;
-            grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1);
+            grn_output_array_open(ctx, outbuf, output_type, "COLUMN", -1);
             GRN_BULK_REWIND(&buf);
             grn_column_name_(ctx, columns[j], &buf);
             grn_output_obj(ctx, outbuf, output_type, &buf, NULL);
@@ -680,13 +682,19 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
             grn_output_obj(ctx, outbuf, output_type, &buf, NULL);
           }
           grn_output_array_close(ctx, outbuf, output_type);
+          v++;
+          if (v < ve) {
+
+          } else {
+            break;
+          }
         }
       }
       grn_output_array_close(ctx, outbuf, output_type);
     } else {
       grn_obj *range = grn_ctx_at(ctx, obj->header.domain);
       if (range && range->header.type == GRN_TYPE) {
-        grn_id value_size = ((struct _grn_type *)range)->obj.range;
+        int value_size = ((struct _grn_type *)range)->obj.range;
         char *v = (char *)GRN_BULK_HEAD(obj),
              *ve = (char *)GRN_BULK_CURR(obj);
         grn_output_array_open(ctx, outbuf, output_type, "VECTOR", -1);
@@ -797,10 +805,10 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
       grn_text_itoa(ctx, outbuf, format->nhits);
       grn_output_array_close(ctx, outbuf, output_type);
       if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) {
-        grn_output_array_open(ctx, outbuf, output_type, "FIELDS", -1);
+        grn_output_array_open(ctx, outbuf, output_type, "COLUMNS", -1);
         for (j = 0; j < ncolumns; j++) {
           grn_id range_id;
-          grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1);
+          grn_output_array_open(ctx, outbuf, output_type, "COLUMN", -1);
           GRN_BULK_REWIND(&buf);
           grn_column_name_(ctx, columns[j], &buf);
           grn_output_obj(ctx, outbuf, output_type, &buf, NULL);

  Modified: lib/proc.c (+20 -20)
===================================================================
--- lib/proc.c    2010-06-22 13:38:30 +0000 (02b7b86)
+++ lib/proc.c    2010-06-23 02:08:49 +0000 (494f9b8)
@@ -373,7 +373,7 @@ proc_status(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
   grn_timeval now;
   grn_timeval_now(ctx, &now);
-  GRN_OUTPUT_MAP_OPEN("STATUS", -1);
+  GRN_OUTPUT_MAP_OPEN("STATUS", 8);
   GRN_OUTPUT_CSTR("alloc_count");
   GRN_OUTPUT_INT32(grn_alloc_count());
   GRN_OUTPUT_CSTR("starttime");
@@ -717,7 +717,7 @@ print_columninfo(grn_ctx *ctx, grn_obj *column)
   id = grn_obj_id(ctx, column);
   path = grn_obj_path(ctx, column);
   GRN_TEXT_INIT(&o, 0);
-  GRN_OUTPUT_ARRAY_OPEN("", -1);
+  GRN_OUTPUT_ARRAY_OPEN("", 8);
   GRN_OUTPUT_INT64(id);
   column2name(ctx, column, &o);
   GRN_OUTPUT_OBJ(&o, NULL);
@@ -733,7 +733,7 @@ print_columninfo(grn_ctx *ctx, grn_obj *column)
     grn_db_obj *obj = (grn_db_obj *)column;
     grn_id *s = obj->source;
     int i = 0, n = obj->source_size / sizeof(grn_id);
-    GRN_OUTPUT_ARRAY_OPEN("", -1);
+    GRN_OUTPUT_ARRAY_OPEN("", n);
     for (i = 0; i < n; i++, s++) {
       objid2name(ctx, *s, &o);
       GRN_OUTPUT_OBJ(&o, NULL);
@@ -757,36 +757,36 @@ proc_column_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_da
     if ((cols = grn_hash_create(ctx, NULL, sizeof(grn_id), 0,
                                 GRN_OBJ_TABLE_HASH_KEY|GRN_HASH_TINY))) {
       GRN_OUTPUT_ARRAY_OPEN("", -1);
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 8);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("id");
       GRN_OUTPUT_CSTR("UInt32");
       GRN_OUTPUT_ARRAY_CLOSE();
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("name");
       GRN_OUTPUT_CSTR("ShortText");
       GRN_OUTPUT_ARRAY_CLOSE();
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("path");
       GRN_OUTPUT_CSTR("ShortText");
       GRN_OUTPUT_ARRAY_CLOSE();
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("type");
       GRN_OUTPUT_CSTR("ShortText");
       GRN_OUTPUT_ARRAY_CLOSE();
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("flags");
       GRN_OUTPUT_CSTR("ShortText");
       GRN_OUTPUT_ARRAY_CLOSE();
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("domain");
       GRN_OUTPUT_CSTR("ShortText");
       GRN_OUTPUT_ARRAY_CLOSE();
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("range");
       GRN_OUTPUT_CSTR("ShortText");
       GRN_OUTPUT_ARRAY_CLOSE();
-      GRN_OUTPUT_ARRAY_OPEN("", -1);
+      GRN_OUTPUT_ARRAY_OPEN("", 2);
       GRN_OUTPUT_CSTR("source");
       GRN_OUTPUT_CSTR("ShortText");
       GRN_OUTPUT_ARRAY_CLOSE();
@@ -831,7 +831,7 @@ print_tableinfo(grn_ctx *ctx, grn_obj *table)
   id = grn_obj_id(ctx, table);
   path = grn_obj_path(ctx, table);
   GRN_TEXT_INIT(&o, 0);
-  GRN_OUTPUT_ARRAY_OPEN("TABLE", -1);
+  GRN_OUTPUT_ARRAY_OPEN("TABLE", 6);
   GRN_OUTPUT_INT64(id);
   objid2name(ctx, id, &o);
   GRN_OUTPUT_OBJ(&o, NULL);
@@ -854,28 +854,28 @@ proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat
   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("COLUMNS", -1);
-    GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1);
+    GRN_OUTPUT_ARRAY_OPEN("COLUMNS", 6);
+    GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2);
     GRN_OUTPUT_CSTR("id");
     GRN_OUTPUT_CSTR("UInt32");
     GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1);
+    GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2);
     GRN_OUTPUT_CSTR("name");
     GRN_OUTPUT_CSTR("ShortText");
     GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1);
+    GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2);
     GRN_OUTPUT_CSTR("path");
     GRN_OUTPUT_CSTR("ShortText");
     GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1);
+    GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2);
     GRN_OUTPUT_CSTR("flags");
     GRN_OUTPUT_CSTR("ShortText");
     GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1);
+    GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2);
     GRN_OUTPUT_CSTR("domain");
     GRN_OUTPUT_CSTR("ShortText");
     GRN_OUTPUT_ARRAY_CLOSE();
-    GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1);
+    GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2);
     GRN_OUTPUT_CSTR("range");
     GRN_OUTPUT_CSTR("ShortText");
     GRN_OUTPUT_ARRAY_CLOSE();

  Modified: lib/str.c (+6 -0)
===================================================================
--- lib/str.c    2010-06-22 13:38:30 +0000 (c91cfba)
+++ lib/str.c    2010-06-23 02:08:49 +0000 (0bae6e3)
@@ -2700,6 +2700,12 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format)
             grn_text_otoj(ctx, bulk, &buf, NULL);
           }
           GRN_TEXT_PUTC(ctx, bulk, ']');
+          v++;
+          if (v < ve) {
+            GRN_TEXT_PUTC(ctx, bulk, ',');
+          } else {
+            break;
+          }
         }
       }
       GRN_TEXT_PUTC(ctx, bulk, ']');




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