From a3d54f6ee410b1baa45345d8787bc659d4234419 Mon Sep 17 00:00:00 2001
From: Cedric CAFFY <cedric.caffy@cern.ch>
Date: Fri, 20 Dec 2019 12:11:18 +0100
Subject: [PATCH] Added support for MySQL and Postgres to the
 cta-catalogue-schema-verify tool

---
 catalogue/CatalogueMetadataGetter.cpp | 62 ++++++++++++++++++++++++---
 catalogue/CatalogueMetadataGetter.hpp | 24 +++++++++--
 catalogue/SchemaChecker.cpp           |  2 +-
 rdbms/wrapper/OcciConn.cpp            |  2 +-
 rdbms/wrapper/SqliteConn.cpp          |  5 +++
 5 files changed, 83 insertions(+), 12 deletions(-)

diff --git a/catalogue/CatalogueMetadataGetter.cpp b/catalogue/CatalogueMetadataGetter.cpp
index e294eee562..8aeef19753 100644
--- a/catalogue/CatalogueMetadataGetter.cpp
+++ b/catalogue/CatalogueMetadataGetter.cpp
@@ -54,25 +54,37 @@ std::string CatalogueMetadataGetter::getCatalogueVersion(){
   }
 }
 
+std::list<std::string> CatalogueMetadataGetter::getTableNames(){
+  return m_conn.getTableNames();
+}
+
+std::list<std::string> CatalogueMetadataGetter::getIndexNames(){
+  return m_conn.getIndexNames();
+}
+
+std::map<std::string,std::string> CatalogueMetadataGetter::getColumns(const std::string& tableName){
+  return m_conn.getColumns(tableName);
+}
+
 CatalogueMetadataGetter::~CatalogueMetadataGetter() {}
 
 SQLiteCatalogueMetadataGetter::SQLiteCatalogueMetadataGetter(cta::rdbms::Conn & conn):CatalogueMetadataGetter(conn){}
 SQLiteCatalogueMetadataGetter::~SQLiteCatalogueMetadataGetter(){}
 
 std::list<std::string> SQLiteCatalogueMetadataGetter::getIndexNames() {
-  std::list<std::string> indexNames = m_conn.getIndexNames();
+  std::list<std::string> indexNames = CatalogueMetadataGetter::getIndexNames();
   removeObjectNameContaining(indexNames,{"sqlite_autoindex"});
   return indexNames;
 }
 
 std::list<std::string> SQLiteCatalogueMetadataGetter::getTableNames(){
-  std::list<std::string> tableNames = m_conn.getTableNames();
+  std::list<std::string> tableNames = CatalogueMetadataGetter::getTableNames();
   removeObjectNameContaining(tableNames,{"sqlite_sequence"});
   return tableNames;
 }
 
 std::map<std::string, std::string> SQLiteCatalogueMetadataGetter::getColumns(const std::string& tableName){
-  return m_conn.getColumns(tableName);
+  return CatalogueMetadataGetter::getColumns(tableName);
 }
 
 
@@ -80,18 +92,50 @@ OracleCatalogueMetadataGetter::OracleCatalogueMetadataGetter(cta::rdbms::Conn &
 OracleCatalogueMetadataGetter::~OracleCatalogueMetadataGetter(){}
 
 std::list<std::string> OracleCatalogueMetadataGetter::getIndexNames() {
-  std::list<std::string> indexNames = m_conn.getIndexNames();
+  std::list<std::string> indexNames = CatalogueMetadataGetter::getIndexNames();
   removeObjectNameContaining(indexNames,{"_UN","PK","_LLN"});
   return indexNames;
 }
 
 std::list<std::string> OracleCatalogueMetadataGetter::getTableNames() {
-  std::list<std::string> tableNames = m_conn.getTableNames();
+  std::list<std::string> tableNames = CatalogueMetadataGetter::getTableNames();
   return tableNames;
 }
 
 std::map<std::string, std::string> OracleCatalogueMetadataGetter::getColumns(const std::string& tableName){
-  return m_conn.getColumns(tableName);
+  return CatalogueMetadataGetter::getColumns(tableName);
+}
+
+MySQLCatalogueMetadataGetter::MySQLCatalogueMetadataGetter(cta::rdbms::Conn& conn):CatalogueMetadataGetter(conn) {}
+MySQLCatalogueMetadataGetter::~MySQLCatalogueMetadataGetter(){}
+
+std::list<std::string> MySQLCatalogueMetadataGetter::getIndexNames() {
+  std::list<std::string> indexNames = CatalogueMetadataGetter::getIndexNames();
+  //removeObjectNameContaining(indexNames,{"User","Grantor", "_ID", "_NAME"});
+  return indexNames;
+}
+
+std::list<std::string> MySQLCatalogueMetadataGetter::getTableNames() {
+  return CatalogueMetadataGetter::getTableNames();
+}
+
+std::map<std::string, std::string> MySQLCatalogueMetadataGetter::getColumns(const std::string& tableName){
+  return CatalogueMetadataGetter::getColumns(tableName);
+}
+
+PostgresCatalogueMetadataGetter::PostgresCatalogueMetadataGetter(cta::rdbms::Conn& conn):CatalogueMetadataGetter(conn) {}
+PostgresCatalogueMetadataGetter::~PostgresCatalogueMetadataGetter(){}
+
+std::list<std::string> PostgresCatalogueMetadataGetter::getIndexNames() {
+  return CatalogueMetadataGetter::getIndexNames();
+}
+
+std::list<std::string> PostgresCatalogueMetadataGetter::getTableNames() {
+  return CatalogueMetadataGetter::getTableNames();
+}
+
+std::map<std::string, std::string> PostgresCatalogueMetadataGetter::getColumns(const std::string& tableName){
+  return CatalogueMetadataGetter::getColumns(tableName);
 }
 
 CatalogueMetadataGetter * CatalogueMetadataGetterFactory::create(const rdbms::Login::DbType dbType, cta::rdbms::Conn & conn) {
@@ -102,8 +146,12 @@ CatalogueMetadataGetter * CatalogueMetadataGetterFactory::create(const rdbms::Lo
       return new SQLiteCatalogueMetadataGetter(conn);
     case DbType::DBTYPE_ORACLE:
       return new OracleCatalogueMetadataGetter(conn);
+    case DbType::DBTYPE_MYSQL:
+      return new MySQLCatalogueMetadataGetter(conn);
+    case DbType::DBTYPE_POSTGRESQL:
+      return new PostgresCatalogueMetadataGetter(conn);
     default:
-      return nullptr;
+      throw cta::exception::Exception("In CatalogueMetadataGetterFactory::create(), can't get CatalogueMetadataGetter for dbType "+rdbms::Login::dbTypeToString(dbType));
   }
 }
 
diff --git a/catalogue/CatalogueMetadataGetter.hpp b/catalogue/CatalogueMetadataGetter.hpp
index 29e109536a..ae38d5f9c4 100644
--- a/catalogue/CatalogueMetadataGetter.hpp
+++ b/catalogue/CatalogueMetadataGetter.hpp
@@ -34,9 +34,9 @@ class CatalogueMetadataGetter {
     CatalogueMetadataGetter(cta::rdbms::Conn & conn);
     virtual ~CatalogueMetadataGetter();
     std::string getCatalogueVersion();
-    virtual std::list<std::string> getIndexNames() = 0;
-    virtual std::list<std::string> getTableNames() = 0;
-    virtual std::map<std::string,std::string> getColumns(const std::string& tableName) = 0;
+    virtual std::list<std::string> getIndexNames();
+    virtual std::list<std::string> getTableNames();
+    virtual std::map<std::string,std::string> getColumns(const std::string& tableName);
 };
 
 class SQLiteCatalogueMetadataGetter: public CatalogueMetadataGetter{
@@ -57,6 +57,24 @@ class OracleCatalogueMetadataGetter: public CatalogueMetadataGetter{
   std::map<std::string,std::string> getColumns(const std::string& tableName) override;
 };
 
+class MySQLCatalogueMetadataGetter: public CatalogueMetadataGetter{
+  public:
+    MySQLCatalogueMetadataGetter(cta::rdbms::Conn &conn);
+    virtual ~MySQLCatalogueMetadataGetter();
+    std::list<std::string> getIndexNames() override;
+    std::list<std::string> getTableNames() override;
+    std::map<std::string,std::string> getColumns(const std::string& tableName) override;
+};
+
+class PostgresCatalogueMetadataGetter: public CatalogueMetadataGetter{
+  public:
+    PostgresCatalogueMetadataGetter(cta::rdbms::Conn &conn);
+    virtual ~PostgresCatalogueMetadataGetter();
+    std::list<std::string> getIndexNames() override;
+    std::list<std::string> getTableNames() override;
+    std::map<std::string,std::string> getColumns(const std::string& tableName) override;
+};
+
 class CatalogueMetadataGetterFactory {
 public:
   static CatalogueMetadataGetter* create(const rdbms::Login::DbType dbType, cta::rdbms::Conn & conn);
diff --git a/catalogue/SchemaChecker.cpp b/catalogue/SchemaChecker.cpp
index 755db61387..e7944f5918 100644
--- a/catalogue/SchemaChecker.cpp
+++ b/catalogue/SchemaChecker.cpp
@@ -49,7 +49,7 @@ SchemaChecker::Status SchemaChecker::compareSchema(){
 void SchemaChecker::checkNoParallelTables(){
   std::list<std::string> parallelTables = m_catalogueConn.getParallelTableNames();
   for(auto& table:parallelTables) {
-    std::cout << "WARNING : " << table << " is set as PARALLEL" << std::endl;
+    std::cout << "WARNING : TABLE " << table << " is set as PARALLEL" << std::endl;
   }
 }
 
diff --git a/rdbms/wrapper/OcciConn.cpp b/rdbms/wrapper/OcciConn.cpp
index ef48c1c2f7..114b8618a0 100644
--- a/rdbms/wrapper/OcciConn.cpp
+++ b/rdbms/wrapper/OcciConn.cpp
@@ -296,7 +296,7 @@ std::list<std::string> OcciConn::getParallelTableNames() {
       "FROM "
         "USER_TABLES "
       "WHERE "
-        "DEGREE NOT LIKE '%1%' "
+        "TRIM(DEGREE) NOT LIKE '1' "
       "ORDER BY "
         "TABLE_NAME";
     auto stmt = createStmt(sql);
diff --git a/rdbms/wrapper/SqliteConn.cpp b/rdbms/wrapper/SqliteConn.cpp
index 3033088405..d4bd8f7454 100644
--- a/rdbms/wrapper/SqliteConn.cpp
+++ b/rdbms/wrapper/SqliteConn.cpp
@@ -250,6 +250,11 @@ std::map<std::string, std::string> SqliteConn::getColumns(const std::string &tab
     "VARCHAR|"
     "VARCHAR2|"
     "BLOB|"
+    "BIGINT|"
+    "SMALLINT|"
+    "INT|"
+    "TINYINT|"
+    "VARBINARY|"
     "RAW";
     
     auto stmt = createStmt(sql);
-- 
GitLab