From 1e63b60696f2e3012221e3bf6430a0d66ce1ba34 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 21 Aug 2011 10:47:30 +0200 Subject: Add support for multi-pass database schema drop --- odb/schema-catalog.cxx | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'odb/schema-catalog.cxx') diff --git a/odb/schema-catalog.cxx b/odb/schema-catalog.cxx index 2d8415f..ab83dbd 100644 --- a/odb/schema-catalog.cxx +++ b/odb/schema-catalog.cxx @@ -14,7 +14,7 @@ using namespace std; namespace odb { - typedef bool (*create_function) (database&, unsigned short pass); + typedef bool (*create_function) (database&, unsigned short pass, bool drop); typedef vector create_functions; struct schema_catalog_impl: map {}; @@ -34,16 +34,33 @@ namespace odb const create_functions& fs (i->second); // Run the passes until we ran them all or all the functions - // return false, which means no more passes necessary. + // return false, which means no more passes necessary. Do that + // first for drop passes, then for create. // - for (unsigned short pass (0); pass < 3; ++pass) + + for (unsigned short pass (1); pass < 3; ++pass) + { + bool done (true); + + for (create_functions::const_iterator j (fs.begin ()), e (fs.end ()); + j != e; ++j) + { + if ((*j) (db, pass, true)) + done = false; + } + + if (done) + break; + } + + for (unsigned short pass (1); pass < 3; ++pass) { bool done (true); for (create_functions::const_iterator j (fs.begin ()), e (fs.end ()); j != e; ++j) { - if ((*j) (db, pass)) + if ((*j) (db, pass, false)) done = false; } -- cgit v1.1