diff OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp @ 4570:648defffc8cc db-changes

new enum: TransactionType
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 08 Mar 2021 16:04:56 +0100
parents 2a0f8031fb93
children 9224e107d613
line wrap: on
line diff
--- a/OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp	Mon Mar 08 15:13:25 2021 +0100
+++ b/OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp	Mon Mar 08 16:04:56 2021 +0100
@@ -596,7 +596,7 @@
   }
 
 
-  class SQLiteDatabaseWrapper::Transaction : public IDatabaseWrapper::ITransaction
+  class SQLiteDatabaseWrapper::ReadWriteTransaction : public IDatabaseWrapper::ITransaction
   {
   private:
     SQLiteDatabaseWrapper&                that_;
@@ -604,7 +604,7 @@
     int64_t                               initialDiskSize_;
 
   public:
-    Transaction(SQLiteDatabaseWrapper& that) :
+    ReadWriteTransaction(SQLiteDatabaseWrapper& that) :
       that_(that),
       transaction_(new SQLite::Transaction(that_.db_))
     {
@@ -637,11 +637,41 @@
   };
 
 
-  IDatabaseWrapper::ITransaction* SQLiteDatabaseWrapper::StartTransaction()
+  class SQLiteDatabaseWrapper::ReadOnlyTransaction : public IDatabaseWrapper::ITransaction
   {
-    std::unique_ptr<Transaction> transaction(new Transaction(*this));
-    transaction->Begin();
-    return transaction.release();
+  public:
+    virtual void Rollback() ORTHANC_OVERRIDE
+    {
+    }
+
+    virtual void Commit(int64_t fileSizeDelta /* only used in debug */) ORTHANC_OVERRIDE
+    {
+      if (fileSizeDelta != 0)
+      {
+        throw OrthancException(ErrorCode_InternalError);
+      }
+    }
+  };
+
+
+  IDatabaseWrapper::ITransaction* SQLiteDatabaseWrapper::StartTransaction(TransactionType type)
+  {
+    switch (type)
+    {
+      case TransactionType_ReadOnly:
+        return new ReadOnlyTransaction;  // This is a no-op transaction in SQLite (thanks to mutex)
+
+      case TransactionType_ReadWrite:
+      {
+        std::unique_ptr<ReadWriteTransaction> transaction;
+        transaction.reset(new ReadWriteTransaction(*this));
+        transaction->Begin();
+        return transaction.release();
+      }
+
+      default:
+        throw OrthancException(ErrorCode_InternalError);
+    }
   }