diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2013-01-18 10:23:39 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2013-01-18 10:23:39 +0200 |
commit | d304a4b2b19dca115954f209d6a37a6958e73ab9 (patch) | |
tree | 0822a40a7d44e7921076b6ad458d29e3ad91c525 /common/transaction/basics/driver.cxx | |
parent | 856a438b33184959b64864f1afdf5a6a2fd6b0d2 (diff) |
Add support for post-commit/rollback callbacks
New test: common/transaction/callback.
Diffstat (limited to 'common/transaction/basics/driver.cxx')
-rw-r--r-- | common/transaction/basics/driver.cxx | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/common/transaction/basics/driver.cxx b/common/transaction/basics/driver.cxx new file mode 100644 index 0000000..984e9e8 --- /dev/null +++ b/common/transaction/basics/driver.cxx @@ -0,0 +1,149 @@ +// file : common/transaction/basics/driver.cxx +// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +// Test basic transaction operations. +// + +#include <string> +#include <cassert> +#include <iostream> + +#include <odb/tracer.hxx> +#include <odb/database.hxx> +#include <odb/transaction.hxx> +#include <odb/statement.hxx> +#include <odb/exceptions.hxx> + +#include <common/common.hxx> +#include <common/concrete.hxx> + +using namespace std; +using namespace odb::core; + +struct transaction_tracer: odb::tracer +{ + virtual void + execute (connection&, const char* s) + { + string str (s); + + if (str == "BEGIN") + cout << "begin transaction" << endl; + else if (str == "COMMIT") + cout << "commit transaction" << endl; + else if (str == "ROLLBACK") + cout << "rollback transaction" << endl; + } + + // Override the other version to get rid of a Sun CC warning. + // + virtual void + execute (connection& c, const statement& s) + { + execute (c, s.text ()); + } +}; + +int +main (int argc, char* argv[]) +{ + { + transaction_tracer tracer; + auto_ptr<database> db (create_database (argc, argv, false)); + db->tracer (tracer); + + assert (!transaction::has_current ()); + + // Current and db accessors. + // + cout << "test 001" << endl; + { + transaction t (db->begin ()); + assert (&t.database () == db.get ()); + assert (transaction::has_current ()); + assert (&transaction::current () == &t); + + transaction::reset_current (); + assert (!transaction::has_current ()); + + transaction t2 (db->begin (), false); + assert (!transaction::has_current ()); + + transaction::current (t2); + assert (&transaction::current () == &t2); + } + + // Commit. + // + cout << "test 002" << endl; + { + transaction t (db->begin ()); + t.commit (); + } + + // Rollback. + // + cout << "test 003" << endl; + { + transaction t (db->begin ()); + t.rollback (); + } + + // Auto rollback. + // + cout << "test 004" << endl; + { + transaction t (db->begin ()); + } + + // Nested transaction. + // + cout << "test 005" << endl; + { + transaction t (db->begin ()); + + try + { + transaction n (db->begin ()); + } + catch (const already_in_transaction&) + { + cout << "already_in_transaction" << endl; + } + } + + // Concrete transaction type. + // + cout << "test 006" << endl; + { + assert (sizeof (odb_db::transaction) == sizeof (transaction)); + + odb_db::transaction t (static_cast<odb_db::database&> (*db).begin ()); + odb_db::transaction& r (odb_db::transaction::current ()); + assert (&t == &r); + } + + // Transaction restart. + // + cout << "test 007" << endl; + { + transaction t (db->begin ()); + t.commit (); + t.reset (db->begin ()); + t.commit (); + } + } + + // Test early connection release. + // + { + auto_ptr<database> db (create_database (argc, argv, false, 1)); + transaction t1 (db->begin ()); + t1.commit (); + transaction t2 (db->begin ()); + t2.rollback (); + transaction t3 (db->begin ()); + t3.commit (); + } +} |