Mercurial > hg > orthanc-databases
diff MySQL/UnitTests/UnitTestsMain.cpp @ 23:b2ff1cd2907a
handling of implicit transactions in DatabaseManager
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 12 Jul 2018 10:44:17 +0200 |
parents | 1e9bad493475 |
children | 5600949bfb12 |
line wrap: on
line diff
--- a/MySQL/UnitTests/UnitTestsMain.cpp Wed Jul 11 14:39:59 2018 +0200 +++ b/MySQL/UnitTests/UnitTestsMain.cpp Thu Jul 12 10:44:17 2018 +0200 @@ -28,6 +28,7 @@ #include "../../Framework/MySQL/MySQLDatabase.h" #include "../../Framework/MySQL/MySQLResult.h" #include "../../Framework/MySQL/MySQLStatement.h" +#include "../../Framework/MySQL/MySQLTransaction.h" #include "../../Framework/Plugins/IndexUnitTests.h" #include <Core/Logging.h> @@ -130,6 +131,59 @@ } +TEST(MySQL, ImplicitTransaction) +{ + OrthancDatabases::MySQLDatabase::ClearDatabase(globalParameters_); + OrthancDatabases::MySQLDatabase db(globalParameters_); + db.Open(); + + { + OrthancDatabases::MySQLTransaction t(db); + ASSERT_FALSE(db.DoesTableExist(t, "test")); + ASSERT_FALSE(db.DoesTableExist(t, "test2")); + } + + { + std::auto_ptr<OrthancDatabases::ITransaction> t(db.CreateTransaction(false)); + ASSERT_FALSE(t->IsImplicit()); + } + + { + OrthancDatabases::Query query("CREATE TABLE test(id INT)", false); + std::auto_ptr<OrthancDatabases::IPrecompiledStatement> s(db.Compile(query)); + + std::auto_ptr<OrthancDatabases::ITransaction> t(db.CreateTransaction(true)); + ASSERT_TRUE(t->IsImplicit()); + ASSERT_THROW(t->Commit(), Orthanc::OrthancException); + ASSERT_THROW(t->Rollback(), Orthanc::OrthancException); + + OrthancDatabases::Dictionary args; + t->ExecuteWithoutResult(*s, args); + ASSERT_THROW(t->Rollback(), Orthanc::OrthancException); + t->Commit(); + + ASSERT_THROW(t->Commit(), Orthanc::OrthancException); + } + + { + // An implicit transaction does not need to be explicitely committed + OrthancDatabases::Query query("CREATE TABLE test2(id INT)", false); + std::auto_ptr<OrthancDatabases::IPrecompiledStatement> s(db.Compile(query)); + + std::auto_ptr<OrthancDatabases::ITransaction> t(db.CreateTransaction(true)); + + OrthancDatabases::Dictionary args; + t->ExecuteWithoutResult(*s, args); + } + + { + OrthancDatabases::MySQLTransaction t(db); + ASSERT_TRUE(db.DoesTableExist(t, "test")); + ASSERT_TRUE(db.DoesTableExist(t, "test2")); + } +} + + int main(int argc, char **argv) { if (argc < 5)