null+****@clear*****
null+****@clear*****
2011年 12月 14日 (水) 18:00:41 JST
Yoji SHIDARA 2011-12-14 09:00:41 +0000 (Wed, 14 Dec 2011) New Revision: 8ba1ce2402bb2e2148486903e3a206ef561955bd Merged 6da4415: Merge branch 'msgpack' Log: implement messagepack serializer Modified files: lib/ctx.c lib/output.c lib/ql.h Modified: lib/ctx.c (+12 -0) =================================================================== --- lib/ctx.c 2011-12-14 07:29:18 +0000 (65472b1) +++ lib/ctx.c 2011-12-14 09:00:41 +0000 (565b76e) @@ -392,6 +392,14 @@ grn_ctx_loader_clear(grn_ctx *ctx) #define IMPL_SIZE ((sizeof(struct _grn_ctx_impl) + (grn_pagesize - 1)) & ~(grn_pagesize - 1)) +#if HAVE_MESSAGE_PACK +static inline int grn_msgpack_buffer_write(void* data, const char* buf, unsigned int len) +{ + grn_ctx *ctx = (grn_ctx *)data; + return grn_bulk_write(ctx, ctx->impl->outbuf, buf, len); +} +#endif + static void grn_ctx_impl_init(grn_ctx *ctx) { @@ -477,6 +485,10 @@ grn_ctx_impl_init(grn_ctx *ctx) ctx->impl->edge = NULL; grn_loader_init(&ctx->impl->loader); ctx->impl->plugin_path = NULL; + +#if HAVE_MESSAGE_PACK + msgpack_packer_init(&ctx->impl->msgpacker, ctx, grn_msgpack_buffer_write); +#endif } void Modified: lib/output.c (+44 -14) =================================================================== --- lib/output.c 2011-12-14 07:29:18 +0000 (31ecd25) +++ lib/output.c 2011-12-14 09:00:41 +0000 (cdc7db2) @@ -54,7 +54,7 @@ put_delimiter(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type) GRN_TEXT_PUTC(ctx, outbuf, '\t'); } case GRN_CONTENT_MSGPACK : - // todo + // do nothing break; case GRN_CONTENT_NONE: break; @@ -80,7 +80,9 @@ grn_output_array_open(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_typ if (DEPTH > 2) { GRN_TEXT_PUTS(ctx, outbuf, "[\t"); } break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_array(&ctx->impl->msgpacker, nelements); +#endif break; case GRN_CONTENT_NONE: break; @@ -111,7 +113,7 @@ grn_output_array_close(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_ty } break; case GRN_CONTENT_MSGPACK : - // todo + // do nothing break; case GRN_CONTENT_NONE: break; @@ -139,7 +141,9 @@ grn_output_map_open(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, if (DEPTH > 2) { GRN_TEXT_PUTS(ctx, outbuf, "{\t"); } break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_map(&ctx->impl->msgpacker, nelements / 2); +#endif break; case GRN_CONTENT_NONE: break; @@ -170,7 +174,7 @@ grn_output_map_close(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type } break; case GRN_CONTENT_MSGPACK : - // todo + // do nothing break; case GRN_CONTENT_NONE: break; @@ -196,7 +200,9 @@ grn_output_int32(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, in GRN_TEXT_PUTS(ctx, outbuf, "</INT>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_int32(&ctx->impl->msgpacker, value); +#endif break; case GRN_CONTENT_NONE: break; @@ -221,7 +227,9 @@ grn_output_int64(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, in GRN_TEXT_PUTS(ctx, outbuf, "</INT>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_int64(&ctx->impl->msgpacker, value); +#endif break; case GRN_CONTENT_NONE: break; @@ -246,7 +254,9 @@ grn_output_uint64(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, i GRN_TEXT_PUTS(ctx, outbuf, "</INT>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_uint64(&ctx->impl->msgpacker, value); +#endif break; case GRN_CONTENT_NONE: break; @@ -271,7 +281,9 @@ grn_output_float(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, do GRN_TEXT_PUTS(ctx, outbuf, "</FLOAT>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_double(&ctx->impl->msgpacker, value); +#endif break; case GRN_CONTENT_NONE: break; @@ -297,7 +309,10 @@ grn_output_str(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, GRN_TEXT_PUTS(ctx, outbuf, "</TEXT>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_raw(&ctx->impl->msgpacker, value_len); + msgpack_pack_raw_body(&ctx->impl->msgpacker, value, value_len); +#endif break; case GRN_CONTENT_NONE: break; @@ -329,7 +344,13 @@ grn_output_bool(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, cha GRN_TEXT_PUTS(ctx, outbuf, "</BOOL>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + if (value) { + msgpack_pack_true(&ctx->impl->msgpacker); + } else { + msgpack_pack_false(&ctx->impl->msgpacker); + } +#endif break; case GRN_CONTENT_NONE: break; @@ -353,7 +374,9 @@ grn_output_void(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, GRN_TEXT_PUTS(ctx, outbuf, "<NULL/>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_nil(&ctx->impl->msgpacker); +#endif break; case GRN_CONTENT_NONE: break; @@ -383,7 +406,9 @@ grn_output_time(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, int GRN_TEXT_PUTS(ctx, outbuf, "</DATE>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + msgpack_pack_double(&ctx->impl->msgpacker, dv); +#endif break; case GRN_CONTENT_NONE: break; @@ -429,7 +454,12 @@ grn_output_geo_point(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type GRN_TEXT_PUTS(ctx, outbuf, "</GEO_POINT>"); break; case GRN_CONTENT_MSGPACK : - // todo +#if HAVE_MESSAGE_PACK + // TODO %dx%d notation for compatibility + msgpack_pack_array(&ctx->impl->msgpacker, 2); + msgpack_pack_int(&ctx->impl->msgpacker, value->latitude); + msgpack_pack_int(&ctx->impl->msgpacker, value->longitude); +#endif break; case GRN_CONTENT_NONE: break; Modified: lib/ql.h (+8 -0) =================================================================== --- lib/ql.h 2011-12-14 07:29:18 +0000 (69ad929) +++ lib/ql.h 2011-12-14 09:00:41 +0000 (149e3f4) @@ -38,6 +38,10 @@ #include <math.h> +#if HAVE_MESSAGE_PACK +#include <msgpack.h> +#endif + #ifdef __cplusplus extern "C" { #endif @@ -268,6 +272,10 @@ struct _grn_ctx_impl { uint32_t u32; uint64_t u64; } data; + +#if HAVE_MESSAGE_PACK + msgpack_packer msgpacker; +#endif }; /**** query language ****/