diff Framework/PostgreSQL/PostgreSQLDatabase.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 41543239072d
children 2fb9cd42af14
line wrap: on
line diff
--- a/Framework/PostgreSQL/PostgreSQLDatabase.cpp	Wed Jul 11 14:39:59 2018 +0200
+++ b/Framework/PostgreSQL/PostgreSQLDatabase.cpp	Thu Jul 12 10:44:17 2018 +0200
@@ -24,6 +24,7 @@
 #include "PostgreSQLResult.h"
 #include "PostgreSQLStatement.h"
 #include "PostgreSQLTransaction.h"
+#include "../Common/ImplicitTransaction.h"
 
 #include <Core/Logging.h>
 #include <Core/OrthancException.h>
@@ -192,8 +193,44 @@
   }
 
 
-  ITransaction* PostgreSQLDatabase::CreateTransaction()
+  namespace
   {
-    return new PostgreSQLTransaction(*this);
+    class PostgreSQLImplicitTransaction : public ImplicitTransaction
+    {
+    private:
+      PostgreSQLDatabase&  db_;
+
+    protected:
+      virtual IResult* ExecuteInternal(IPrecompiledStatement& statement,
+                                       const Dictionary& parameters)
+      {
+        return dynamic_cast<PostgreSQLStatement&>(statement).Execute(*this, parameters);
+      }
+
+      virtual void ExecuteWithoutResultInternal(IPrecompiledStatement& statement,
+                                                const Dictionary& parameters)
+      {
+        dynamic_cast<PostgreSQLStatement&>(statement).ExecuteWithoutResult(*this, parameters);
+      }
+      
+    public:
+      PostgreSQLImplicitTransaction(PostgreSQLDatabase&  db) :
+        db_(db)
+      {
+      }
+    };
+  }
+  
+  
+  ITransaction* PostgreSQLDatabase::CreateTransaction(bool isImplicit)
+  {
+    if (isImplicit)
+    {
+      return new PostgreSQLImplicitTransaction(*this);
+    }
+    else
+    {
+      return new PostgreSQLTransaction(*this);
+    }
   }
 }