[Groonga-commit] groonga/groonga [master] proc_column_list() uses grn_output_* functions.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 6月 19日 (土) 16:30:25 JST


Daijiro MORI	2010-06-19 07:30:25 +0000 (Sat, 19 Jun 2010)

  New Revision: 1d3359450577c295c110d86d8f8eca5cb10e0637

  Log:
    proc_column_list() uses grn_output_* functions.

  Modified files:
    lib/proc.c

  Modified: lib/proc.c (+93 -127)
===================================================================
--- lib/proc.c    2010-06-18 15:29:59 +0000 (ef623cf)
+++ lib/proc.c    2010-06-19 07:30:25 +0000 (8a94b17)
@@ -693,26 +693,8 @@ column2name(grn_ctx *ctx, grn_obj *obj, grn_obj *bulk)
   GRN_TEXT_PUT(ctx, bulk, name_buf, name_len);
 }
 
-static void
-obj_source_to_json(grn_ctx *ctx, grn_db_obj *obj, grn_obj *bulk)
-{
-  grn_obj o;
-  grn_id *s = obj->source;
-  int i = 0, n = obj->source_size / sizeof(grn_id);
-
-  GRN_TEXT_INIT(&o, 0);
-  GRN_TEXT_PUTC(ctx, bulk, '[');
-  for (i = 0; i < n; i++, s++) {
-    if (i) { GRN_TEXT_PUTC(ctx, bulk, ','); }
-    objid2name(ctx, *s, &o);
-    grn_text_otoj(ctx, bulk, &o, NULL);
-  }
-  GRN_TEXT_PUTC(ctx, bulk, ']');
-  grn_obj_close(ctx, &o);
-}
-
 static int
-print_columninfo(grn_ctx *ctx, grn_obj *column, grn_obj *buf, grn_content_type otype)
+print_columninfo(grn_ctx *ctx, grn_obj *column)
 {
   grn_obj o;
   grn_id id;
@@ -721,106 +703,46 @@ print_columninfo(grn_ctx *ctx, grn_obj *column, grn_obj *buf, grn_content_type o
 
   switch (column->header.type) {
   case GRN_COLUMN_FIX_SIZE:
-    type = "\"fix\"";
+    type = "fix";
     break;
   case GRN_COLUMN_VAR_SIZE:
-    type = "\"var\"";
+    type = "var";
     break;
   case GRN_COLUMN_INDEX:
-    type = "\"index\"";
+    type = "index";
     break;
   default:
     GRN_LOG(ctx, GRN_LOG_NOTICE, "invalid header type %d\n", column->header.type);
     return 0;
   }
-
   id = grn_obj_id(ctx, column);
   path = grn_obj_path(ctx, column);
   GRN_TEXT_INIT(&o, 0);
-
-  switch (otype) {
-  case GRN_CONTENT_TSV:
-    grn_text_itoa(ctx, buf, id);
-    GRN_TEXT_PUTC(ctx, buf, '\t');
-    column2name(ctx, column, &o);
-    grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o));
-    GRN_TEXT_PUTC(ctx, buf, '\t');
-    grn_text_esc(ctx, buf, path, GRN_STRLEN(path));
-    GRN_TEXT_PUTC(ctx, buf, '\t');
-    GRN_TEXT_PUTS(ctx, buf, type);
-    GRN_TEXT_PUTC(ctx, buf, '\t');
-    grn_column_create_flags_to_text(ctx, &o, column->header.flags);
-    grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o));
-    GRN_TEXT_PUTC(ctx, buf, '\t');
-    objid2name(ctx, column->header.domain, &o);
-    grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o));
-    GRN_TEXT_PUTC(ctx, buf, '\t');
-    objid2name(ctx, grn_obj_get_range(ctx, column), &o);
-    grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o));
-    GRN_TEXT_PUTC(ctx, buf, '\t');
-    objid2name(ctx, grn_obj_get_range(ctx, column), &o);
-    grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o));
-    break;
-  case GRN_CONTENT_JSON:
-    GRN_TEXT_PUTC(ctx, buf, '[');
-    grn_text_itoa(ctx, buf, id);
-    GRN_TEXT_PUTC(ctx, buf, ',');
-    column2name(ctx, column, &o);
-    grn_text_otoj(ctx, buf, &o, NULL);
-    GRN_TEXT_PUTC(ctx, buf, ',');
-    grn_text_esc(ctx, buf, path, GRN_STRLEN(path));
-    GRN_TEXT_PUTC(ctx, buf, ',');
-    GRN_TEXT_PUTS(ctx, buf, type);
-    GRN_TEXT_PUTC(ctx, buf, ',');
-    grn_column_create_flags_to_text(ctx, &o, column->header.flags);
-    grn_text_otoj(ctx, buf, &o, NULL);
-    GRN_TEXT_PUTC(ctx, buf, ',');
-    objid2name(ctx, column->header.domain, &o);
-    grn_text_otoj(ctx, buf, &o, NULL);
-    GRN_TEXT_PUTC(ctx, buf, ',');
-    objid2name(ctx, grn_obj_get_range(ctx, column), &o);
-    grn_text_otoj(ctx, buf, &o, NULL);
-    GRN_TEXT_PUTC(ctx, buf, ',');
-    obj_source_to_json(ctx, (grn_db_obj *)column, buf);
-    GRN_TEXT_PUTC(ctx, buf, ']');
-    break;
-  case GRN_CONTENT_XML:
-  case GRN_CONTENT_NONE:
-    break;
-  }
-  grn_obj_close(ctx, &o);
-  return 1;
-}
-
-static int
-print_tableinfo(grn_ctx *ctx, grn_obj *table)
-{
-  grn_id id;
-  grn_obj o;
-  const char *path;
-  switch (table->header.type) {
-  case GRN_TABLE_HASH_KEY:
-  case GRN_TABLE_PAT_KEY:
-  case GRN_TABLE_NO_KEY:
-  case GRN_TABLE_VIEW:
-    break;
-  default:
-    return 0;
-  }
-  id = grn_obj_id(ctx, table);
-  path = grn_obj_path(ctx, table);
-  GRN_TEXT_INIT(&o, 0);
   grn_output_array_open(ctx, "", -1);
   grn_output_int64(ctx, id);
-  objid2name(ctx, id, &o);
+  column2name(ctx, column, &o);
   grn_output_obj(ctx, &o, NULL);
   grn_output_str(ctx, path);
-  grn_table_create_flags_to_text(ctx, &o, table->header.flags);
+  grn_output_str(ctx, type);
+  grn_column_create_flags_to_text(ctx, &o, column->header.flags);
   grn_output_obj(ctx, &o, NULL);
-  objid2name(ctx, table->header.domain, &o);
+  objid2name(ctx, column->header.domain, &o);
   grn_output_obj(ctx, &o, NULL);
-  objid2name(ctx, grn_obj_get_range(ctx, table), &o);
+  objid2name(ctx, grn_obj_get_range(ctx, column), &o);
   grn_output_obj(ctx, &o, NULL);
+  {
+    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(ctx, "", -1);
+    for (i = 0; i < n; i++, s++) {
+      objid2name(ctx, *s, &o);
+      grn_output_obj(ctx, &o, NULL);
+    }
+    grn_output_array_close(ctx);
+
+  }
+  //  print_obj_source(ctx, (grn_db_obj *)column);
   grn_output_array_close(ctx);
   GRN_OBJ_FIN(ctx, &o);
   return 1;
@@ -829,48 +751,58 @@ print_tableinfo(grn_ctx *ctx, grn_obj *table)
 static grn_obj *
 proc_column_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
-  grn_content_type ct = ctx->impl->output_type;
-  grn_obj *outbuf = ctx->impl->outbuf;
   grn_obj *table;
   if ((table = grn_ctx_get(ctx, GRN_TEXT_VALUE(VAR(0)),
                            GRN_TEXT_LEN(VAR(0))))) {
     grn_hash *cols;
     if ((cols = grn_hash_create(ctx, NULL, sizeof(grn_id), 0,
                                 GRN_OBJ_TABLE_HASH_KEY|GRN_HASH_TINY))) {
+      grn_output_array_open(ctx, "", -1);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "id");
+      grn_output_str(ctx, "UInt32");
+      grn_output_array_close(ctx);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "name");
+      grn_output_str(ctx, "ShortText");
+      grn_output_array_close(ctx);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "path");
+      grn_output_str(ctx, "ShortText");
+      grn_output_array_close(ctx);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "type");
+      grn_output_str(ctx, "ShortText");
+      grn_output_array_close(ctx);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "flags");
+      grn_output_str(ctx, "ShortText");
+      grn_output_array_close(ctx);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "domain");
+      grn_output_str(ctx, "ShortText");
+      grn_output_array_close(ctx);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "range");
+      grn_output_str(ctx, "ShortText");
+      grn_output_array_close(ctx);
+      grn_output_array_open(ctx, "", -1);
+      grn_output_str(ctx, "source");
+      grn_output_str(ctx, "ShortText");
+      grn_output_array_close(ctx);
+      grn_output_array_close(ctx);
       if (grn_table_columns(ctx, table, NULL, 0, (grn_obj *)cols) >= 0) {
         grn_id *key;
-        char line_delimiter, column_delimiter;
-
-        switch (ct) {
-        case GRN_CONTENT_TSV:
-          line_delimiter = '\n';
-          column_delimiter = '\t';
-          GRN_TEXT_PUTS(ctx, outbuf, "id\tname\tpath\ttype\tflags\tdomain\trange");
-          break;
-        case GRN_CONTENT_JSON:
-          line_delimiter = ',';
-          column_delimiter = ',';
-          GRN_TEXT_PUTS(ctx, outbuf, "[[[\"id\", \"UInt32\"],[\"name\",\"ShortText\"],[\"path\",\"ShortText\"],[\"type\",\"ShortText\"],[\"flags\",\"ShortText\"],[\"domain\", \"ShortText\"],[\"range\", \"ShortText\"],[\"source\",\"ShortText\"]]");
-          break;
-        case GRN_CONTENT_XML:
-        case GRN_CONTENT_NONE:
-          break;
-        }
-
         GRN_HASH_EACH(ctx, cols, id, &key, NULL, NULL, {
           grn_obj *col;
           if ((col = grn_ctx_at(ctx, *key))) {
-            GRN_TEXT_PUTC(ctx, outbuf, line_delimiter);
-            if (!print_columninfo(ctx, col, outbuf, ct)) {
-              grn_bulk_truncate(ctx, outbuf, GRN_BULK_VSIZE(outbuf) - 1);
-            }
+            print_columninfo(ctx, col);
             grn_obj_unlink(ctx, col);
           }
         });
-        if (ct == GRN_CONTENT_JSON) {
-          GRN_TEXT_PUTC(ctx, outbuf, ']');
-        }
       }
+      grn_output_array_close(ctx);
       grn_hash_close(ctx, cols);
     }
     grn_obj_unlink(ctx, table);
@@ -882,6 +814,40 @@ 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)
+{
+  grn_id id;
+  grn_obj o;
+  const char *path;
+  switch (table->header.type) {
+  case GRN_TABLE_HASH_KEY:
+  case GRN_TABLE_PAT_KEY:
+  case GRN_TABLE_NO_KEY:
+  case GRN_TABLE_VIEW:
+    break;
+  default:
+    return 0;
+  }
+  id = grn_obj_id(ctx, table);
+  path = grn_obj_path(ctx, table);
+  GRN_TEXT_INIT(&o, 0);
+  grn_output_array_open(ctx, "", -1);
+  grn_output_int64(ctx, id);
+  objid2name(ctx, id, &o);
+  grn_output_obj(ctx, &o, NULL);
+  grn_output_str(ctx, path);
+  grn_table_create_flags_to_text(ctx, &o, table->header.flags);
+  grn_output_obj(ctx, &o, NULL);
+  objid2name(ctx, table->header.domain, &o);
+  grn_output_obj(ctx, &o, NULL);
+  objid2name(ctx, grn_obj_get_range(ctx, table), &o);
+  grn_output_obj(ctx, &o, NULL);
+  grn_output_array_close(ctx);
+  GRN_OBJ_FIN(ctx, &o);
+  return 1;
+}
+
 static grn_obj *
 proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {




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