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)