null+****@clear*****
null+****@clear*****
2010年 7月 29日 (木) 00:00:10 JST
Daijiro MORI 2010-07-28 15:00:10 +0000 (Wed, 28 Jul 2010)
New Revision: cf35bdcef6d37fa7a64a84910644c0a3a04bc3bf
Log:
Added grn_ja_element_info().
Modified files:
lib/store.c
lib/store.h
Modified: lib/store.c (+48 -4)
===================================================================
--- lib/store.c 2010-07-28 12:45:59 +0000 (0d19950)
+++ lib/store.c 2010-07-28 15:00:10 +0000 (6fc68fd)
@@ -829,6 +829,40 @@ grn_ja_size(grn_ctx *ctx, grn_ja *ja, grn_id id)
return size;
}
+grn_rc
+grn_ja_element_info(grn_ctx *ctx, grn_ja *ja, grn_id id,
+ uint64_t *cas, uint32_t *pos, uint32_t *size)
+{
+ uint32_t pseg = ja->header->esegs[id >> JA_W_EINFO_IN_A_SEGMENT];
+ if (pseg == JA_ESEG_VOID) {
+ return GRN_INVALID_ARGUMENT;
+ } else {
+ grn_ja_einfo *einfo = NULL;
+ GRN_IO_SEG_REF(ja->io, pseg, einfo);
+ if (einfo) {
+ grn_ja_einfo *ei;
+ *cas = *((uint64_t *)&einfo[id & JA_M_EINFO_IN_A_SEGMENT]);
+ ei = (grn_ja_einfo *)cas;
+ if (ETINY_P(ei)) {
+ ETINY_DEC(ei, *size);
+ *pos = 0;
+ } else {
+ uint32_t jag, vpos, vsize;
+ if (EHUGE_P(ei)) {
+ EHUGE_DEC(ei, jag, *size);
+ *pos = 0;
+ } else {
+ EINFO_DEC(ei, jag, *pos, *size);
+ }
+ }
+ GRN_IO_SEG_UNREF(ja->io, pseg);
+ } else {
+ return GRN_INVALID_ARGUMENT;
+ }
+ }
+ return GRN_SUCCESS;
+}
+
#ifndef NO_ZLIB
#include <zlib.h>
@@ -999,7 +1033,7 @@ grn_ja_put_lzo(grn_ctx *ctx, grn_ja *ja, grn_id id,
grn_rc
grn_ja_put(grn_ctx *ctx, grn_ja *ja, grn_id id, void *value, uint32_t value_len,
- int flags, void *cas)
+ int flags, uint64_t *cas)
{
#ifndef NO_ZLIB
if (ja->header->flags & GRN_OBJ_COMPRESS_ZLIB) {
@@ -1025,12 +1059,22 @@ grn_ja_defrag_seg(grn_ctx *ctx, grn_ja *ja, uint32_t seg)
ve = v + JA_SEGMENT_SIZE;
while (v < ve && cum < sum) {
grn_id id = *((grn_id *)v);
+ if (!id) { break; }
if (id & DELETED) {
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, NULL)) {
- return ctx->rc;
+ uint64_t cas;
+ uint32_t pos;
+ if (grn_ja_element_info(ctx, ja, id, &cas, &pos, &element_size)) { break; }
+ if (v != ve - JA_SEGMENT_SIZE + pos) {
+ GRN_LOG(ctx, GRN_LOG_WARNING,
+ "dseges[%d] = pos unmatch (%d != %d)", seg, pos, v + JA_SEGMENT_SIZE - ve);
+ break;
+ }
+ if (grn_ja_put(ctx, ja, id, v + sizeof(uint32_t), element_size, GRN_OBJ_SET, &cas)) {
+ GRN_LOG(ctx, GRN_LOG_WARNING,
+ "dseges[%d] = put failed (%d)", seg, id);
+ break;
}
element_size = (element_size + sizeof(grn_id) - 1) & ~(sizeof(grn_id) - 1);
cum += sizeof(uint32_t) + element_size;
Modified: lib/store.h (+1 -1)
===================================================================
--- lib/store.h 2010-07-28 12:45:59 +0000 (7dd4425)
+++ lib/store.h 2010-07-28 15:00:10 +0000 (a3861ac)
@@ -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 *cas);
+ void *value, uint32_t value_len, int flags, uint64_t *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);