From a13717ef2f87db07503155de17243c7efec150ba Mon Sep 17 00:00:00 2001
From: Cedric CAFFY <cedric.caffy@cern.ch>
Date: Fri, 13 Dec 2019 17:49:20 +0100
Subject: [PATCH] cta-catalogue-schema-verify use only 1 connection per
 database

---
 catalogue/CatalogueMetadataGetter.cpp | 51 ++++++++++++++++++++-------
 catalogue/CatalogueMetadataGetter.hpp | 14 +++++---
 catalogue/SQLiteSchemaComparer.cpp    | 23 ++++++++----
 catalogue/SQLiteSchemaComparer.hpp    |  6 ++--
 catalogue/SQLiteSchemaInserter.cpp    |  5 ++-
 catalogue/SQLiteSchemaInserter.hpp    |  4 +--
 catalogue/SchemaComparer.cpp          |  7 ++--
 catalogue/SchemaComparer.hpp          |  7 ++--
 catalogue/VerifySchemaCmd.cpp         | 21 ++++-------
 9 files changed, 85 insertions(+), 53 deletions(-)

diff --git a/catalogue/CatalogueMetadataGetter.cpp b/catalogue/CatalogueMetadataGetter.cpp
index 4af4ca45b8..61aa00de38 100644
--- a/catalogue/CatalogueMetadataGetter.cpp
+++ b/catalogue/CatalogueMetadataGetter.cpp
@@ -21,45 +21,72 @@
 namespace cta {
 namespace catalogue {
 
-CatalogueMetadataGetter::CatalogueMetadataGetter(cta::rdbms::ConnPool & connPool):m_connPool(connPool){}
+CatalogueMetadataGetter::CatalogueMetadataGetter(cta::rdbms::Conn& conn):m_conn(conn){}
+
+std::string CatalogueMetadataGetter::getCatalogueVersion(){
+  std::string schemaVersion;
+  const char *const sql =
+    "SELECT "
+      "CTA_CATALOGUE.SCHEMA_VERSION_MAJOR AS SCHEMA_VERSION_MAJOR,"
+      "CTA_CATALOGUE.SCHEMA_VERSION_MINOR AS SCHEMA_VERSION_MINOR "
+    "FROM "
+      "CTA_CATALOGUE";
+
+  auto stmt = m_conn.createStmt(sql);
+  auto rset = stmt.executeQuery();
+
+  if(rset.next()) {
+    schemaVersion += std::to_string(rset.columnUint64("SCHEMA_VERSION_MAJOR"));
+    schemaVersion += ".";
+    schemaVersion += std::to_string(rset.columnUint64("SCHEMA_VERSION_MINOR"));
+    return schemaVersion;
+  } else {
+    throw exception::Exception("SCHEMA_VERSION_MAJOR,SCHEMA_VERSION_MINOR not found in the CTA_CATALOGUE");
+  }
+}
 
 CatalogueMetadataGetter::~CatalogueMetadataGetter() {}
 
-SQLiteCatalogueMetadataGetter::SQLiteCatalogueMetadataGetter(cta::rdbms::ConnPool & connPool):CatalogueMetadataGetter(connPool){}
+SQLiteCatalogueMetadataGetter::SQLiteCatalogueMetadataGetter(cta::rdbms::Conn & conn):CatalogueMetadataGetter(conn){}
 SQLiteCatalogueMetadataGetter::~SQLiteCatalogueMetadataGetter(){}
 
 std::list<std::string> SQLiteCatalogueMetadataGetter::getIndexNames() {
-  rdbms::Conn connection = m_connPool.getConn();
-  std::list<std::string> indexNames = connection.getIndexNames();
-  connection.closeUnderlyingStmtsAndConn();
+  std::list<std::string> indexNames = m_conn.getIndexNames();
   indexNames.remove_if([](std::string& indexName){
     return ((indexName.find("sqlite_autoindex") != std::string::npos)); 
   });
   return indexNames;
 }
 
-OracleCatalogueMetadataGetter::OracleCatalogueMetadataGetter(cta::rdbms::ConnPool & connPool):CatalogueMetadataGetter(connPool){}
+std::list<std::string> SQLiteCatalogueMetadataGetter::getTableNames(){
+  return std::list<std::string>();
+}
+
+OracleCatalogueMetadataGetter::OracleCatalogueMetadataGetter(cta::rdbms::Conn & conn):CatalogueMetadataGetter(conn){}
 OracleCatalogueMetadataGetter::~OracleCatalogueMetadataGetter(){}
 
 std::list<std::string> OracleCatalogueMetadataGetter::getIndexNames() {
-  rdbms::Conn connection = m_connPool.getConn();
-  std::list<std::string> indexNames = connection.getIndexNames();
-  connection.closeUnderlyingStmtsAndConn();
+  std::list<std::string> indexNames = m_conn.getIndexNames();
   indexNames.remove_if([](std::string& indexName){
     return ((indexName.find("_UN") != std::string::npos) || (indexName.find("PK") != std::string::npos) || (indexName.find("_LLN") != std::string::npos)); 
   });
   return indexNames;
 }
 
+std::list<std::string> OracleCatalogueMetadataGetter::getTableNames() {
+  return std::list<std::string>();
+}
+
+
 
-CatalogueMetadataGetter * CatalogueMetadataGetterFactory::create(const rdbms::Login::DbType dbType, cta::rdbms::ConnPool & connPool) {
+CatalogueMetadataGetter * CatalogueMetadataGetterFactory::create(const rdbms::Login::DbType dbType, cta::rdbms::Conn & conn) {
   typedef rdbms::Login::DbType DbType;
   switch(dbType){
     case DbType::DBTYPE_IN_MEMORY:
     case DbType::DBTYPE_SQLITE:
-      return new SQLiteCatalogueMetadataGetter(connPool);
+      return new SQLiteCatalogueMetadataGetter(conn);
     case DbType::DBTYPE_ORACLE:
-      return new OracleCatalogueMetadataGetter(connPool);
+      return new OracleCatalogueMetadataGetter(conn);
     default:
       return nullptr;
   }
diff --git a/catalogue/CatalogueMetadataGetter.hpp b/catalogue/CatalogueMetadataGetter.hpp
index 714130a408..c84738021d 100644
--- a/catalogue/CatalogueMetadataGetter.hpp
+++ b/catalogue/CatalogueMetadataGetter.hpp
@@ -29,30 +29,34 @@ namespace catalogue {
 class CatalogueMetadataGetter {
 public:
   protected:
-    rdbms::ConnPool& m_connPool;
+    rdbms::Conn& m_conn;
   public:
-    CatalogueMetadataGetter(cta::rdbms::ConnPool & connPool);
+    CatalogueMetadataGetter(cta::rdbms::Conn & conn);
     virtual ~CatalogueMetadataGetter();
+    std::string getCatalogueVersion();
     virtual std::list<std::string> getIndexNames() = 0;
+    virtual std::list<std::string> getTableNames() = 0;
 };
 
 class SQLiteCatalogueMetadataGetter: public CatalogueMetadataGetter{
 public:
-  SQLiteCatalogueMetadataGetter(cta::rdbms::ConnPool & connPool);
+  SQLiteCatalogueMetadataGetter(cta::rdbms::Conn & conn);
   virtual ~SQLiteCatalogueMetadataGetter();
   std::list<std::string> getIndexNames() override;
+  std::list<std::string> getTableNames() override;
 };
 
 class OracleCatalogueMetadataGetter: public CatalogueMetadataGetter{
   public:
-  OracleCatalogueMetadataGetter(cta::rdbms::ConnPool & connPool);
+  OracleCatalogueMetadataGetter(cta::rdbms::Conn & conn);
   virtual ~OracleCatalogueMetadataGetter();
   std::list<std::string> getIndexNames() override;
+  std::list<std::string> getTableNames() override;
 };
 
 class CatalogueMetadataGetterFactory {
 public:
-  static CatalogueMetadataGetter* create(const rdbms::Login::DbType dbType, cta::rdbms::ConnPool & connPool);
+  static CatalogueMetadataGetter* create(const rdbms::Login::DbType dbType, cta::rdbms::Conn & conn);
 };
 
 }}
\ No newline at end of file
diff --git a/catalogue/SQLiteSchemaComparer.cpp b/catalogue/SQLiteSchemaComparer.cpp
index 3f386ff976..7629169db4 100644
--- a/catalogue/SQLiteSchemaComparer.cpp
+++ b/catalogue/SQLiteSchemaComparer.cpp
@@ -25,13 +25,13 @@
 namespace cta {
 namespace catalogue {
   
-SQLiteSchemaComparer::SQLiteSchemaComparer(const cta::rdbms::Login::DbType &catalogueDbType, const std::string &schemaVersion, rdbms::ConnPool &catalogueConnPool): SchemaComparer(catalogueDbType,schemaVersion,catalogueConnPool) {
+SQLiteSchemaComparer::SQLiteSchemaComparer(const cta::rdbms::Login::DbType &catalogueDbType, rdbms::Conn &catalogueConn): SchemaComparer(catalogueDbType,catalogueConn) {
   log::DummyLogger dl("dummy","dummy");
-  
   auto login = rdbms::Login::parseString("in_memory");
-  m_sqliteConnPool.reset(new rdbms::ConnPool(login,1));
-  m_catalogueMetadataGetter.reset(CatalogueMetadataGetterFactory::create(catalogueDbType,catalogueConnPool));
-  m_sqliteSchemaMetadataGetter.reset(new SQLiteCatalogueMetadataGetter(*m_sqliteConnPool));
+  rdbms::ConnPool connPool(login,1);
+  rdbms::Conn conn = connPool.getConn();
+  m_sqliteConn = std::move(conn);
+  m_sqliteSchemaMetadataGetter.reset(new SQLiteCatalogueMetadataGetter(m_sqliteConn));
 }
 
 SQLiteSchemaComparer::~SQLiteSchemaComparer() {
@@ -41,15 +41,26 @@ SchemaComparerResult SQLiteSchemaComparer::compare(){
   SchemaComparerResult res;
   insertSchemaInSQLite();
   res += compareIndexes();
+  res += compareTables();
   return res;
 }
 
 SchemaComparerResult SQLiteSchemaComparer::compareTables(){
+  std::list<std::string> catalogueTables = m_catalogueMetadataGetter->getTableNames();
+  std::list<std::string> schemaTables = m_sqliteSchemaMetadataGetter->getTableNames();
+  std::cout<<"catalogue tables = "<<std::endl;
+  for(auto& catalogueTable: catalogueTables){
+    std::cout<<catalogueTable<<std::endl;
+  }
+  std::cout<<"schema tables = "<<std::endl;
+  for(auto& schemaTable: schemaTables){
+    std::cout<<schemaTable<<std::endl;
+  }
   return SchemaComparerResult();
 }
 
 void SQLiteSchemaComparer::insertSchemaInSQLite() {
-  cta::catalogue::SQLiteSchemaInserter schemaInserter(m_schemaVersion,m_dbType,"/home/cedric/CTA/catalogue/",*m_sqliteConnPool);
+  cta::catalogue::SQLiteSchemaInserter schemaInserter(m_catalogueSchemaVersion,m_dbType,"/home/cedric/CTA/catalogue/",m_sqliteConn);
   schemaInserter.insert();
 }
 
diff --git a/catalogue/SQLiteSchemaComparer.hpp b/catalogue/SQLiteSchemaComparer.hpp
index f12b11ca77..85b20fc16c 100644
--- a/catalogue/SQLiteSchemaComparer.hpp
+++ b/catalogue/SQLiteSchemaComparer.hpp
@@ -18,15 +18,13 @@
 #pragma once
 
 #include "SchemaComparer.hpp"
-#include "SchemaCreatingSqliteCatalogue.hpp"
-#include "InMemoryCatalogue.hpp"
 
 namespace cta {
 namespace catalogue {
   
 class SQLiteSchemaComparer: public SchemaComparer {
 public:
-  SQLiteSchemaComparer(const cta::rdbms::Login::DbType &catalogueDbType, const std::string &schemaVersion,rdbms::ConnPool &catalogueConnPool);
+  SQLiteSchemaComparer(const cta::rdbms::Login::DbType &catalogueDbType, rdbms::Conn &catalogueConnPool);
   SchemaComparerResult compare() override;
   virtual ~SQLiteSchemaComparer();
   
@@ -34,7 +32,7 @@ private:
   void insertSchemaInSQLite();
   SchemaComparerResult compareIndexes();
   SchemaComparerResult compareTables() override;
-  std::unique_ptr<rdbms::ConnPool> m_sqliteConnPool;
+  rdbms::Conn m_sqliteConn;
   std::unique_ptr<SQLiteCatalogueMetadataGetter> m_sqliteSchemaMetadataGetter;  
 };
 
diff --git a/catalogue/SQLiteSchemaInserter.cpp b/catalogue/SQLiteSchemaInserter.cpp
index 9649634694..7abb48aa3c 100644
--- a/catalogue/SQLiteSchemaInserter.cpp
+++ b/catalogue/SQLiteSchemaInserter.cpp
@@ -27,7 +27,7 @@
 namespace cta {
 namespace catalogue {
   
-SQLiteSchemaInserter::SQLiteSchemaInserter(const std::string & schemaVersion, const cta::rdbms::Login::DbType &catalogueDbType, const std::string &allVersionsSchemaDirectory,rdbms::ConnPool &sqliteConnPool):m_schemaVersion(schemaVersion),m_dbType(catalogueDbType),m_allVersionSchemaDirectory(allVersionsSchemaDirectory), m_sqliteCatalogueConnPool(sqliteConnPool){}
+SQLiteSchemaInserter::SQLiteSchemaInserter(const std::string & schemaVersion, const cta::rdbms::Login::DbType &catalogueDbType, const std::string &allVersionsSchemaDirectory,rdbms::Conn &sqliteConn):m_schemaVersion(schemaVersion),m_dbType(catalogueDbType),m_allVersionSchemaDirectory(allVersionsSchemaDirectory), m_sqliteCatalogueConn(sqliteConn){}
 
 SQLiteSchemaInserter::~SQLiteSchemaInserter() {}
 
@@ -43,9 +43,8 @@ void SQLiteSchemaInserter::insert() {
 }
 
 void SQLiteSchemaInserter::executeStatements(const std::list<std::string> & stmts){
-  rdbms::Conn conn = m_sqliteCatalogueConnPool.getConn();
   for(auto& sqliteStatement: stmts){
-    auto stmt = conn.createStmt(sqliteStatement);
+    auto stmt = m_sqliteCatalogueConn.createStmt(sqliteStatement);
     stmt.executeNonQuery();
   }
 }
diff --git a/catalogue/SQLiteSchemaInserter.hpp b/catalogue/SQLiteSchemaInserter.hpp
index 3c837dbf6e..4d589b5919 100644
--- a/catalogue/SQLiteSchemaInserter.hpp
+++ b/catalogue/SQLiteSchemaInserter.hpp
@@ -25,7 +25,7 @@ namespace catalogue {
   
   class SQLiteSchemaInserter {
   public:
-    SQLiteSchemaInserter(const std::string & schemaVersion, const cta::rdbms::Login::DbType &catalogueDbType, const std::string &allVersionsSchemaDirectory,rdbms::ConnPool &sqliteConnPool);
+    SQLiteSchemaInserter(const std::string & schemaVersion, const cta::rdbms::Login::DbType &catalogueDbType, const std::string &allVersionsSchemaDirectory,rdbms::Conn &sqliteConn);
     void insert();    
     virtual ~SQLiteSchemaInserter();
   private:
@@ -34,7 +34,7 @@ namespace catalogue {
     std::string m_schemaVersion;
     cta::rdbms::Login::DbType m_dbType;
     std::string m_allVersionSchemaDirectory;
-    cta::rdbms::ConnPool & m_sqliteCatalogueConnPool;
+    cta::rdbms::Conn & m_sqliteCatalogueConn;
     std::string readSchemaFromFile();
     std::list<std::string> getAllStatementsFromSchema(const std::string &schema);
     std::string getDatabaseType();
diff --git a/catalogue/SchemaComparer.cpp b/catalogue/SchemaComparer.cpp
index f0f7f3e730..9df577da28 100644
--- a/catalogue/SchemaComparer.cpp
+++ b/catalogue/SchemaComparer.cpp
@@ -26,12 +26,13 @@
 
 namespace cta {
 namespace catalogue {
-SchemaComparer::SchemaComparer(const cta::rdbms::Login::DbType &dbType, const std::string &schemaVersion,rdbms::ConnPool &connPool): m_dbType(dbType),m_schemaVersion(schemaVersion),m_catalogueConnPool(connPool){
-  m_catalogueMetadataGetter.reset(CatalogueMetadataGetterFactory::create(dbType,m_catalogueConnPool));
+SchemaComparer::SchemaComparer(const cta::rdbms::Login::DbType &dbType, rdbms::Conn &conn): m_dbType(dbType),m_catalogueConn(conn){
+  m_catalogueMetadataGetter.reset(CatalogueMetadataGetterFactory::create(dbType,m_catalogueConn));
+  m_catalogueSchemaVersion = m_catalogueMetadataGetter->getCatalogueVersion();
 }
 
 std::string SchemaComparer::getCatalogueVersion(){
-  return m_schemaVersion;
+  return m_catalogueSchemaVersion;
 }
 
 SchemaComparer::~SchemaComparer() {
diff --git a/catalogue/SchemaComparer.hpp b/catalogue/SchemaComparer.hpp
index 8e631bf7af..805efe783a 100644
--- a/catalogue/SchemaComparer.hpp
+++ b/catalogue/SchemaComparer.hpp
@@ -33,15 +33,16 @@ namespace catalogue {
 
 class SchemaComparer {
 public:
-  SchemaComparer(const cta::rdbms::Login::DbType &catalogueDbType,const std::string &schemaVersion,cta::rdbms::ConnPool &connPool);
+  SchemaComparer(const cta::rdbms::Login::DbType &catalogueDbType,cta::rdbms::Conn &conn);
   virtual ~SchemaComparer();
   virtual SchemaComparerResult compare() = 0;
   std::string getCatalogueVersion();
 protected:
   const cta::rdbms::Login::DbType &m_dbType;
-  const std::string &m_schemaVersion;
-  cta::rdbms::ConnPool &m_catalogueConnPool;
+  std::string m_catalogueSchemaVersion;
+  cta::rdbms::Conn &m_catalogueConn;
   std::unique_ptr<cta::catalogue::CatalogueMetadataGetter> m_catalogueMetadataGetter;
+  
 private:
   virtual SchemaComparerResult compareTables() = 0;
   virtual SchemaComparerResult compareIndexes() = 0;
diff --git a/catalogue/VerifySchemaCmd.cpp b/catalogue/VerifySchemaCmd.cpp
index 8b71d569db..8cc02e7f86 100644
--- a/catalogue/VerifySchemaCmd.cpp
+++ b/catalogue/VerifySchemaCmd.cpp
@@ -63,7 +63,7 @@ int VerifySchemaCmd::exceptionThrowingMain(const int argc, char *const *const ar
   }
 
   auto login = rdbms::Login::parseFile(cmdLineArgs.dbConfigPath);
-  const uint64_t maxNbConns = 10;
+  const uint64_t maxNbConns = 1;
   rdbms::ConnPool connPool(login, maxNbConns);
   auto conn = connPool.getConn();
   
@@ -74,22 +74,13 @@ int VerifySchemaCmd::exceptionThrowingMain(const int argc, char *const *const ar
     return 1;
   }
   
-  log::DummyLogger dummyLog("dummy", "dummy");
-  const auto catalogueFactory = CatalogueFactoryFactory::create(dummyLog, login, maxNbConns, maxNbConns);
-  auto catalogue = catalogueFactory->create();
-  
-  //Get the version of the catalogue
-  std::map<std::string, uint64_t> schemaVersion = catalogue->getSchemaVersion();
-  uint64_t schemaVersionMajor = schemaVersion.at("SCHEMA_VERSION_MAJOR");
-  uint64_t schemaVersionMinor = schemaVersion.at("SCHEMA_VERSION_MINOR");
-  std::string schemaVersionStr = std::to_string(schemaVersionMajor)+"."+std::to_string(schemaVersionMinor);
-  
   std::unique_ptr<cta::catalogue::SchemaComparer> schemaComparer;
-  schemaComparer.reset(new cta::catalogue::SQLiteSchemaComparer(login.dbType,schemaVersionStr,connPool));
+  schemaComparer.reset(new cta::catalogue::SQLiteSchemaComparer(login.dbType,conn));
   cta::catalogue::SchemaComparerResult res = schemaComparer->compare();
   std::cout << "Schema version : " << schemaComparer->getCatalogueVersion() << std::endl;
   std::cout << "Status of the checking : " << cta::catalogue::SchemaComparerResult::StatusToString(res.getStatus()) << std::endl;
   res.printDiffs();
+  schemaComparer.release();
   /*std::unique_ptr<CatalogueSchema> schema;
   switch(login.dbType) {
   case rdbms::Login::DBTYPE_IN_MEMORY:
@@ -122,9 +113,9 @@ int VerifySchemaCmd::exceptionThrowingMain(const int argc, char *const *const ar
   }
   
   std::cerr << "Checking schema version..." << std::endl;
-  //log::DummyLogger dummyLog("dummy", "dummy");
-  //const auto catalogueFactory = CatalogueFactoryFactory::create(dummyLog, login, maxNbConns, maxNbConns);
-  //const auto catalogue = catalogueFactory->create();  
+  log::DummyLogger dummyLog("dummy", "dummy");
+  const auto catalogueFactory = CatalogueFactoryFactory::create(dummyLog, login, maxNbConns, maxNbConns);
+  const auto catalogue = catalogueFactory->create();  
   const auto schemaDbVersion = catalogue->getSchemaVersion();
   const auto schemaVersion = schema->getSchemaVersion(); 
   const VerifyStatus verifySchemaStatus = verifySchemaVersion(schemaVersion, schemaDbVersion);
-- 
GitLab