int sd_indexadd(sdindex *i, sr *r, sdbuild *build) { int rc = sr_bufensure(&i->i, r->a, sizeof(sdindexpage)); if (srunlikely(rc == -1)) { sr_error(r->e, "%s", "memory allocation failed"); return -1; } sdpageheader *ph = sd_buildheader(build); int size = ph->size + sizeof(sdpageheader); int sizeorigin = ph->sizeorigin + sizeof(sdpageheader); /* prepare page header. * * offset is relative to index: * m->offset + (index_size) + page->offset */ sdindexpage *p = (sdindexpage*)i->i.p; p->offset = sd_buildoffset(build); p->offsetindex = sr_bufused(&i->v); p->size = size; p->sizeorigin = sizeorigin; if (srlikely(ph->count > 0)) { p->sizemin = sr_formatkey_total(r->cmp, sd_buildminkey(build)); p->sizemax = sr_formatkey_total(r->cmp, sd_buildmaxkey(build)); } else { p->sizemin = 0; p->sizemax = 0; } p->lsnmin = ph->lsnmin; p->lsnmax = ph->lsnmax; /* update index info */ sdindexheader *h = sd_indexheader(i); h->count++; h->size += sizeof(sdindexpage) + p->sizemin + p->sizemax; h->keys += ph->count; h->total += size; h->totalorigin += sizeorigin; if (ph->lsnmin < h->lsnmin) h->lsnmin = ph->lsnmin; if (ph->lsnmax > h->lsnmax) h->lsnmax = ph->lsnmax; h->dupkeys += ph->countdup; if (ph->lsnmindup < h->dupmin) h->dupmin = ph->lsnmindup; sr_bufadvance(&i->i, sizeof(sdindexpage)); if (srunlikely(ph->count == 0)) return 0; /* copy keys */ rc = sr_bufensure(&i->v, r->a, p->sizemin + p->sizemax); if (srunlikely(rc == -1)) { sr_error(r->e, "%s", "memory allocation failed"); return -1; } /* reformat key object to exclude value */ rc = sr_formatkey_copy(r->cmp, i->v.p, sd_buildminkey(build)); assert(rc == p->sizemin); (void)rc; sr_bufadvance(&i->v, p->sizemin); rc = sr_formatkey_copy(r->cmp, i->v.p, sd_buildmaxkey(build)); assert(rc == p->sizemax); (void)rc; sr_bufadvance(&i->v, p->sizemax); return 0; }
int sd_indexadd(sdindex *i, sr *r, sdbuild *build, uint64_t offset) { int rc = ss_bufensure(&i->i, r->a, sizeof(sdindexpage)); if (ssunlikely(rc == -1)) return sr_oom(r->e); sdpageheader *ph = sd_buildheader(build); int size = ph->size + sizeof(sdpageheader); int sizeorigin = ph->sizeorigin + sizeof(sdpageheader); /* prepare page header */ sdindexpage *p = (sdindexpage*)i->i.p; p->offset = offset; p->offsetindex = ss_bufused(&i->v); p->lsnmin = ph->lsnmin; p->lsnmax = ph->lsnmax; p->size = size; p->sizeorigin = sizeorigin; p->sizemin = 0; p->sizemax = 0; /* copy keys */ if (ssunlikely(ph->count > 0)) { char *min; char *max; min = sd_buildminkey(build); min += ss_leb128skip(min); min += ss_leb128skip(min); max = sd_buildmaxkey(build); max += ss_leb128skip(max); max += ss_leb128skip(max); switch (r->fmt_storage) { case SF_SRAW: rc = sd_indexadd_raw(i, r, p, min, max); break; case SF_SKEYVALUE: rc = sd_indexadd_keyvalue(i, r, build, p, min, max); break; } if (ssunlikely(rc == -1)) return -1; } /* update index info */ sdindexheader *h = sd_indexheader(i); h->count++; h->size += sizeof(sdindexpage) + p->sizemin + p->sizemax; h->keys += ph->count; h->total += size; h->totalorigin += sizeorigin; if (build->vmax > h->sizevmax) h->sizevmax = build->vmax; if (ph->lsnmin < h->lsnmin) h->lsnmin = ph->lsnmin; if (ph->lsnmax > h->lsnmax) h->lsnmax = ph->lsnmax; h->dupkeys += ph->countdup; if (ph->lsnmindup < h->dupmin) h->dupmin = ph->lsnmindup; ss_bufadvance(&i->i, sizeof(sdindexpage)); return 0; }
int key = 7; addv(&b, &r, 3, SVSET, &key); key = 8; addv(&b, &r, 4, SVSET, &key); key = 9; addv(&b, &r, 5, SVSET, &key); sd_buildend(&b, &r); sdpageheader *h = sd_buildheader(&b); int rc; rc = sd_indexadd(&index, &r, sd_buildoffset(&b), h->size + sizeof(sdpageheader), h->sizeorigin + sizeof(sdpageheader), h->count, sd_buildminkey(&b), sd_buildmin(&b)->keysize, sd_buildmaxkey(&b), sd_buildmax(&b)->keysize, h->countdup, h->lsnmindup, h->lsnmin, h->lsnmax); t( rc == 0 ); t( sd_buildcommit(&b) == 0 ); sdid id; memset(&id, 0, sizeof(id)); t( sd_indexcommit(&index, &r, &id) == 0 );