null+****@clear*****
null+****@clear*****
2010年 6月 19日 (土) 00:29:11 JST
Daijiro MORI 2010-06-18 15:29:11 +0000 (Fri, 18 Jun 2010) New Revision: 9a88cb99e57648a900cab0cc381049a449ff13d0 Log: Use ctx->impl->levels instead of ctx->impl->opened. Modified files: lib/ctx.c lib/output.c lib/output.h lib/proc.c lib/ql.h Modified: lib/ctx.c (+0 -1) =================================================================== --- lib/ctx.c 2010-06-18 05:43:12 +0000 (8b0742f) +++ lib/ctx.c 2010-06-18 15:29:11 +0000 (dc2eabc) @@ -1004,7 +1004,6 @@ grn_ctx_send(grn_ctx *ctx, const char *str, unsigned int str_len, int flags) } else { ctx->impl->mime_type = "application/json"; ctx->impl->output_type = GRN_CONTENT_JSON; - ctx->impl->opened = 1; grn_timeval_now(ctx, &ctx->impl->tv); GRN_LOG(ctx, GRN_LOG_NONE, "%08x|>%.*s", (intptr_t)ctx, str_len, str); if (str_len && *str == '/') { Modified: lib/output.c (+88 -25) =================================================================== --- lib/output.c 2010-06-18 05:43:12 +0000 (ca2347a) +++ lib/output.c 2010-06-18 15:29:11 +0000 (e1a561a) @@ -19,14 +19,41 @@ #include "output.h" #include "ql.h" +#define LEVELS (&ctx->impl->levels) +#define DEPTH (GRN_BULK_VSIZE(LEVELS)>>2) +#define CURR_LEVEL (DEPTH ? (GRN_UINT32_VALUE_AT(LEVELS, (DEPTH - 1))) : 0) +#define INCR_DEPTH(i) GRN_UINT32_PUT(ctx, LEVELS, i) +#define DECR_DEPTH (DEPTH ? grn_bulk_truncate(ctx, LEVELS, GRN_BULK_VSIZE(LEVELS) - sizeof(uint32_t)) : 0) +#define INCR_LENGTH (DEPTH ? (GRN_UINT32_VALUE_AT(LEVELS, (DEPTH - 1)) += 2) : 0) + +static void +put_delimiter(grn_ctx *ctx) +{ + uint32_t level = CURR_LEVEL; + grn_obj *outbuf = ctx->impl->outbuf; + grn_content_type output_type = ctx->impl->output_type; + if (level < 2) { return; } + switch (output_type) { + case GRN_CONTENT_JSON: + GRN_TEXT_PUTC(ctx, outbuf, ((level & 3) == 3) ? ':' : ','); + break; + case GRN_CONTENT_XML: + break; + case GRN_CONTENT_TSV: + if (DEPTH > 1) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } + case GRN_CONTENT_NONE: + break; + } +} + void grn_output_array_open(grn_ctx *ctx, const char *name, int nelements) { grn_obj *outbuf = ctx->impl->outbuf; grn_content_type output_type = ctx->impl->output_type; + put_delimiter(ctx); switch (output_type) { case GRN_CONTENT_JSON: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, ','); } GRN_TEXT_PUTC(ctx, outbuf, '['); break; case GRN_CONTENT_XML: @@ -34,12 +61,12 @@ grn_output_array_open(grn_ctx *ctx, const char *name, int nelements) "<SEGMENTS>\n<SEGMENT>\n<RESULTPAGE>\n"); break; case GRN_CONTENT_TSV: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } - grn_text_itoa(ctx, outbuf, ctx->rc); + if (DEPTH > 1) { GRN_TEXT_PUTS(ctx, outbuf, "[\t"); } + break; case GRN_CONTENT_NONE: break; } - ctx->impl->opened = 1; + INCR_DEPTH(0); } void @@ -52,15 +79,24 @@ grn_output_array_close(grn_ctx *ctx) GRN_TEXT_PUTC(ctx, outbuf, ']'); break; case GRN_CONTENT_TSV: - GRN_TEXT_PUTC(ctx, outbuf, '\n'); + if (DEPTH > 1) { + if (DEPTH == 2) { + GRN_TEXT_PUTC(ctx, outbuf, '\n'); + } else { + if (CURR_LEVEL >= 2) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } + GRN_TEXT_PUTC(ctx, outbuf, ']'); + } + } break; case GRN_CONTENT_XML: - GRN_TEXT_PUTS(ctx, outbuf, "</RESULTPAGE>\n</SEGMENT>\n</SEGMENTS>\n"); + GRN_TEXT_PUTS(ctx, outbuf, "</RESULTPAGE>\n</SEGMENT>\n</SEGMENTS>"); + if (DEPTH > 1) { GRN_TEXT_PUTC(ctx, outbuf, '\n'); } break; case GRN_CONTENT_NONE: break; } - ctx->impl->opened = 0; + DECR_DEPTH; + INCR_LENGTH; } void @@ -68,9 +104,9 @@ grn_output_map_open(grn_ctx *ctx, const char *name, int nelements) { grn_obj *outbuf = ctx->impl->outbuf; grn_content_type output_type = ctx->impl->output_type; + put_delimiter(ctx); switch (output_type) { case GRN_CONTENT_JSON: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, ','); } GRN_TEXT_PUTS(ctx, outbuf, "{"); break; case GRN_CONTENT_XML: @@ -78,12 +114,12 @@ grn_output_map_open(grn_ctx *ctx, const char *name, int nelements) "<SEGMENTS>\n<SEGMENT>\n<RESULTPAGE>\n"); break; case GRN_CONTENT_TSV: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } - grn_text_itoa(ctx, outbuf, ctx->rc); + if (DEPTH > 1) { GRN_TEXT_PUTS(ctx, outbuf, "{\t"); } + break; case GRN_CONTENT_NONE: break; } - ctx->impl->opened = 1; + INCR_DEPTH(1); } void @@ -96,15 +132,24 @@ grn_output_map_close(grn_ctx *ctx) GRN_TEXT_PUTS(ctx, outbuf, "}"); break; case GRN_CONTENT_TSV: - GRN_TEXT_PUTC(ctx, outbuf, '\n'); + if (DEPTH) { + if (DEPTH == 1) { + GRN_TEXT_PUTC(ctx, outbuf, '\n'); + } else { + if (CURR_LEVEL >= 2) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } + GRN_TEXT_PUTC(ctx, outbuf, '}'); + } + } break; case GRN_CONTENT_XML: - GRN_TEXT_PUTS(ctx, outbuf, "</RESULTPAGE>\n</SEGMENT>\n</SEGMENTS>\n"); + GRN_TEXT_PUTS(ctx, outbuf, "</RESULTPAGE>\n</SEGMENT>\n</SEGMENTS>"); + if (DEPTH > 1) { GRN_TEXT_PUTC(ctx, outbuf, '\n'); } break; case GRN_CONTENT_NONE: break; } - ctx->impl->opened = 0; + DECR_DEPTH; + INCR_LENGTH; } void @@ -112,13 +157,12 @@ grn_output_int32(grn_ctx *ctx, int value) { grn_obj *outbuf = ctx->impl->outbuf; grn_content_type output_type = ctx->impl->output_type; + put_delimiter(ctx); switch (output_type) { case GRN_CONTENT_JSON: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, ','); } grn_text_itoa(ctx, outbuf, value); break; case GRN_CONTENT_TSV: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } grn_text_itoa(ctx, outbuf, value); break; case GRN_CONTENT_XML: @@ -127,7 +171,29 @@ grn_output_int32(grn_ctx *ctx, int value) case GRN_CONTENT_NONE: break; } - ctx->impl->opened = 0; + INCR_LENGTH; +} + +void +grn_output_int64(grn_ctx *ctx, long long value) +{ + grn_obj *outbuf = ctx->impl->outbuf; + grn_content_type output_type = ctx->impl->output_type; + put_delimiter(ctx); + switch (output_type) { + case GRN_CONTENT_JSON: + grn_text_lltoa(ctx, outbuf, value); + break; + case GRN_CONTENT_TSV: + grn_text_lltoa(ctx, outbuf, value); + break; + case GRN_CONTENT_XML: + grn_text_lltoa(ctx, outbuf, value); + break; + case GRN_CONTENT_NONE: + break; + } + INCR_LENGTH; } void @@ -135,13 +201,12 @@ grn_output_str(grn_ctx *ctx, const char *value) { grn_obj *outbuf = ctx->impl->outbuf; grn_content_type output_type = ctx->impl->output_type; + put_delimiter(ctx); switch (output_type) { case GRN_CONTENT_JSON: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, ','); } grn_text_esc(ctx, outbuf, value, strlen(value)); break; case GRN_CONTENT_TSV: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } grn_text_esc(ctx, outbuf, value, strlen(value)); break; case GRN_CONTENT_XML: @@ -150,7 +215,7 @@ grn_output_str(grn_ctx *ctx, const char *value) case GRN_CONTENT_NONE: break; } - ctx->impl->opened = 0; + INCR_LENGTH; } void @@ -158,15 +223,13 @@ grn_output_obj(grn_ctx *ctx, grn_obj *obj, grn_obj_format *format) { grn_obj *outbuf = ctx->impl->outbuf; grn_content_type output_type = ctx->impl->output_type; + put_delimiter(ctx); switch (output_type) { case GRN_CONTENT_JSON: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, ','); } grn_text_otoj(ctx, outbuf, obj, format); break; case GRN_CONTENT_TSV: - if (!ctx->impl->opened) { GRN_TEXT_PUTC(ctx, outbuf, '\t'); } - GRN_TEXT_PUTC(ctx, outbuf, '\n'); - /* TODO: implement grn_text_ototsv */ + grn_text_otoj(ctx, outbuf, obj, format); break; case GRN_CONTENT_XML: grn_text_otoxml(ctx, outbuf, obj, format); @@ -174,5 +237,5 @@ grn_output_obj(grn_ctx *ctx, grn_obj *obj, grn_obj_format *format) case GRN_CONTENT_NONE: break; } - ctx->impl->opened = 0; + INCR_LENGTH; } Modified: lib/output.h (+1 -0) =================================================================== --- lib/output.h 2010-06-18 05:43:12 +0000 (5cc3090) +++ lib/output.h 2010-06-18 15:29:11 +0000 (83672ec) @@ -38,6 +38,7 @@ void grn_output_array_close(grn_ctx *ctx); void grn_output_map_open(grn_ctx *ctx, const char *name, int nelements); void grn_output_map_close(grn_ctx *ctx); void grn_output_int32(grn_ctx *ctx, int value); +void grn_output_int64(grn_ctx *ctx, long long value); void grn_output_str(grn_ctx *ctx, const char *value); void grn_output_obj(grn_ctx *ctx, grn_obj *obj, grn_obj_format *format); Modified: lib/proc.c (+54 -112) =================================================================== --- lib/proc.c 2010-06-18 05:43:12 +0000 (1207bc7) +++ lib/proc.c 2010-06-18 15:29:11 +0000 (ef623cf) @@ -372,45 +372,18 @@ proc_load(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) static grn_obj * proc_status(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { - grn_content_type ct = ctx->impl->output_type; - grn_obj *outbuf = ctx->impl->outbuf; grn_timeval now; grn_timeval_now(ctx, &now); - switch (ct) { - case GRN_CONTENT_TSV: - /* TODO: implement */ - break; - case GRN_CONTENT_JSON: - - { - GRN_TEXT_PUTS(ctx, outbuf, "{\"alloc_count\":"); - grn_text_itoa(ctx, outbuf, grn_alloc_count()); - GRN_TEXT_PUTS(ctx, outbuf, ",\"starttime\":"); - grn_text_itoa(ctx, outbuf, grn_starttime.tv_sec); - GRN_TEXT_PUTS(ctx, outbuf, ",\"uptime\":"); - grn_text_itoa(ctx, outbuf, now.tv_sec - grn_starttime.tv_sec); - GRN_TEXT_PUTS(ctx, outbuf, ",\"version\":\""); - GRN_TEXT_PUTS(ctx, outbuf, grn_get_version()); - GRN_TEXT_PUTC(ctx, outbuf, '"'); - GRN_TEXT_PUTC(ctx, outbuf, '}'); - } - /* - grn_output_map_open(ctx, "STATUS", -1); - grn_output_str(ctx, "alloc_count"); - grn_output_int32(ctx, grn_alloc_count()); - grn_output_str(ctx, "starttime"); - grn_output_int32(ctx, grn_starttime.tv_sec); - grn_output_str(ctx, "uptime"); - grn_output_int32(ctx, now.tv_sec - grn_starttime.tv_sec); - grn_output_str(ctx, "version"); - grn_output_str(ctx, grn_get_version()); - grn_output_map_close(ctx); - */ - break; - case GRN_CONTENT_XML: - case GRN_CONTENT_NONE: - break; - } + grn_output_map_open(ctx, "STATUS", -1); + grn_output_str(ctx, "alloc_count"); + grn_output_int32(ctx, grn_alloc_count()); + grn_output_str(ctx, "starttime"); + grn_output_int32(ctx, grn_starttime.tv_sec); + grn_output_str(ctx, "uptime"); + grn_output_int32(ctx, now.tv_sec - grn_starttime.tv_sec); + grn_output_str(ctx, "version"); + grn_output_str(ctx, grn_get_version()); + grn_output_map_close(ctx); return NULL; } @@ -820,12 +793,11 @@ print_columninfo(grn_ctx *ctx, grn_obj *column, grn_obj *buf, grn_content_type o } static int -print_tableinfo(grn_ctx *ctx, grn_obj *table, grn_obj *buf, grn_content_type otype) +print_tableinfo(grn_ctx *ctx, grn_obj *table) { grn_id id; grn_obj o; const char *path; - switch (table->header.type) { case GRN_TABLE_HASH_KEY: case GRN_TABLE_PAT_KEY: @@ -835,53 +807,22 @@ print_tableinfo(grn_ctx *ctx, grn_obj *table, grn_obj *buf, grn_content_type oty default: return 0; } - id = grn_obj_id(ctx, table); path = grn_obj_path(ctx, table); GRN_TEXT_INIT(&o, 0); - - switch (otype) { - case GRN_CONTENT_TSV: - grn_text_itoa(ctx, buf, id); - GRN_TEXT_PUTC(ctx, buf, '\t'); - objid2name(ctx, id, &o); - grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o)); - GRN_TEXT_PUTC(ctx, buf, '\t'); - grn_text_esc(ctx, buf, path, GRN_STRLEN(path)); - GRN_TEXT_PUTC(ctx, buf, '\t'); - grn_table_create_flags_to_text(ctx, &o, table->header.flags); - grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o)); - GRN_TEXT_PUTC(ctx, buf, '\t'); - objid2name(ctx, table->header.domain, &o); - grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o)); - GRN_TEXT_PUTC(ctx, buf, '\t'); - objid2name(ctx, grn_obj_get_range(ctx, table), &o); - grn_text_esc(ctx, buf, GRN_TEXT_VALUE(&o), GRN_TEXT_LEN(&o)); - break; - case GRN_CONTENT_JSON: - GRN_TEXT_PUTC(ctx, buf, '['); - grn_text_itoa(ctx, buf, id); - GRN_TEXT_PUTC(ctx, buf, ','); - objid2name(ctx, id, &o); - grn_text_otoj(ctx, buf, &o, NULL); - GRN_TEXT_PUTC(ctx, buf, ','); - grn_text_esc(ctx, buf, path, GRN_STRLEN(path)); - GRN_TEXT_PUTC(ctx, buf, ','); - grn_table_create_flags_to_text(ctx, &o, table->header.flags); - grn_text_otoj(ctx, buf, &o, NULL); - GRN_TEXT_PUTC(ctx, buf, ','); - objid2name(ctx, table->header.domain, &o); - grn_text_otoj(ctx, buf, &o, NULL); - GRN_TEXT_PUTC(ctx, buf, ','); - objid2name(ctx, grn_obj_get_range(ctx, table), &o); - grn_text_otoj(ctx, buf, &o, NULL); - GRN_TEXT_PUTC(ctx, buf, ']'); - break; - case GRN_CONTENT_XML: - case GRN_CONTENT_NONE: - break; - } - grn_obj_close(ctx, &o); + grn_output_array_open(ctx, "", -1); + grn_output_int64(ctx, id); + objid2name(ctx, id, &o); + grn_output_obj(ctx, &o, NULL); + grn_output_str(ctx, path); + grn_table_create_flags_to_text(ctx, &o, table->header.flags); + grn_output_obj(ctx, &o, NULL); + objid2name(ctx, table->header.domain, &o); + grn_output_obj(ctx, &o, NULL); + objid2name(ctx, grn_obj_get_range(ctx, table), &o); + grn_output_obj(ctx, &o, NULL); + grn_output_array_close(ctx); + GRN_OBJ_FIN(ctx, &o); return 1; } @@ -944,42 +885,44 @@ proc_column_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_da static grn_obj * proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { - grn_content_type ct = ctx->impl->output_type; - grn_obj *outbuf = ctx->impl->outbuf; grn_table_cursor *cur; - if ((cur = grn_table_cursor_open(ctx, ctx->impl->db, NULL, 0, NULL, 0, 0, -1, 0))) { grn_id id; - char line_delimiter, column_delimiter; - switch (ct) { - case GRN_CONTENT_TSV: - line_delimiter = '\n'; - column_delimiter = '\t'; - GRN_TEXT_PUTS(ctx, outbuf, "id\tname\tpath\tflags\tdomain\trange"); - break; - case GRN_CONTENT_JSON: - line_delimiter = ','; - column_delimiter = ','; - GRN_TEXT_PUTS(ctx, outbuf, "[[[\"id\", \"UInt32\"],[\"name\",\"ShortText\"],[\"path\",\"ShortText\"],[\"flags\",\"ShortText\"],[\"domain\", \"ShortText\"],[\"range\",\"ShortText\"]]"); - break; - case GRN_CONTENT_XML: - case GRN_CONTENT_NONE: - break; - } + grn_output_array_open(ctx, "", -1); + grn_output_array_open(ctx, "", -1); + grn_output_array_open(ctx, "", -1); + grn_output_str(ctx, "id"); + grn_output_str(ctx, "UInt32"); + grn_output_array_close(ctx); + grn_output_array_open(ctx, "", -1); + grn_output_str(ctx, "name"); + grn_output_str(ctx, "ShortText"); + grn_output_array_close(ctx); + grn_output_array_open(ctx, "", -1); + grn_output_str(ctx, "path"); + grn_output_str(ctx, "ShortText"); + grn_output_array_close(ctx); + grn_output_array_open(ctx, "", -1); + grn_output_str(ctx, "flags"); + grn_output_str(ctx, "ShortText"); + grn_output_array_close(ctx); + grn_output_array_open(ctx, "", -1); + grn_output_str(ctx, "domain"); + grn_output_str(ctx, "ShortText"); + grn_output_array_close(ctx); + grn_output_array_open(ctx, "", -1); + grn_output_str(ctx, "range"); + grn_output_str(ctx, "ShortText"); + grn_output_array_close(ctx); + grn_output_array_close(ctx); while ((id = grn_table_cursor_next(ctx, cur)) != GRN_ID_NIL) { grn_obj *o; - if ((o = grn_ctx_at(ctx, id))) { - GRN_TEXT_PUTC(ctx, outbuf, line_delimiter); - if (!print_tableinfo(ctx, o, outbuf, ct)) { - grn_bulk_truncate(ctx, outbuf, GRN_BULK_VSIZE(outbuf) - 1); - } + print_tableinfo(ctx, o); grn_obj_unlink(ctx, o); } } - if (ct == GRN_CONTENT_JSON) { - GRN_TEXT_PUTC(ctx, outbuf, ']'); - } + grn_output_array_close(ctx); grn_table_cursor_close(ctx, cur); } return NULL; @@ -1926,9 +1869,8 @@ proc_dump(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) static grn_obj * proc_cache_limit(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { - grn_obj *outbuf = ctx->impl->outbuf; uint32_t *mp = grn_cach_max_nentries(); - grn_text_lltoa(ctx, outbuf, *mp); + grn_output_int64(ctx, *mp); if (GRN_TEXT_LEN(VAR(0))) { const char *rest; uint32_t max = grn_atoui(GRN_TEXT_VALUE(VAR(0)), Modified: lib/ql.h (+0 -1) =================================================================== --- lib/ql.h 2010-06-18 05:43:12 +0000 (dbbcc3a) +++ lib/ql.h 2010-06-18 15:29:11 +0000 (3f6b3ca) @@ -196,7 +196,6 @@ struct _grn_ctx_impl { /* output portion */ grn_content_type output_type; const char *mime_type; - uint32_t opened; grn_obj names; grn_obj levels;