static inline int si_recovercomplete(sitrack *track, sr *r, si *index, srbuf *buf) { /* prepare and build primary index */ sr_bufreset(buf); srrbnode *p = sr_rbmin(&track->i); while (p) { sinode *n = srcast(p, sinode, node); int rc = sr_bufadd(buf, r->a, &n, sizeof(sinode**)); if (srunlikely(rc == -1)) return sr_malfunction(r->e, "%s", "memory allocation failed"); p = sr_rbnext(&track->i, p); } sriter i; sr_iterinit(sr_bufiterref, &i, r); sr_iteropen(sr_bufiterref, &i, buf, sizeof(sinode*)); while (sr_iterhas(sr_bufiterref, &i)) { sinode *n = sr_iterof(sr_bufiterref, &i); if (n->recover & SI_RDB_REMOVE) { int rc = si_nodefree(n, r, 1); if (srunlikely(rc == -1)) return -1; sr_iternext(sr_bufiterref, &i); continue; } n->recover = SI_RDB; si_insert(index, r, n); si_plannerupdate(&index->p, SI_COMPACT|SI_BRANCH, n); sr_iternext(sr_bufiterref, &i); } return 0; }
static inline int si_noderecover(sinode *n, sr *r) { /* recover branches */ sriter i; sr_iterinit(sd_recover, &i, r); sr_iteropen(sd_recover, &i, &n->file); int first = 1; int rc; while (sr_iteratorhas(&i)) { sdindexheader *h = sr_iteratorof(&i); sibranch *b; if (first) { b = &n->self; } else { b = si_branchnew(r); if (srunlikely(b == NULL)) goto error; } sdindex index; sd_indexinit(&index); rc = sd_indexcopy(&index, r, h); if (srunlikely(rc == -1)) goto error; si_branchset(b, &index); b->next = n->branch; n->branch = b; n->branch_count++; first = 0; sr_iteratornext(&i); } rc = sd_recover_complete(&i); if (srunlikely(rc == -1)) goto error; sr_iteratorclose(&i); return 0; error: sr_iteratorclose(&i); return -1; }