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);