int sc_commit(sc *s, svlog *log, uint64_t lsn, int recover) { /* write-ahead log */ swtx tl; sw_begin(s->wm, &tl, lsn, recover); int rc = sw_write(&tl, log); if (ssunlikely(rc == -1)) { sw_rollback(&tl); return -1; } sw_commit(&tl); /* index */ svlogindex *i = (svlogindex*)log->index.s; svlogindex *end = (svlogindex*)log->index.p; for (; i < end; i++) { if (i->count == 0) continue; si *index = i->r->ptr; sitx x; si_begin(&x, index); si_write(&x, log, i, recover); si_commit(&x); } return 0; }
static size_t sw_write(FILE *f, const unsigned char *s, size_t l) { size_t l0 = l; int i = 0; struct cookie *c = f->cookie; if (s!=f->wbase && sw_write(f, f->wbase, f->wpos-f->wbase)==-1) return -1; while (c->l && l && (i=mbtowc(c->ws, (void *)s, l))>=0) { s+=i; l-=i; c->l--; c->ws++; } *c->ws = 0; return i<0 ? i : l0; }