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

Back to archive index

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




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