28 #define LEVELS (&ctx->impl->levels)
29 #define DEPTH (GRN_BULK_VSIZE(LEVELS)>>2)
30 #define CURR_LEVEL (DEPTH ? (GRN_UINT32_VALUE_AT(LEVELS, (DEPTH - 1))) : 0)
31 #define INCR_DEPTH(i) GRN_UINT32_PUT(ctx, LEVELS, i)
32 #define DECR_DEPTH (DEPTH ? grn_bulk_truncate(ctx, LEVELS, GRN_BULK_VSIZE(LEVELS) - sizeof(uint32_t)) : 0)
33 #define INCR_LENGTH (DEPTH ? (GRN_UINT32_VALUE_AT(LEVELS, (DEPTH - 1)) += 2) : 0)
39 switch (output_type) {
41 if (level < 2) {
return; }
46 if (!
DEPTH) {
return; }
50 if (level < 2) {
return; }
66 const char *name,
int nelements)
68 put_delimiter(ctx, outbuf, output_type);
69 switch (output_type) {
83 #ifdef GRN_WITH_MESSAGE_PACK
86 "grn_output_array_open nelements (%d) for <%s>",
90 msgpack_pack_array(&ctx->
impl->msgpacker, nelements);
102 switch (output_type) {
133 const char *name,
int nelements)
135 put_delimiter(ctx, outbuf, output_type);
136 switch (output_type) {
150 #ifdef GRN_WITH_MESSAGE_PACK
153 "grn_output_map_open nelements (%d) for <%s>",
157 msgpack_pack_map(&ctx->
impl->msgpacker, nelements / 2);
169 switch (output_type) {
201 put_delimiter(ctx, outbuf, output_type);
202 switch (output_type) {
215 #ifdef GRN_WITH_MESSAGE_PACK
216 msgpack_pack_int32(&ctx->
impl->msgpacker, value);
228 put_delimiter(ctx, outbuf, output_type);
229 switch (output_type) {
242 #ifdef GRN_WITH_MESSAGE_PACK
243 msgpack_pack_int64(&ctx->
impl->msgpacker, value);
255 put_delimiter(ctx, outbuf, output_type);
256 switch (output_type) {
269 #ifdef GRN_WITH_MESSAGE_PACK
270 msgpack_pack_uint64(&ctx->
impl->msgpacker, value);
282 put_delimiter(ctx, outbuf, output_type);
283 switch (output_type) {
296 #ifdef GRN_WITH_MESSAGE_PACK
297 msgpack_pack_double(&ctx->
impl->msgpacker, value);
308 const char *value,
size_t value_len)
310 put_delimiter(ctx, outbuf, output_type);
311 switch (output_type) {
324 #ifdef GRN_WITH_MESSAGE_PACK
325 msgpack_pack_raw(&ctx->
impl->msgpacker, value_len);
326 msgpack_pack_raw_body(&ctx->
impl->msgpacker, value, value_len);
345 put_delimiter(ctx, outbuf, output_type);
346 switch (output_type) {
359 #ifdef GRN_WITH_MESSAGE_PACK
361 msgpack_pack_true(&ctx->
impl->msgpacker);
363 msgpack_pack_false(&ctx->
impl->msgpacker);
376 put_delimiter(ctx, outbuf, output_type);
377 switch (output_type) {
387 #ifdef GRN_WITH_MESSAGE_PACK
388 msgpack_pack_nil(&ctx->
impl->msgpacker);
399 const char *value,
size_t value_len)
402 grn_output_null(ctx, outbuf, output_type);
413 put_delimiter(ctx, outbuf, output_type);
414 switch (output_type) {
427 #ifdef GRN_WITH_MESSAGE_PACK
428 msgpack_pack_double(&ctx->
impl->msgpacker, dv);
441 put_delimiter(ctx, outbuf, output_type);
442 switch (output_type) {
475 #ifdef GRN_WITH_MESSAGE_PACK
483 msgpack_pack_raw_body(&ctx->
impl->msgpacker,
488 msgpack_pack_nil(&ctx->
impl->msgpacker);
546 for (; vs--; idp++) {
547 grn_text_atoj(ctx, outbuf, output_type, (
grn_obj *)a->
next, *idp);
551 grn_text_atoj(ctx, outbuf, output_type, a->
obj,
id);
614 grn_output_null(ctx, outbuf, output_type);
689 for (j = 0; j < ncolumns; j++) {
716 for (j = 0; j < ncolumns; j++) {
717 grn_text_atoj(ctx, outbuf, output_type, columns[j],
id);
761 for (j = 0; j < ncolumns; j++) {
789 for (j = 0; j < ncolumns; j++) {
807 int value_size = ((
struct _grn_type *)range)->obj.range;
870 "cannot print GRN_VECTOR using grn_obj_format");
877 for (i = 0; i < n; i++) {
879 unsigned int weight, length;
883 &_value, &weight, &domain);
903 "cannot print GRN_PVECTOR using grn_obj_format");
908 for (i = 0; i < n; i++) {
941 for (code = expr->
codes; code < code_end; code++) {
944 if (is_first_comma) {
962 if (start == target) {
966 n_args = target->
nargs;
968 if (!target->
value) {
981 sub_code = target - 1;
982 for (i = 0; i < n_args; i++) {
984 sub_n_codes = count_used_n_codes(ctx, start, sub_code);
985 n_codes += sub_n_codes;
986 sub_code -= sub_n_codes;
987 if (sub_code < start) {
993 if (have_proc_push_code) {
996 if (sub_code < start) {
1039 grn_output_table_columns_by_expression(
grn_ctx *ctx,
grn_obj *outbuf,
1045 int previous_comma_offset = -1;
1052 n_elements = count_n_elements_in_expression(ctx, format->
expression);
1055 for (code = expr->
codes; code < code_end; code++) {
1056 int code_start_offset;
1063 code_start_offset = previous_comma_offset + 1;
1064 if (is_first_comma) {
1065 int code_end_offset;
1068 grn_output_table_column(ctx, outbuf, output_type,
1071 code_end_offset = code - expr->
codes - code_start_offset - 1;
1072 n_used_code = count_used_n_codes(ctx,
1074 expr->
codes + code_end_offset);
1075 code_start_offset = code_end_offset - n_used_code + 1;
1079 grn_output_table_column(ctx, outbuf, output_type,
1081 previous_comma_offset = code - expr->
codes;
1085 grn_output_table_column(ctx, outbuf, output_type,
1093 grn_output_table_columns_by_columns(
grn_ctx *ctx,
grn_obj *outbuf,
1103 for (i = 0; i < ncolumns; i++) {
1104 grn_output_table_column(ctx, outbuf, output_type, columns[i], buf);
1118 grn_output_table_columns_by_expression(ctx, outbuf, output_type,
1119 table, format, &buf);
1121 grn_output_table_columns_by_columns(ctx, outbuf, output_type,
1122 table, format, &buf);
1128 grn_output_table_record_by_expression(
grn_ctx *ctx,
grn_obj *outbuf,
1142 grn_output_table_records_by_expression(
grn_ctx *ctx,
grn_obj *outbuf,
1154 n_elements = count_n_elements_in_expression(ctx, format->
expression);
1157 int previous_comma_offset = -1;
1162 for (code = expr->
codes; code < code_end; code++) {
1164 int code_start_offset = previous_comma_offset + 1;
1165 int code_end_offset;
1169 if (is_first_comma) {
1170 int second_code_offset;
1171 int second_code_n_used_code;
1172 second_code_offset = code - expr->
codes - 1;
1173 second_code_n_used_code =
1174 count_used_n_codes(ctx,
1176 expr->
codes + second_code_offset);
1177 expr->
codes_curr = second_code_offset - second_code_n_used_code + 1;
1178 grn_output_table_record_by_expression(ctx, outbuf, output_type,
1183 code_end_offset = code - expr->
codes - code_start_offset;
1184 expr->
codes += code_start_offset;
1186 grn_output_table_record_by_expression(ctx, outbuf, output_type,
1188 expr->
codes -= code_start_offset;
1190 previous_comma_offset = code - expr->
codes;
1195 grn_output_table_record_by_expression(ctx, outbuf, output_type,
1204 grn_output_table_records_by_columns(
grn_ctx *ctx,
grn_obj *outbuf,
1215 for (i = 0; i < ncolumns; i++) {
1216 grn_text_atoj(ctx, outbuf, output_type, columns[i],
id);
1232 grn_output_table_records_by_expression(ctx, outbuf, output_type,
1235 grn_output_table_records_by_columns(ctx, outbuf, output_type,
1251 int resultset_size = 1;
1256 resultset_size += format->
limit;
1258 grn_output_table_header(ctx, outbuf, output_type, table, format);
1260 grn_output_table_columns(ctx, outbuf, output_type, table, format);
1262 grn_output_table_records(ctx, outbuf, output_type, table, format);
1293 grn_output_void(ctx, outbuf, output_type, obj, format);
1296 grn_output_bulk(ctx, outbuf, output_type, obj, format);
1299 grn_output_uvector(ctx, outbuf, output_type, obj, format);
1302 grn_output_vector(ctx, outbuf, output_type, obj, format);
1305 grn_output_pvector(ctx, outbuf, output_type, obj, format);
1310 grn_output_table(ctx, outbuf, output_type, obj, format);
1330 transform_xml_next_column(
grn_obj *columns,
int n)
1348 grn_obj buf, name, columns, *expr;
1350 int offset = 0, limit = 0, record_n = 0;
1351 int column_n = 0, column_text_n = 0, result_set_n = -1;
1352 int in_vector = 0, first_vector_element = 0;
1362 #define EQUAL_NAME_P(_name) \
1363 (GRN_TEXT_LEN(&name) == strlen(_name) && \
1364 !memcmp(GRN_TEXT_VALUE(&name), _name, strlen(_name)))
1390 if (result_set_n == 0) {
1400 if (result_set_n == 0) {
1405 char *c = transform_xml_next_column(&columns, column_n++);
1407 first_vector_element = 1;
1416 if (result_set_n == 0) {
1423 if (result_set_n == 0) {
1427 "</NAVIGATIONELEMENTS>\n"
1428 "</NAVIGATIONENTRY>\n");
1437 first_vector_element = 0;
1442 if (result_set_n == 0) {
1444 char *c = transform_xml_next_column(&columns, column_n++);
1449 if (in_vector && !first_vector_element) {
1458 char *c = transform_xml_next_column(&columns, column_n++);
1465 first_vector_element = 0;
1469 if (result_set_n == 0) {
1471 grn_obj *offset_value, *limit_value;
1476 "offset", strlen(
"offset"));
1478 "limit", strlen(
"limit"));
1491 #define DEFAULT_LIMIT 10
1493 #undef DEFAULT_LIMIT
1496 record_n = offset + 1;
1498 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
1502 "<RESULTSET OFFSET=\"");
1511 "<NAVIGATIONELEMENTS COUNT=\"");
1520 if (column_text_n == 0) {
1562 #ifdef GRN_WITH_MESSAGE_PACK
1566 } msgpack_writer_ctx;
1569 msgpack_buffer_writer(
void* data,
const char* buf,
unsigned int len)
1571 msgpack_writer_ctx *writer_ctx = (msgpack_writer_ctx *)data;
1572 return grn_bulk_write(writer_ctx->ctx, writer_ctx->buffer, buf, len);
1576 #define JSON_CALLBACK_PARAM "callback"
1587 double started, finished, elapsed;
1595 finished = tv_now.
tv_sec;
1597 elapsed = finished - started;
1678 is_select = strcmp(buf,
"select") == 0;
1683 transform_xml(ctx, body, &transformed);
1688 GRN_TEXT_PUTS(ctx, head,
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RESULT CODE=\"");
1715 #ifdef GRN_WITH_MESSAGE_PACK
1717 msgpack_writer_ctx head_writer_ctx;
1718 msgpack_packer header_packer;
1721 head_writer_ctx.ctx = ctx;
1722 head_writer_ctx.buffer = head;
1723 msgpack_packer_init(&header_packer, &head_writer_ctx, msgpack_buffer_writer);
1727 msgpack_pack_array(&header_packer, 2);
1729 msgpack_pack_array(&header_packer, 1);
1740 msgpack_pack_array(&header_packer, header_size);
1741 msgpack_pack_int(&header_packer, rc);
1743 msgpack_pack_double(&header_packer, started);
1744 msgpack_pack_double(&header_packer, elapsed);
1747 msgpack_pack_raw(&header_packer, strlen(ctx->
errbuf));
1748 msgpack_pack_raw_body(&header_packer, ctx->
errbuf, strlen(ctx->
errbuf));
1751 int error_detail_size;
1756 msgpack_pack_array(&header_packer, 1);
1757 error_detail_size = 3;
1759 error_detail_size += 3;
1761 msgpack_pack_array(&header_packer, error_detail_size);
1763 msgpack_pack_raw(&header_packer, strlen(ctx->
errfunc));
1764 msgpack_pack_raw_body(&header_packer, ctx->
errfunc, strlen(ctx->
errfunc));
1766 msgpack_pack_raw(&header_packer, strlen(ctx->
errfile));
1767 msgpack_pack_raw_body(&header_packer, ctx->
errfile, strlen(ctx->
errfile));
1769 msgpack_pack_int(&header_packer, ctx->
errline);
1773 msgpack_pack_raw(&header_packer, strlen(file));
1774 msgpack_pack_raw_body(&header_packer, file, strlen(file));
1776 msgpack_pack_raw(&header_packer, 7);
1777 msgpack_pack_raw_body(&header_packer,
"(stdin)", 7);
1780 msgpack_pack_int(&header_packer, line);
1782 msgpack_pack_raw(&header_packer,
GRN_TEXT_LEN(command));