Mercurial > hg > orthanc-databases
diff PostgreSQL/UnitTests/PostgreSQLTests.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 | 9774802fd05f |
children | 714c5d2bee76 |
line wrap: on
line diff
--- a/PostgreSQL/UnitTests/PostgreSQLTests.cpp Wed Jul 11 14:39:59 2018 +0200 +++ b/PostgreSQL/UnitTests/PostgreSQLTests.cpp Thu Jul 12 10:44:17 2018 +0200 @@ -45,20 +45,16 @@ using namespace OrthancDatabases; -extern OrthancDatabases::PostgreSQLParameters globalParameters_; +extern PostgreSQLParameters globalParameters_; -static OrthancDatabases::PostgreSQLDatabase* CreateTestDatabase(bool clearAll) +static PostgreSQLDatabase* CreateTestDatabase() { - std::auto_ptr<OrthancDatabases::PostgreSQLDatabase> pg - (new OrthancDatabases::PostgreSQLDatabase(globalParameters_)); + std::auto_ptr<PostgreSQLDatabase> pg + (new PostgreSQLDatabase(globalParameters_)); pg->Open(); - - if (clearAll) - { - pg->ClearAll(); - } + pg->ClearAll(); return pg.release(); } @@ -75,7 +71,7 @@ TEST(PostgreSQL, Basic) { - std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase(true)); + std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase()); ASSERT_FALSE(pg->DoesTableExist("Test")); pg->Execute("CREATE TABLE Test(name INTEGER, value BIGINT)"); @@ -148,7 +144,7 @@ TEST(PostgreSQL, String) { - std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase(true)); + std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase()); pg->Execute("CREATE TABLE Test(name INTEGER, value VARCHAR(40))"); @@ -194,7 +190,7 @@ TEST(PostgreSQL, Transaction) { - std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase(true)); + std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase()); pg->Execute("CREATE TABLE Test(name INTEGER, value INTEGER)"); @@ -262,7 +258,7 @@ TEST(PostgreSQL, LargeObject) { - std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase(true)); + std::auto_ptr<PostgreSQLDatabase> pg(CreateTestDatabase()); ASSERT_EQ(0, CountLargeObjects(*pg)); pg->Execute("CREATE TABLE Test(name VARCHAR, value OID)"); @@ -340,13 +336,13 @@ TEST(PostgreSQL, StorageArea) { - OrthancDatabases::PostgreSQLStorageArea storageArea(globalParameters_); + PostgreSQLStorageArea storageArea(globalParameters_); storageArea.SetClearAll(true); { - OrthancDatabases::DatabaseManager::Transaction transaction(storageArea.GetManager()); - OrthancDatabases::PostgreSQLDatabase& db = - dynamic_cast<OrthancDatabases::PostgreSQLDatabase&>(transaction.GetDatabase()); + DatabaseManager::Transaction transaction(storageArea.GetManager()); + PostgreSQLDatabase& db = + dynamic_cast<PostgreSQLDatabase&>(transaction.GetDatabase()); ASSERT_EQ(0, CountLargeObjects(db)); @@ -395,3 +391,49 @@ transaction.Commit(); } } + + +TEST(PostgreSQL, ImplicitTransaction) +{ + std::auto_ptr<PostgreSQLDatabase> db(CreateTestDatabase()); + + ASSERT_FALSE(db->DoesTableExist("test")); + ASSERT_FALSE(db->DoesTableExist("test2")); + + { + std::auto_ptr<OrthancDatabases::ITransaction> t(db->CreateTransaction(false)); + ASSERT_FALSE(t->IsImplicit()); + } + + { + Query query("CREATE TABLE test(id INT)", false); + std::auto_ptr<IPrecompiledStatement> s(db->Compile(query)); + + std::auto_ptr<ITransaction> t(db->CreateTransaction(true)); + ASSERT_TRUE(t->IsImplicit()); + ASSERT_THROW(t->Commit(), Orthanc::OrthancException); + ASSERT_THROW(t->Rollback(), Orthanc::OrthancException); + + 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 + Query query("CREATE TABLE test2(id INT)", false); + std::auto_ptr<IPrecompiledStatement> s(db->Compile(query)); + + std::auto_ptr<ITransaction> t(db->CreateTransaction(true)); + + Dictionary args; + t->ExecuteWithoutResult(*s, args); + } + + ASSERT_TRUE(db->DoesTableExist("test")); + ASSERT_TRUE(db->DoesTableExist("test2")); +} +