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 = sd_buildmin(build, r); char *max = sd_buildmax(build, r); rc = sd_indexadd_raw(i, r, p, min, max); if (ssunlikely(rc == -1)) return -1; } /* update index info */ sdindexheader *h = &i->build; 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; if (ph->tsmin < h->tsmin) h->tsmin = ph->tsmin; h->dupkeys += ph->countdup; if (ph->lsnmindup < h->dupmin) h->dupmin = ph->lsnmindup; ss_bufadvance(&i->i, sizeof(sdindexpage)); return 0; }
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 ); srfile f; sr_fileinit(&f, &a); t( sr_filenew(&f, "./0000.db") == 0 );