null+****@clear*****
null+****@clear*****
2010年 7月 28日 (水) 21:45:59 JST
Daijiro MORI 2010-07-28 12:45:59 +0000 (Wed, 28 Jul 2010) New Revision: ec69c9e96adad8b65be7f31ef4a87f5495e6b861 Log: Added cas argument to grn_ja_put(). Modified files: lib/db.c lib/store.c lib/store.h Modified: lib/db.c (+14 -14) =================================================================== --- lib/db.c 2010-07-28 04:01:41 +0000 (c015e20) +++ lib/db.c 2010-07-28 12:45:59 +0000 (c90a243) @@ -2834,7 +2834,7 @@ default_column_set_value(grn_ctx *ctx, grn_proc_ctx *pctx, grn_obj *in, grn_obj switch (pctx->obj->header.type) { case GRN_COLUMN_VAR_SIZE : return grn_ja_put(ctx, (grn_ja *)pctx->obj, arg->id, - in->u.p.ptr, value_size, 0); // todo type->flag + in->u.p.ptr, value_size, 0, NULL); // todo type->flag case GRN_COLUMN_FIX_SIZE : if (((grn_ra *)pctx->obj)->header->element_size < value_size) { ERR(GRN_INVALID_ARGUMENT, "too long value (%d)", value_size); @@ -4335,7 +4335,7 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id, if (call_hook(ctx, obj, id, value, flags)) { goto exit; } switch (obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) { case GRN_OBJ_COLUMN_SCALAR : - rc = grn_ja_put(ctx, (grn_ja *)obj, id, v, s, flags); + rc = grn_ja_put(ctx, (grn_ja *)obj, id, v, s, flags, NULL); break; case GRN_OBJ_COLUMN_VECTOR : { @@ -4356,7 +4356,7 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_token_close(ctx, token); } rc = grn_ja_put(ctx, (grn_ja *)obj, id, - GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf), flags); + GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf), flags, NULL); } break; case GRN_VECTOR : @@ -4371,10 +4371,10 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id, } } rc = grn_ja_put(ctx, (grn_ja *)obj, id, - GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf), flags); + GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf), flags, NULL); break; case GRN_UVECTOR : - rc = grn_ja_put(ctx, (grn_ja *)obj, id, v, s, flags); + rc = grn_ja_put(ctx, (grn_ja *)obj, id, v, s, flags, NULL); break; default : ERR(GRN_INVALID_ARGUMENT, "vector, uvector or bulk required"); @@ -4385,7 +4385,7 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id, switch (value->header.type) { case GRN_BULK : if (!GRN_BULK_VSIZE(value)) { - rc = grn_ja_put(ctx, (grn_ja *)obj, id, NULL, 0, flags); + rc = grn_ja_put(ctx, (grn_ja *)obj, id, NULL, 0, flags, NULL); } else { grn_obj v; GRN_OBJ_INIT(&v, GRN_VECTOR, GRN_OBJ_DO_SHALLOW_COPY, GRN_DB_TEXT); @@ -4396,7 +4396,7 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id, } break; case GRN_UVECTOR : - rc = grn_ja_put(ctx, (grn_ja *)obj, id, v, s, flags); + rc = grn_ja_put(ctx, (grn_ja *)obj, id, v, s, flags, NULL); break; case GRN_VECTOR : rc = grn_ja_putv(ctx, (grn_ja *)obj, id, value, 0); @@ -5305,7 +5305,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) remove_columns(ctx, obj); grn_obj_close(ctx, obj); if (path) { - grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET); + grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL); grn_obj_delete_by_id(ctx, db, id, 1); grn_pat_remove(ctx, path); } @@ -5316,7 +5316,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) remove_columns(ctx, obj); grn_obj_close(ctx, obj); if (path) { - grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET); + grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL); grn_obj_delete_by_id(ctx, db, id, 1); grn_hash_remove(ctx, path); } @@ -5326,7 +5326,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) remove_columns(ctx, obj); grn_obj_close(ctx, obj); if (path) { - grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET); + grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL); grn_obj_delete_by_id(ctx, db, id, 1); grn_array_remove(ctx, path); } @@ -5336,7 +5336,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) remove_index(ctx, obj, GRN_HOOK_SET); grn_obj_close(ctx, obj); if (path) { - grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET); + grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL); grn_obj_delete_by_id(ctx, db, id, 1); grn_ja_remove(ctx, path); } @@ -5346,7 +5346,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) remove_index(ctx, obj, GRN_HOOK_SET); grn_obj_close(ctx, obj); if (path) { - grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET); + grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL); grn_obj_delete_by_id(ctx, db, id, 1); grn_ra_remove(ctx, path); } @@ -5356,7 +5356,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) delete_source_hook(ctx, obj); grn_obj_close(ctx, obj); if (path) { - grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET); + grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL); grn_obj_delete_by_id(ctx, db, id, 1); grn_ii_remove(ctx, path); } @@ -5366,7 +5366,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) if (GRN_DB_OBJP(obj)) { grn_obj_close(ctx, obj); if (!(id & GRN_OBJ_TMP_OBJECT)) { - grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET); + grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL); grn_obj_delete_by_id(ctx, db, id, 1); } grn_obj_touch(ctx, db, NULL); Modified: lib/store.c (+6 -2) =================================================================== --- lib/store.c 2010-07-28 04:01:41 +0000 (93f64e7) +++ lib/store.c 2010-07-28 12:45:59 +0000 (0d19950) @@ -577,6 +577,9 @@ grn_ja_alloc(grn_ctx *ctx, grn_ja *ja, grn_id id, } *(grn_id *)(addr + pos) = id; aligned_size = (element_size + sizeof(grn_id) - 1) & ~(sizeof(grn_id) - 1); + if (pos + aligned_size < JA_SEGMENT_SIZE) { + *(grn_id *)(addr + pos + aligned_size) = GRN_ID_NIL; + } SEGMENTS_AT(ja, seg) += aligned_size + sizeof(grn_id); pos += sizeof(grn_id); EINFO_ENC(einfo, seg, pos, element_size); @@ -995,7 +998,8 @@ grn_ja_put_lzo(grn_ctx *ctx, grn_ja *ja, grn_id id, #endif /* NO_LZO */ grn_rc -grn_ja_put(grn_ctx *ctx, grn_ja *ja, grn_id id, void *value, uint32_t value_len, int flags) +grn_ja_put(grn_ctx *ctx, grn_ja *ja, grn_id id, void *value, uint32_t value_len, + int flags, void *cas) { #ifndef NO_ZLIB if (ja->header->flags & GRN_OBJ_COMPRESS_ZLIB) { @@ -1025,7 +1029,7 @@ grn_ja_defrag_seg(grn_ctx *ctx, grn_ja *ja, uint32_t seg) element_size = (id & ~DELETED); } else { element_size = grn_ja_size(ctx, ja, id); - if (grn_ja_put(ctx, ja, id, v + sizeof(uint32_t), element_size, GRN_OBJ_SET)) { + if (grn_ja_put(ctx, ja, id, v + sizeof(uint32_t), element_size, GRN_OBJ_SET, NULL)) { return ctx->rc; } element_size = (element_size + sizeof(grn_id) - 1) & ~(sizeof(grn_id) - 1); Modified: lib/store.h (+1 -1) =================================================================== --- lib/store.h 2010-07-28 04:01:41 +0000 (947e78e) +++ lib/store.h 2010-07-28 12:45:59 +0000 (7dd4425) @@ -95,7 +95,7 @@ grn_rc grn_ja_info(grn_ctx *ctx, grn_ja *ja, unsigned int *max_element_size); grn_rc grn_ja_close(grn_ctx *ctx, grn_ja *ja); grn_rc grn_ja_remove(grn_ctx *ctx, const char *path); grn_rc grn_ja_put(grn_ctx *ctx, grn_ja *ja, grn_id id, - void *value, uint32_t value_len, int flags); + void *value, uint32_t value_len, int flags, void *cas); 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);