[Groonga-commit] groonga/groonga [master] Added grn_ja_get_value()

Back to archive index

null+****@clear***** null+****@clear*****
2010年 8月 19日 (木) 10:57:08 JST


Daijiro MORI	2010-08-19 01:57:08 +0000 (Thu, 19 Aug 2010)

  New Revision: b60200d50542f2a65a85e6df10dc87094b4520ea

  Log:
    Added grn_ja_get_value()

  Modified files:
    lib/db.c
    lib/store.c
    lib/store.h

  Modified: lib/db.c (+9 -33)
===================================================================
--- lib/db.c    2010-08-18 14:17:04 +0000 (aec0c93)
+++ lib/db.c    2010-08-19 01:57:08 +0000 (037b708)
@@ -4663,37 +4663,22 @@ grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value)
       {
         grn_obj *lexicon = grn_ctx_at(ctx, DB_OBJ(obj)->range);
         if (GRN_OBJ_TABLEP(lexicon)) {
-          grn_io_win jw;
-          void *v = grn_ja_ref(ctx, (grn_ja *)obj, id, &jw, &len);
-          if (v) {
-            // todo : reduce copy
-            // todo : grn_vector_add_element when vector assigned
-            grn_bulk_write(ctx, value, v, len);
-            grn_ja_unref(ctx, &jw);
-          }
+          grn_ja_get_value(ctx, (grn_ja *)obj, id, value);
           value->header.type = GRN_UVECTOR;
         } else {
           switch (value->header.type) {
           case GRN_VECTOR :
             {
-              grn_io_win jw;
-              void *v = grn_ja_ref(ctx, (grn_ja *)obj, id, &jw, &len);
-              if (v) {
-                grn_vector_decode(ctx, value, v, len);
-                grn_ja_unref(ctx, &jw);
-              }
+              grn_obj v_;
+              GRN_TEXT_INIT(&v_, 0);
+              grn_ja_get_value(ctx, (grn_ja *)obj, id, &v_);
+              grn_vector_decode(ctx, value, GRN_TEXT_VALUE(&v_), GRN_TEXT_LEN(&v_));
+              GRN_OBJ_FIN(ctx, &v_);
             }
             break;
           case GRN_UVECTOR :
           case GRN_BULK :
-            {
-              grn_io_win jw;
-              void *v = grn_ja_ref(ctx, (grn_ja *)obj, id, &jw, &len);
-              if (v) {
-                grn_bulk_write(ctx, value, v, len);
-                grn_ja_unref(ctx, &jw);
-              }
-            }
+            grn_ja_get_value(ctx, (grn_ja *)obj, id, value);
             break;
           default :
             ERR(GRN_INVALID_ARGUMENT, "vector or bulk required");
@@ -4703,17 +4688,8 @@ grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value)
       }
       break;
     case GRN_OBJ_COLUMN_SCALAR :
-      {
-        grn_io_win jw;
-        void *v = grn_ja_ref(ctx, (grn_ja *)obj, id, &jw, &len);
-        value->header.type = GRN_BULK;
-        if (v) {
-          // todo : reduce copy
-          // todo : grn_vector_add_element when vector assigned
-          grn_bulk_write(ctx, value, v, len);
-          grn_ja_unref(ctx, &jw);
-        }
-      }
+      grn_ja_get_value(ctx, (grn_ja *)obj, id, value);
+      value->header.type = GRN_BULK;
       break;
     default :
       ERR(GRN_FILE_CORRUPT, "invalid GRN_OBJ_COLUMN_TYPE");

  Modified: lib/store.c (+20 -0)
===================================================================
--- lib/store.c    2010-08-18 14:17:04 +0000 (65259db)
+++ lib/store.c    2010-08-19 01:57:08 +0000 (14c0f38)
@@ -978,6 +978,26 @@ grn_ja_ref(grn_ctx *ctx, grn_ja *ja, grn_id id, grn_io_win *iw, uint32_t *value_
   return grn_ja_ref_raw(ctx, ja, id, iw, value_len);
 }
 
+grn_obj *
+grn_ja_get_value(grn_ctx *ctx, grn_ja *ja, grn_id id, grn_obj *value)
+{
+  void *v;
+  uint32_t len;
+  grn_io_win iw;
+  if (!value) {
+    if (!(value = grn_obj_open(ctx, GRN_BULK, 0, 0))) {
+      ERR(GRN_INVALID_ARGUMENT, "grn_obj_get_value failed");
+      goto exit;
+    }
+  }
+  if ((v = grn_ja_ref(ctx, ja, id, &iw, &len))) {
+    grn_bulk_write(ctx, value, v, len);
+    grn_ja_unref(ctx, &iw);
+  }
+exit :
+  return value;
+}
+
 #ifndef NO_ZLIB
 inline static grn_rc
 grn_ja_put_zlib(grn_ctx *ctx, grn_ja *ja, grn_id id,

  Modified: lib/store.h (+2 -0)
===================================================================
--- lib/store.h    2010-08-18 14:17:04 +0000 (a3861ac)
+++ lib/store.h    2010-08-19 01:57:08 +0000 (929f1f6)
@@ -99,6 +99,8 @@ grn_rc grn_ja_put(grn_ctx *ctx, grn_ja *ja, grn_id id,
 int grn_ja_at(grn_ctx *ctx, grn_ja *ja, grn_id id, void *valbuf, int buf_size);
 
 void *grn_ja_ref(grn_ctx *ctx, grn_ja *ja, grn_id id, grn_io_win *iw, uint32_t *value_len);
+grn_obj *grn_ja_get_value(grn_ctx *ctx, grn_ja *ja, grn_id id, grn_obj *value);
+
 grn_rc grn_ja_unref(grn_ctx *ctx, grn_io_win *iw);
 int grn_ja_defrag(grn_ctx *ctx, grn_ja *ja, int threshold);
 




Groonga-commit メーリングリストの案内
Back to archive index