diff options
Diffstat (limited to 'common/bulk/driver.cxx')
-rw-r--r-- | common/bulk/driver.cxx | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/common/bulk/driver.cxx b/common/bulk/driver.cxx index c043931..4b3b9f8 100644 --- a/common/bulk/driver.cxx +++ b/common/bulk/driver.cxx @@ -81,7 +81,7 @@ struct element_traits<I, std::unique_ptr<T>> template <typename I> void -persist (const auto_ptr<database>& db, I b, I e) +persist (const auto_ptr<database>& db, I b, I e, bool cont = true) { typedef element_traits<I> traits; typedef typename traits::type type; @@ -89,7 +89,7 @@ persist (const auto_ptr<database>& db, I b, I e) { transaction t (db->begin ()); - db->persist (b, e); + db->persist (b, e, cont); t.commit (); } @@ -111,11 +111,11 @@ persist (const auto_ptr<database>& db, I b, I e) template <typename I> void -try_persist (const auto_ptr<database>& db, I b, I e) +try_persist (const auto_ptr<database>& db, I b, I e, bool cont = true) { try { - persist (db, b, e); + persist (db, b, e, cont); assert (false); } catch (const multiple_exceptions& e) @@ -126,7 +126,8 @@ try_persist (const auto_ptr<database>& db, I b, I e) template <typename I> void -update (const auto_ptr<database>& db, I b, I e, bool modify = true) +update (const auto_ptr<database>& db, I b, I e, + bool modify = true, bool cont = true) { typedef element_traits<I> traits; typedef typename traits::type type; @@ -144,7 +145,7 @@ update (const auto_ptr<database>& db, I b, I e, bool modify = true) { transaction t (db->begin ()); - db->update (b, e); + db->update (b, e, cont); t.commit (); } @@ -166,11 +167,11 @@ update (const auto_ptr<database>& db, I b, I e, bool modify = true) template <typename I> void -try_update (const auto_ptr<database>& db, I b, I e) +try_update (const auto_ptr<database>& db, I b, I e, bool cont = true) { try { - update (db, b, e, false); + update (db, b, e, false, cont); assert (false); } catch (const multiple_exceptions& e) @@ -209,14 +210,14 @@ erase (const auto_ptr<database>& db, I b, I e) template <typename T, typename I> void -erase_id (const auto_ptr<database>& db, I b, I e) +erase_id (const auto_ptr<database>& db, I b, I e, bool cont = true) { typedef element_traits<T*> traits; typedef T type; { transaction t (db->begin ()); - db->erase<T> (b, e); + db->erase<T> (b, e, cont); t.commit (); } @@ -234,11 +235,11 @@ erase_id (const auto_ptr<database>& db, I b, I e) template <typename T, typename A> void -try_erase (const auto_ptr<database>& db, const A& a) +try_erase (const auto_ptr<database>& db, const A& a, bool cont = true) { try { - erase_id<T> (db, a, a + sizeof (a) / sizeof (a[0])); + erase_id<T> (db, a, a + sizeof (a) / sizeof (a[0]), cont); assert (false); } catch (const multiple_exceptions& e) @@ -589,13 +590,25 @@ main (int argc, char* argv[]) vector<object> v; // mixture v.push_back (object (0, 0)); v.push_back (object (6, 6)); - v.push_back (object (2, 2)); + v.push_back (object (1, 1)); v.push_back (object (7, 7)); - v.push_back (object (3, 3)); + v.push_back (object (2, 2)); v.push_back (object (8, 8)); - v.push_back (object (4, 4)); + v.push_back (object (3, 3)); try_persist (db, v.begin (), v.end ()); } + + // Test stopping after failure. + // + { + vector<object> v; // batch + v.push_back (object (0, 0)); + v.push_back (object (1, 1)); + v.push_back (object (6, 6)); + v.push_back (object (2, 2)); + v.push_back (object (3, 3)); + try_persist (db, v.begin (), v.end (), false); + } } // update @@ -735,6 +748,18 @@ main (int argc, char* argv[]) try_update (db, v.begin (), v.end ()); } + // Test stopping after failure. + // + { + vector<object> v; // batch + v.push_back (object (6, 6)); + v.push_back (object (7, 7)); + v.push_back (object (0, 0)); + v.push_back (object (8, 8)); + v.push_back (object (9, 9)); + try_update (db, v.begin (), v.end (), false); + } + // Test a database exception (unique constraint violation) // try @@ -842,6 +867,13 @@ main (int argc, char* argv[]) unsigned long a[] = {0, 1, 2, 6, 7, 8, 3, 4, 5, 9}; // mixture try_erase<object> (db, a); } + + // Test stopping after failure. + // + { + unsigned long a[] = {6, 7, 0, 8, 9}; + try_erase<object> (db, a, false); + } } erase (db, v.begin (), v.end ()); |