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, ']');