diff Framework/PostgreSQL/PostgreSQLDatabase.cpp @ 237:35598014f140

refactoring to remove GlobalProperties.cpp
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 08 Apr 2021 19:09:04 +0200
parents a4918d57435c
children 33fa478c119a
line wrap: on
line diff
--- a/Framework/PostgreSQL/PostgreSQLDatabase.cpp	Thu Apr 08 12:00:01 2021 +0200
+++ b/Framework/PostgreSQL/PostgreSQLDatabase.cpp	Thu Apr 08 19:09:04 2021 +0200
@@ -155,7 +155,7 @@
   }
 
 
-  void PostgreSQLDatabase::Execute(const std::string& sql)
+  void PostgreSQLDatabase::ExecuteMultiLines(const std::string& sql)
   {
     LOG(TRACE) << "PostgreSQL: " << sql;
     Open();
@@ -210,14 +210,14 @@
     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;");
+    ExecuteMultiLines("SELECT lo_unlink(loid) FROM (SELECT DISTINCT loid FROM pg_catalog.pg_largeobject) as loids;");
 
     // http://stackoverflow.com/a/21247009/881731
-    Execute("DROP SCHEMA public CASCADE;");
-    Execute("CREATE SCHEMA public;");
-    Execute("GRANT ALL ON SCHEMA public TO postgres;");
-    Execute("GRANT ALL ON SCHEMA public TO public;");
-    Execute("COMMENT ON SCHEMA public IS 'standard public schema';");
+    ExecuteMultiLines("DROP SCHEMA public CASCADE;");
+    ExecuteMultiLines("CREATE SCHEMA public;");
+    ExecuteMultiLines("GRANT ALL ON SCHEMA public TO postgres;");
+    ExecuteMultiLines("GRANT ALL ON SCHEMA public TO public;");
+    ExecuteMultiLines("COMMENT ON SCHEMA public IS 'standard public schema';");
 
     transaction.Commit();
   }
@@ -233,6 +233,9 @@
   {
     class PostgreSQLImplicitTransaction : public ImplicitTransaction
     {
+    private:
+      PostgreSQLDatabase& db_;
+      
     protected:
       virtual IResult* ExecuteInternal(IPrecompiledStatement& statement,
                                        const Dictionary& parameters)
@@ -245,6 +248,27 @@
       {
         dynamic_cast<PostgreSQLStatement&>(statement).ExecuteWithoutResult(*this, parameters);
       }
+
+    public:
+      PostgreSQLImplicitTransaction(PostgreSQLDatabase& db) :
+        db_(db)
+      {
+      }
+
+      virtual bool DoesTableExist(const std::string& name) ORTHANC_OVERRIDE
+      {
+        return db_.DoesTableExist(name.c_str());
+      }
+
+      virtual bool DoesTriggerExist(const std::string& name) ORTHANC_OVERRIDE
+      {
+        return false;
+      }
+
+      virtual void ExecuteMultiLines(const std::string& query) ORTHANC_OVERRIDE
+      {
+        db_.ExecuteMultiLines(query);
+      }
     };
   }
   
@@ -254,7 +278,7 @@
     switch (type)
     {
       case TransactionType_Implicit:
-        return new PostgreSQLImplicitTransaction;
+        return new PostgreSQLImplicitTransaction(*this);
 
       case TransactionType_ReadWrite:
       case TransactionType_ReadOnly: