[groonga-dev,00274] [PATCH] HTTP: grn_rc戻り値対応

Back to archive index

Kouhei Sutou kou****@clear*****
2009年 11月 10日 (火) 12:11:35 JST


須藤です。

ドキュメントによると、table_create, column_create, view_add
は戻り値がgrn_rcだけですが、それらを実装するパッチです。TSV
とXMLはどのようなフォーマットになるのかがわからなかったので、
とりあえずJSONだけです。

diff --git a/lib/proc.c b/lib/proc.c
index 554715b..83d7546 100644
--- a/lib/proc.c
+++ b/lib/proc.c
@@ -30,6 +30,28 @@ const char *grn_admin_html_path = NULL;
 #define DEFAULT_LIMIT           10
 #define DEFAULT_OUTPUT_COLUMNS  "_id _key _value *"
 
+static void
+print_return_code(grn_ctx *ctx, grn_obj *outbuf, grn_content_type ct)
+{
+    switch (ct) {
+    case GRN_CONTENT_JSON:
+      GRN_TEXT_PUTS(ctx, outbuf, "[[");
+      grn_text_itoa(ctx, outbuf, ctx->rc);
+      if (ctx->rc) {
+        GRN_TEXT_PUTC(ctx, outbuf, ',');
+        grn_text_esc(ctx, outbuf, ctx->errbuf, strlen(ctx->errbuf));
+      }
+      GRN_TEXT_PUTS(ctx, outbuf, "]]");
+      break;
+    case GRN_CONTENT_TSV:
+    case GRN_CONTENT_XML:
+      /* TODO: implement */
+      break;
+    case GRN_CONTENT_NONE:
+      break;
+    }
+}
+
 static grn_obj *
 proc_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
@@ -153,7 +175,7 @@ static grn_obj *
 proc_table_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
   uint32_t nvars;
-  grn_obj *buf = args[0];
+  grn_obj *outbuf = args[0];
   grn_expr_var *vars;
 
   grn_proc_get_info(ctx, user_data, &vars, &nvars, NULL);
@@ -162,6 +184,7 @@ proc_table_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_d
     grn_obj *table;
     grn_obj_flags flags = grn_atoi(GRN_TEXT_VALUE(&vars[1].value),
                                    GRN_BULK_CURR(&vars[1].value), NULL);
+    grn_content_type ct = GRN_INT32_VALUE(&vars[5].value);
     if (GRN_TEXT_LEN(&vars[0].value)) { flags |= GRN_OBJ_PERSISTENT; }
     table = grn_table_create(ctx,
                              GRN_TEXT_VALUE(&vars[0].value),
@@ -178,16 +201,16 @@ proc_table_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_d
                                    GRN_TEXT_LEN(&vars[4].value)));
       grn_obj_unlink(ctx, table);
     }
-    GRN_TEXT_PUTS(ctx, buf, ctx->rc ? "false" : "true");
+    print_return_code(ctx, outbuf, ct);
   }
-  return buf;
+  return outbuf;
 }
 
 static grn_obj *
 proc_column_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
   uint32_t nvars;
-  grn_obj *buf = args[0];
+  grn_obj *outbuf = args[0];
   grn_expr_var *vars;
   grn_proc_get_info(ctx, user_data, &vars, &nvars, NULL);
   if (nvars == 6) {
@@ -197,6 +220,7 @@ proc_column_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_
                                           GRN_TEXT_LEN(&vars[0].value));
     grn_obj *type = grn_ctx_get(ctx, GRN_TEXT_VALUE(&vars[3].value),
                                 GRN_TEXT_LEN(&vars[3].value));
+    grn_content_type ct = GRN_INT32_VALUE(&vars[5].value);
     if (GRN_TEXT_LEN(&vars[1].value)) { flags |= GRN_OBJ_PERSISTENT; }
     column = grn_column_create(ctx, table,
                                GRN_TEXT_VALUE(&vars[1].value),
@@ -232,9 +256,9 @@ proc_column_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_
       }
       grn_obj_unlink(ctx, column);
     }
-    GRN_TEXT_PUTS(ctx, buf, ctx->rc ? "false" : "true");
+    print_return_code(ctx, outbuf, ct);
   }
-  return buf;
+  return outbuf;
 }
 
 #define GRN_STRLEN(s) ((s) ? strlen(s) : 0)
@@ -535,20 +559,21 @@ static grn_obj *
 proc_view_add(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
   uint32_t nvars;
-  grn_obj *buf = args[0];
+  grn_obj *outbuf = args[0];
   grn_expr_var *vars;
   grn_proc_get_info(ctx, user_data, &vars, &nvars, NULL);
-  if (nvars == 2) {
+  if (nvars == 3) {
     grn_obj *view = grn_ctx_get(ctx,
                                 GRN_TEXT_VALUE(&vars[0].value),
                                 GRN_TEXT_LEN(&vars[0].value));
     grn_obj *table = grn_ctx_get(ctx,
                                 GRN_TEXT_VALUE(&vars[1].value),
                                 GRN_TEXT_LEN(&vars[1].value));
+    grn_content_type ct = GRN_INT32_VALUE(&vars[2].value);
     grn_view_add(ctx, view, table);
-    GRN_TEXT_PUTS(ctx, buf, ctx->rc ? "false" : "true");
+    print_return_code(ctx, outbuf, ct);
   }
-  return buf;
+  return outbuf;
 }
 
 static grn_obj *
@@ -1134,7 +1159,8 @@ grn_db_init_builtin_query(grn_ctx *ctx)
 
   DEF_VAR(vars[0], "view");
   DEF_VAR(vars[1], "table");
-  DEF_PROC("view_add", proc_view_add, 2, vars);
+  DEF_VAR(vars[2], "output_type");
+  DEF_PROC("view_add", proc_view_add, 3, vars);
 
   DEF_PROC("quit", proc_quit, 0, vars);
   DEF_PROC("shutdown", proc_shutdown, 0, vars);

-- 
--------------------------------------------------------
各種ブラウザ向けツールバーやプラグインの開発を承ります。
また、ブラウザからICカードやカメラなどのハードウェアへ
アクセスする機能の開発も承ります。
--------------------------------------------------------
  株式会社クリアコード 須藤功平 <kou****@clear*****>
    Tel: 03(6231)7270 URL: http://www.clear-code.com/
--------------------------------------------------------




groonga-dev メーリングリストの案内
Back to archive index