diff Framework/PostgreSQL/PostgreSQLParameters.h @ 432:8b7c1c423367 pg-transactions

new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
author Alain Mazy <am@osimis.io>
date Mon, 11 Dec 2023 14:39:27 +0100
parents dbf811b1bb43
children f0976163dbe1
line wrap: on
line diff
--- a/Framework/PostgreSQL/PostgreSQLParameters.h	Thu Dec 07 12:13:43 2023 +0100
+++ b/Framework/PostgreSQL/PostgreSQLParameters.h	Mon Dec 11 14:39:27 2023 +0100
@@ -30,6 +30,13 @@
 
 namespace OrthancDatabases
 {
+  enum IsolationMode
+  {
+    IsolationMode_DbDefault = 0,
+    IsolationMode_Serializable = 1,
+    IsolationMode_ReadCommited = 2
+  };
+
   class PostgreSQLParameters
   {
   private:
@@ -43,10 +50,8 @@
     bool         lock_;
     unsigned int maxConnectionRetries_;
     unsigned int connectionRetryInterval_;
-    std::string  readWriteTransactionStatement_;
-    std::string  readOnlyTransactionStatement_;
     bool         isVerboseEnabled_;
-
+    IsolationMode isolationMode_;
     void Reset();
 
   public:
@@ -128,24 +133,39 @@
       return connectionRetryInterval_;
     }
 
-    void SetReadWriteTransactionStatement(const std::string& statement)
+    void SetIsolationMode(IsolationMode isolationMode)
     {
-      readWriteTransactionStatement_ = statement;
+      isolationMode_ = isolationMode;
     }
 
-    void SetReadOnlyTransactionStatement(const std::string& statement)
+    const char* GetReadWriteTransactionStatement() const
     {
-      readOnlyTransactionStatement_ = statement;
+      switch (isolationMode_)
+      {
+        case IsolationMode_DbDefault:
+          return "";
+        case IsolationMode_ReadCommited:
+          return "SET TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE";
+        case IsolationMode_Serializable:
+          return "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE";
+        default:
+          throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
+      }
     }
 
-    const std::string& GetReadWriteTransactionStatement() const
+    const char* GetReadOnlyTransactionStatement() const
     {
-      return readWriteTransactionStatement_;
-    }
-
-    const std::string& GetReadOnlyTransactionStatement() const
-    {
-      return readOnlyTransactionStatement_;
+      switch (isolationMode_)
+      {
+        case IsolationMode_DbDefault:
+          return "";
+        case IsolationMode_ReadCommited:
+          return "SET TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY";
+        case IsolationMode_Serializable:
+          return "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY";
+        default:
+          throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
+      }
     }
 
     void SetVerboseEnabled(bool enabled)