null+****@clear*****
null+****@clear*****
2010年 6月 23日 (水) 11:08:49 JST
Daijiro MORI 2010-06-23 02:08:49 +0000 (Wed, 23 Jun 2010) New Revision: 12db8a40e725f7f0e39028ef38ddaba3a2ead69b Log: Assign nelements argument for grn_output_array_open() properly as possible. Modified files: lib/output.c lib/proc.c lib/str.c Modified: lib/output.c (+21 -13) =================================================================== --- lib/output.c 2010-06-22 13:38:30 +0000 (88cb4e0) +++ lib/output.c 2010-06-23 02:08:49 +0000 (064a766) @@ -416,17 +416,19 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, if ((a->obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) { grn_id *idp = (grn_id *)GRN_BULK_HEAD(&buf); if (a->next) { - grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1); - for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) { + vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); + grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs); + for (; vs--; idp++) { grn_text_atoj(ctx, outbuf, output_type, (grn_obj *)a->next, *idp); } grn_output_array_close(ctx, outbuf, output_type); } else { grn_obj b; GRN_RECORD_INIT(&b, 0, DB_OBJ(a->obj)->range); - grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1); + vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); + grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs); /* todo: support other fixe sized data types */ - for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) { + for (; vs--; idp++) { GRN_RECORD_SET(ctx, &b, *idp); grn_output_obj(ctx, outbuf, output_type, &b, NULL); } @@ -584,10 +586,10 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, int ncolumns = GRN_BULK_VSIZE(&format->columns)/sizeof(grn_obj *); grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) { - grn_output_array_open(ctx, outbuf, output_type, "FIELDS", -1); + grn_output_array_open(ctx, outbuf, output_type, "COLUMNS", ncolumns); for (j = 0; j < ncolumns; j++) { grn_id range_id; - grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1); + grn_output_array_open(ctx, outbuf, output_type, "COLUMN", 2); GRN_BULK_REWIND(&buf); grn_column_name_(ctx, columns[j], &buf); grn_output_obj(ctx, outbuf, output_type, &buf, NULL); @@ -611,7 +613,7 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, } grn_output_array_close(ctx, outbuf, output_type); } - grn_output_array_open(ctx, outbuf, output_type, "HIT", -1); + grn_output_array_open(ctx, outbuf, output_type, "HIT", ncolumns); for (j = 0; j < ncolumns; j++) { grn_text_atoj_o(ctx, outbuf, output_type, columns[j], obj); } @@ -640,15 +642,15 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, int ncolumns = GRN_BULK_VSIZE(&format->columns) / sizeof(grn_obj *); grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); grn_output_array_open(ctx, outbuf, output_type, "RESULTSET", -1); - grn_output_array_open(ctx, outbuf, output_type, "NHITS", -1); + grn_output_array_open(ctx, outbuf, output_type, "NHITS", 1); grn_text_itoa(ctx, outbuf, ve - v); grn_output_array_close(ctx, outbuf, output_type); if (v < ve) { if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) { - grn_output_array_open(ctx, outbuf, output_type, "FIELDS", -1); + grn_output_array_open(ctx, outbuf, output_type, "COLUMNS", -1); for (j = 0; j < ncolumns; j++) { grn_id range_id; - grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1); + grn_output_array_open(ctx, outbuf, output_type, "COLUMN", -1); GRN_BULK_REWIND(&buf); grn_column_name_(ctx, columns[j], &buf); grn_output_obj(ctx, outbuf, output_type, &buf, NULL); @@ -680,13 +682,19 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, grn_output_obj(ctx, outbuf, output_type, &buf, NULL); } grn_output_array_close(ctx, outbuf, output_type); + v++; + if (v < ve) { + + } else { + break; + } } } grn_output_array_close(ctx, outbuf, output_type); } else { grn_obj *range = grn_ctx_at(ctx, obj->header.domain); if (range && range->header.type == GRN_TYPE) { - grn_id value_size = ((struct _grn_type *)range)->obj.range; + int value_size = ((struct _grn_type *)range)->obj.range; char *v = (char *)GRN_BULK_HEAD(obj), *ve = (char *)GRN_BULK_CURR(obj); grn_output_array_open(ctx, outbuf, output_type, "VECTOR", -1); @@ -797,10 +805,10 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, grn_text_itoa(ctx, outbuf, format->nhits); grn_output_array_close(ctx, outbuf, output_type); if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) { - grn_output_array_open(ctx, outbuf, output_type, "FIELDS", -1); + grn_output_array_open(ctx, outbuf, output_type, "COLUMNS", -1); for (j = 0; j < ncolumns; j++) { grn_id range_id; - grn_output_array_open(ctx, outbuf, output_type, "FIELD", -1); + grn_output_array_open(ctx, outbuf, output_type, "COLUMN", -1); GRN_BULK_REWIND(&buf); grn_column_name_(ctx, columns[j], &buf); grn_output_obj(ctx, outbuf, output_type, &buf, NULL); Modified: lib/proc.c (+20 -20) =================================================================== --- lib/proc.c 2010-06-22 13:38:30 +0000 (02b7b86) +++ lib/proc.c 2010-06-23 02:08:49 +0000 (494f9b8) @@ -373,7 +373,7 @@ proc_status(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { grn_timeval now; grn_timeval_now(ctx, &now); - GRN_OUTPUT_MAP_OPEN("STATUS", -1); + GRN_OUTPUT_MAP_OPEN("STATUS", 8); GRN_OUTPUT_CSTR("alloc_count"); GRN_OUTPUT_INT32(grn_alloc_count()); GRN_OUTPUT_CSTR("starttime"); @@ -717,7 +717,7 @@ print_columninfo(grn_ctx *ctx, grn_obj *column) id = grn_obj_id(ctx, column); path = grn_obj_path(ctx, column); GRN_TEXT_INIT(&o, 0); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 8); GRN_OUTPUT_INT64(id); column2name(ctx, column, &o); GRN_OUTPUT_OBJ(&o, NULL); @@ -733,7 +733,7 @@ print_columninfo(grn_ctx *ctx, grn_obj *column) grn_db_obj *obj = (grn_db_obj *)column; grn_id *s = obj->source; int i = 0, n = obj->source_size / sizeof(grn_id); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", n); for (i = 0; i < n; i++, s++) { objid2name(ctx, *s, &o); GRN_OUTPUT_OBJ(&o, NULL); @@ -757,36 +757,36 @@ proc_column_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_da if ((cols = grn_hash_create(ctx, NULL, sizeof(grn_id), 0, GRN_OBJ_TABLE_HASH_KEY|GRN_HASH_TINY))) { GRN_OUTPUT_ARRAY_OPEN("", -1); - GRN_OUTPUT_ARRAY_OPEN("", -1); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 8); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("id"); GRN_OUTPUT_CSTR("UInt32"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("name"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("path"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("type"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("flags"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("domain"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("range"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("", -1); + GRN_OUTPUT_ARRAY_OPEN("", 2); GRN_OUTPUT_CSTR("source"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); @@ -831,7 +831,7 @@ print_tableinfo(grn_ctx *ctx, grn_obj *table) id = grn_obj_id(ctx, table); path = grn_obj_path(ctx, table); GRN_TEXT_INIT(&o, 0); - GRN_OUTPUT_ARRAY_OPEN("TABLE", -1); + GRN_OUTPUT_ARRAY_OPEN("TABLE", 6); GRN_OUTPUT_INT64(id); objid2name(ctx, id, &o); GRN_OUTPUT_OBJ(&o, NULL); @@ -854,28 +854,28 @@ proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat if ((cur = grn_table_cursor_open(ctx, ctx->impl->db, NULL, 0, NULL, 0, 0, -1, 0))) { grn_id id; GRN_OUTPUT_ARRAY_OPEN("TABLE_LIST", -1); - GRN_OUTPUT_ARRAY_OPEN("COLUMNS", -1); - GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1); + GRN_OUTPUT_ARRAY_OPEN("COLUMNS", 6); + GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2); GRN_OUTPUT_CSTR("id"); GRN_OUTPUT_CSTR("UInt32"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1); + GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2); GRN_OUTPUT_CSTR("name"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1); + GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2); GRN_OUTPUT_CSTR("path"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1); + GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2); GRN_OUTPUT_CSTR("flags"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1); + GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2); GRN_OUTPUT_CSTR("domain"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); - GRN_OUTPUT_ARRAY_OPEN("COLUMN", -1); + GRN_OUTPUT_ARRAY_OPEN("COLUMN", 2); GRN_OUTPUT_CSTR("range"); GRN_OUTPUT_CSTR("ShortText"); GRN_OUTPUT_ARRAY_CLOSE(); Modified: lib/str.c (+6 -0) =================================================================== --- lib/str.c 2010-06-22 13:38:30 +0000 (c91cfba) +++ lib/str.c 2010-06-23 02:08:49 +0000 (0bae6e3) @@ -2700,6 +2700,12 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) grn_text_otoj(ctx, bulk, &buf, NULL); } GRN_TEXT_PUTC(ctx, bulk, ']'); + v++; + if (v < ve) { + GRN_TEXT_PUTC(ctx, bulk, ','); + } else { + break; + } } } GRN_TEXT_PUTC(ctx, bulk, ']');