Tasuku SUENAGA
a****@razil*****
2009年 11月 10日 (火) 22:35:18 JST
末永です。
うおー、Webサーバ周りについては以下の修正を予定しています。
- groonga.cからwebサーバに関連する部分を全て削除し、
新たにwebサーバ用の実行プログラムを書く。
- http headerについて、grn_hashを用いて保存し、
全ての処理が終了してから出力するようにする
- http bodyについても基本全て完成してからクライアントに返す
- rcやctxのエラーメッセージについて、
おのおののproc内部で出力せずに、
procを呼び出す部分で統一的に出力する。
不正なリクエストの場合には400を返したり、
エラーの場合には500を返したり、
そういったことを柔軟に行うようにするには
現在の実装(ヘッダはgroonga.cで出し、bodyはlib/*.cで出す)では
難しいと感じています。
というわけで、パッチを取り込んでもすぐに陳腐化してしまいそうです。
http関連のところはテスト先行でお願いします!
Kouhei Sutou さんは書きました:
> 須藤です。
>
> ドキュメントによると、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);
---
tasuku