# # # patch "database.cc" # from [31c97120c8936dfa1b4c08de37a6162cc3d9299e] # to [f726e22abbfb4c75d35a5aa666fc507c255bb68a] # # patch "database.hh" # from [9878508b3f1bbcc3f122bf0937fe748457539e29] # to [b78ece31bb4d90bc92abd7d29b46ef9651ae7975] # ============================================================ --- database.cc 31c97120c8936dfa1b4c08de37a6162cc3d9299e +++ database.cc f726e22abbfb4c75d35a5aa666fc507c255bb68a @@ -2992,6 +2992,16 @@ database::delete_existing_rev_and_certs( // Kill the certs, ancestry, and revision. imp->execute(query("DELETE from revision_certs WHERE revision_id = ?") % blob(rid.inner()())); + { + results res; + imp->fetch(res, one_col, any_rows, + query("SELECT branch FROM branch_leaves where revision_id = ?") + % blob(rid.inner()())); + for (results::const_iterator i = res.begin(); i != res.end(); ++i) + { + recalc_branch_leaves(cert_value((*i)[0], origin::database)); + } + } imp->cert_stamper.note_change(); imp->execute(query("DELETE from revision_ancestry WHERE child = ?") @@ -3006,6 +3016,20 @@ database::delete_existing_rev_and_certs( guard.commit(); } +void +database::recalc_branch_leaves(cert_value const & name) +{ + imp->execute(query("DELETE FROM branch_leaves WHERE branch = ?") % blob(name())); + set revs; + get_revisions_with_cert(cert_name("branch"), name, revs); + erase_ancestors(*this, revs); + for (set::const_iterator i = revs.begin(); i != revs.end(); ++i) + { + imp->execute(query("INSERT INTO branch_leaves (branch, revision_id) " + "VALUES (?, ?)") % blob(name()) % blob((*i).inner()())); + } +} + /// Deletes all certs referring to a particular branch. void database::delete_branch_named(cert_value const & branch) @@ -3013,6 +3037,8 @@ database::delete_branch_named(cert_value L(FL("Deleting all references to branch %s") % branch); imp->execute(query("DELETE FROM revision_certs WHERE name='branch' AND value =?") % blob(branch())); + imp->execute(query("DELETE FROM branch_leaves WHERE branch = ?") + % blob(branch())); imp->cert_stamper.note_change(); imp->execute(query("DELETE FROM branch_epochs WHERE branch=?") % blob(branch())); ============================================================ --- database.hh 9878508b3f1bbcc3f122bf0937fe748457539e29 +++ database.hh b78ece31bb4d90bc92abd7d29b46ef9651ae7975 @@ -310,6 +310,10 @@ public: outdated_indicator get_branch_leaves(cert_value const & value, std::set & revisions); +private: + void recalc_branch_leaves(cert_value const & value); +public: + // Used through project.cc outdated_indicator get_revision_certs(revision_id const & ident, std::vector & certs);