From 7d5765999d2f8c875dccab238dde6218ab552472 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <zorba@oats.inaf.it>
Date: Wed, 7 Mar 2018 16:37:28 +0100
Subject: [PATCH] Added support for Postgres foreign tables

---
 README.md                                     |  6 +++++
 .../ia2/tsm/datalayer/DBBrokerTemplate.java   |  4 +---
 .../tsm/datalayer/mysql/MySQLDBBroker.java    |  7 +-----
 .../tsm/datalayer/pgsql/PostgresDBBroker.java | 23 +++++++++++--------
 4 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/README.md b/README.md
index ce5ddfb..fbf2cab 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,12 @@ To do this: download the jar files listed in the following
 credits section and run a couple of `mvn install:install-file`
 commands based upond the dependencies description in the _TASMAN-webapp_ _pom.xml_ file.
 
+## Developers info
+
+For debugging TASMAN-embedded:
+
+    java -jar -Xdebug -agentlib:jdwp=transport=dt_socket,address=9999,server=y,suspend=n /opt/tasman/tasman-embedded.jar 2000
+
 ## Credits
 
 TAP_SCHEMA Manager web application uses the following VO libraries:
diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java
index e4e4634..e8f58b1 100644
--- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java
+++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java
@@ -794,14 +794,12 @@ public abstract class DBBrokerTemplate implements DBBroker {
         return allSchemas;
     }
 
-    protected abstract String getAllTablesNamesQuery(String schemaName);
-
     /**
      * {@inheritDoc}
      */
     @Override
     public List<String> getAllTablesNames(String schemaName) throws SQLException {
-        String query = getAllTablesNamesQuery(schemaName);
+        String query = getSchemaTablesQuery(schemaName);
         LOG.debug("Executing query: {}", query);
         List<String> allTables = getAllItemsNames(query);
         LOG.debug("{} tables found", allTables.size());
diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java
index a27550d..001e76c 100644
--- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java
+++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java
@@ -45,7 +45,7 @@ import org.slf4j.LoggerFactory;
 
 /**
  * MySQL implementation of a {@link it.inaf.ia2.tsm.datalayer.DBBroker}.
- * 
+ *
  * @author Sonia Zorba {@literal <zorba at oats.inaf.it>}
  */
 public class MySQLDBBroker extends DBBrokerTemplate {
@@ -67,11 +67,6 @@ public class MySQLDBBroker extends DBBrokerTemplate {
         return "SHOW DATABASES";
     }
 
-    @Override
-    protected String getAllTablesNamesQuery(String schemaName) {
-        return "SHOW TABLES FROM " + escape(schemaName);
-    }
-
     @Override
     protected String getColumnNamesQuery(String schemaName, String tableName) {
         return String.format("SHOW COLUMNS FROM %s.%s", escape(schemaName), escape(tableName));
diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java
index 286ec90..e0ff274 100644
--- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java
+++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java
@@ -191,7 +191,16 @@ public class PostgresDBBroker extends DBBrokerTemplate {
 
     @Override
     protected String getSchemaTablesQuery(String schemaName) {
-        return String.format("SELECT tablename FROM pg_catalog.pg_tables where schemaname = '%s'", schemaName);
+        StringBuilder sb = new StringBuilder();
+        sb.append("SELECT tablename FROM pg_catalog.pg_tables where schemaname = '%s'\n");
+        // Select also foreign tables:
+        sb.append("UNION SELECT c.relname FROM\n");
+        sb.append("pg_catalog.pg_foreign_table f\n");
+        sb.append("JOIN pg_catalog.pg_class c ON f.ftrelid = c.relfilenode\n");
+        sb.append("JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid\n");
+        sb.append("WHERE n.nspname = '%s'\n");
+
+        return String.format(sb.toString(), schemaName, schemaName);
     }
 
     /**
@@ -219,19 +228,18 @@ public class PostgresDBBroker extends DBBrokerTemplate {
 
         StringBuilder querySb = new StringBuilder();
 
-        String tableNameOid = "('\"' || t.schemaname || '\".\"' || t.tablename || '\"')::regclass::oid";
+        String tableNameOid = String.format("('\"%s\".\"%s\"')::regclass::oid", schemaName, tableSimpleName);
 
         querySb.append("SELECT c.column_name, c.data_type, pg_catalog.format_type(a.atttypid, a.atttypmod), r.contype AS column_type, c.character_maximum_length, c.numeric_precision, a.attndims AS arraydim\n");
         querySb.append("FROM information_schema.columns c\n");
-        querySb.append("JOIN pg_catalog.pg_tables t ON c.table_schema = t.schemaname AND c.table_name = t.tablename\n");
         querySb.append("LEFT JOIN pg_catalog.pg_constraint r ON c.ordinal_position = ANY(r.conkey) AND r.conrelid = ");
         querySb.append(tableNameOid);
         querySb.append("\nLEFT JOIN pg_catalog.pg_attribute a ON a.attrelid = ");
         querySb.append(tableNameOid);
         querySb.append(" and a.attname = c.column_name\n");
-        querySb.append("WHERE t.schemaname = '");
+        querySb.append("WHERE c.table_schema = '");
         querySb.append(schemaName);
-        querySb.append("' AND t.tablename = '");
+        querySb.append("' AND c.table_name = '");
         querySb.append(tableSimpleName);
         querySb.append("'");
 
@@ -467,11 +475,6 @@ public class PostgresDBBroker extends DBBrokerTemplate {
         return "SELECT schema_name FROM information_schema.schemata";
     }
 
-    @Override
-    protected String getAllTablesNamesQuery(String schemaName) {
-        return String.format("SELECT tablename FROM pg_catalog.pg_tables where schemaname = '%s'", schemaName);
-    }
-
     /**
      * {@inheritDoc}
      */
-- 
GitLab