# HG changeset patch # User Sebastien Jodogne # Date 1616777276 -3600 # Node ID fbb52129158afdcc0a52644d9dd070e974fa2cd6 # Parent b40b30075c5121f7fb2293b4f02f1784a7b47c4f TransactionType given to PostgreSQLTransaction constructor diff -r b40b30075c51 -r fbb52129158a Framework/PostgreSQL/PostgreSQLDatabase.cpp --- a/Framework/PostgreSQL/PostgreSQLDatabase.cpp Fri Mar 26 17:32:29 2021 +0100 +++ b/Framework/PostgreSQL/PostgreSQLDatabase.cpp Fri Mar 26 17:47:56 2021 +0100 @@ -112,7 +112,7 @@ bool PostgreSQLDatabase::RunAdvisoryLockStatement(const std::string& statement) { - PostgreSQLTransaction transaction(*this); + PostgreSQLTransaction transaction(*this, TransactionType_ReadWrite); Query query(statement, false); PostgreSQLStatement s(*this, query); @@ -206,7 +206,7 @@ void PostgreSQLDatabase::ClearAll() { - PostgreSQLTransaction transaction(*this); + PostgreSQLTransaction transaction(*this, TransactionType_ReadWrite); // Remove all the large objects Execute("SELECT lo_unlink(loid) FROM (SELECT DISTINCT loid FROM pg_catalog.pg_largeobject) as loids;"); @@ -255,12 +255,9 @@ case TransactionType_Implicit: return new PostgreSQLImplicitTransaction; + case TransactionType_ReadWrite: case TransactionType_ReadOnly: - // TODO => READ-ONLY - return new PostgreSQLTransaction(*this); - - case TransactionType_ReadWrite: - return new PostgreSQLTransaction(*this); + return new PostgreSQLTransaction(*this, type); default: throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); diff -r b40b30075c51 -r fbb52129158a Framework/PostgreSQL/PostgreSQLTransaction.cpp --- a/Framework/PostgreSQL/PostgreSQLTransaction.cpp Fri Mar 26 17:32:29 2021 +0100 +++ b/Framework/PostgreSQL/PostgreSQLTransaction.cpp Fri Mar 26 17:47:56 2021 +0100 @@ -29,11 +29,12 @@ namespace OrthancDatabases { - PostgreSQLTransaction::PostgreSQLTransaction(PostgreSQLDatabase& database) : + PostgreSQLTransaction::PostgreSQLTransaction(PostgreSQLDatabase& database, + TransactionType type) : database_(database), isOpen_(false) { - Begin(); + Begin(type); } @@ -55,7 +56,7 @@ } - void PostgreSQLTransaction::Begin() + void PostgreSQLTransaction::Begin(TransactionType type) { if (isOpen_) { @@ -64,7 +65,21 @@ } database_.Execute("BEGIN"); - database_.Execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"); + + switch (type) + { + case TransactionType_ReadWrite: + database_.Execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE"); + break; + + case TransactionType_ReadOnly: + database_.Execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY"); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + isOpen_ = true; } diff -r b40b30075c51 -r fbb52129158a Framework/PostgreSQL/PostgreSQLTransaction.h --- a/Framework/PostgreSQL/PostgreSQLTransaction.h Fri Mar 26 17:32:29 2021 +0100 +++ b/Framework/PostgreSQL/PostgreSQLTransaction.h Fri Mar 26 17:47:56 2021 +0100 @@ -37,8 +37,11 @@ PostgreSQLDatabase& database_; bool isOpen_; + void Begin(TransactionType type); + public: - explicit PostgreSQLTransaction(PostgreSQLDatabase& database); + explicit PostgreSQLTransaction(PostgreSQLDatabase& database, + TransactionType type); ~PostgreSQLTransaction(); @@ -47,8 +50,6 @@ return false; } - void Begin(); - virtual void Rollback() ORTHANC_OVERRIDE; virtual void Commit() ORTHANC_OVERRIDE; diff -r b40b30075c51 -r fbb52129158a PostgreSQL/Plugins/PostgreSQLIndex.cpp --- a/PostgreSQL/Plugins/PostgreSQLIndex.cpp Fri Mar 26 17:32:29 2021 +0100 +++ b/PostgreSQL/Plugins/PostgreSQLIndex.cpp Fri Mar 26 17:47:56 2021 +0100 @@ -81,7 +81,7 @@ } { - PostgreSQLTransaction t(*db); + PostgreSQLTransaction t(*db, TransactionType_ReadWrite); if (!db->DoesTableExist("Resources")) { @@ -127,7 +127,7 @@ } { - PostgreSQLTransaction t(*db); + PostgreSQLTransaction t(*db, TransactionType_ReadWrite); int hasTrigram = 0; if (!LookupGlobalIntegerProperty(hasTrigram, *db, t, @@ -174,7 +174,7 @@ } { - PostgreSQLTransaction t(*db); + PostgreSQLTransaction t(*db, TransactionType_ReadWrite); int property = 0; if (!LookupGlobalIntegerProperty(property, *db, t, diff -r b40b30075c51 -r fbb52129158a PostgreSQL/Plugins/PostgreSQLStorageArea.cpp --- a/PostgreSQL/Plugins/PostgreSQLStorageArea.cpp Fri Mar 26 17:32:29 2021 +0100 +++ b/PostgreSQL/Plugins/PostgreSQLStorageArea.cpp Fri Mar 26 17:47:56 2021 +0100 @@ -51,7 +51,7 @@ } { - PostgreSQLTransaction t(*db); + PostgreSQLTransaction t(*db, TransactionType_ReadWrite); if (!db->DoesTableExist("StorageArea")) { diff -r b40b30075c51 -r fbb52129158a PostgreSQL/UnitTests/PostgreSQLTests.cpp --- a/PostgreSQL/UnitTests/PostgreSQLTests.cpp Fri Mar 26 17:32:29 2021 +0100 +++ b/PostgreSQL/UnitTests/PostgreSQLTests.cpp Fri Mar 26 17:47:56 2021 +0100 @@ -206,7 +206,15 @@ s.Run(); { - PostgreSQLTransaction t(*pg); + PostgreSQLTransaction t(*pg, TransactionType_ReadOnly); + s.BindInteger(0, 0); + s.BindInteger(1, 1); + // Failure, as INSERT in a read-only transaction + ASSERT_THROW(s.Run(), Orthanc::OrthancException); + } + + { + PostgreSQLTransaction t(*pg, TransactionType_ReadWrite); s.BindInteger(0, 43); s.BindInteger(1, 4343); s.Run(); @@ -222,13 +230,14 @@ } { + // Implicit transaction PostgreSQLStatement u(*pg, "SELECT COUNT(*) FROM Test"); PostgreSQLResult r(u); ASSERT_EQ(1, r.GetInteger64(0)); // Just "1" because of implicit rollback } { - PostgreSQLTransaction t(*pg); + PostgreSQLTransaction t(*pg, TransactionType_ReadWrite); s.BindInteger(0, 43); s.BindInteger(1, 4343); s.Run(); @@ -248,6 +257,7 @@ } { + PostgreSQLTransaction t(*pg, TransactionType_ReadOnly); PostgreSQLStatement u(*pg, "SELECT COUNT(*) FROM Test"); PostgreSQLResult r(u); ASSERT_EQ(3, r.GetInteger64(0)); @@ -276,7 +286,7 @@ for (int i = 0; i < 10; i++) { - PostgreSQLTransaction t(*pg); + PostgreSQLTransaction t(*pg, TransactionType_ReadWrite); std::string value = "Value " + boost::lexical_cast(i * 2); PostgreSQLLargeObject obj(*pg, value); @@ -297,7 +307,7 @@ ASSERT_EQ(10, CountLargeObjects(*pg)); { - PostgreSQLTransaction t(*pg); + PostgreSQLTransaction t(*pg, TransactionType_ReadOnly); PostgreSQLStatement s(*pg, "SELECT * FROM Test ORDER BY name DESC"); PostgreSQLResult r(s); @@ -318,7 +328,7 @@ { - PostgreSQLTransaction t(*pg); + PostgreSQLTransaction t(*pg, TransactionType_ReadWrite); PostgreSQLStatement s(*pg, "DELETE FROM Test WHERE name='Index 9'"); s.Run(); t.Commit(); @@ -327,7 +337,7 @@ { // Count the number of items in the DB - PostgreSQLTransaction t(*pg); + PostgreSQLTransaction t(*pg, TransactionType_ReadOnly); PostgreSQLStatement s(*pg, "SELECT COUNT(*) FROM Test"); PostgreSQLResult r(s); ASSERT_EQ(9, r.GetInteger64(0));