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