[Groonga-commit] groonga/groonga [master] implement messagepack serializer

Zurück zum Archiv-Index

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 ****/




Groonga-commit メーリングリストの案内
Zurück zum Archiv-Index