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/
--------------------------------------------------------