diff --git a/test/tap/metadata/MetadataExtractionTest.java b/test/tap/metadata/MetadataExtractionTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b3b03200eefa809d307bbc8c0813376f8dd393bf --- /dev/null +++ b/test/tap/metadata/MetadataExtractionTest.java @@ -0,0 +1,139 @@ +package tap.metadata; + +/* + * This file is part of TAPLibrary. + * + * TAPLibrary is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * TAPLibrary is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with TAPLibrary. If not, see <http://www.gnu.org/licenses/>. + * + * Copyright 2014 - Astronomisches Rechen Institute (ARI) + */ + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * @author Grégory Mantelet (ARI) - gmantele@ari.uni-heidelberg.de + * @version 1.1 (04/2014) + */ +public class MetadataExtractionTest { + + public static void main(String[] args) throws Throwable{ + MetadataExtractionTest extractor = new MetadataExtractionTest(); + try{ + extractor.connect(); + extractor.printTableMetadata("gums"); + }finally{ + extractor.close(); + } + } + + private Connection connection = null; + private Statement statement = null; + + public void connect(){ + try{ + Class.forName("org.postgresql.Driver"); + connection = DriverManager.getConnection("jdbc:postgresql:gmantele", "gmantele", "pwd"); + statement = connection.createStatement(); + System.out.println("[OK] DB connection successfully established !"); + }catch(ClassNotFoundException notFoundException){ + notFoundException.printStackTrace(); + System.err.println("[ERROR] Connection error !"); + }catch(SQLException sqlException){ + sqlException.printStackTrace(); + System.err.println("[ERROR] Connection error !"); + } + } + + public ResultSet query(String requet){ + ResultSet resultat = null; + try{ + resultat = statement.executeQuery(requet); + }catch(SQLException e){ + e.printStackTrace(); + System.out.println("Erreur dans la requĂȘte: " + requet); + } + return resultat; + + } + + public TAPSchema printTableMetadata(final String table){ + try{ + + DatabaseMetaData dbMeta = connection.getMetaData(); + TAPSchema tapSchema = null; + TAPTable tapTable = null; + + // Extract Table metadata (schema, table, type): + ResultSet rs = dbMeta.getTables(null, null, table, null); + rs.last(); + if (rs.getRow() == 0) + System.err.println("[ERROR] No found table for \"" + table + "\" !"); + else if (rs.getRow() > 1){ + rs.first(); + System.err.println("[ERROR] More than one match for \"" + table + "\":"); + while(rs.next()) + System.err.println(rs.getString(2) + "." + rs.getString(3) + " : " + rs.getString(4)); + }else{ + rs.first(); + tapSchema = new TAPSchema(rs.getString(2)); + tapTable = new TAPTable(rs.getString(3), rs.getString(4)); + tapSchema.addTable(tapTable); + System.out.println("[OK] 1 table FOUND ! => " + tapTable + " : " + tapTable.getType()); + } + + // Extract all columns metadata (type, precision, scale): + rs = dbMeta.getColumns(null, tapSchema.getDBName(), tapTable.getDBName(), null); + String type; + while(rs.next()){ + type = rs.getString(6); + if (type.endsWith("char") || type.equals("numeric")){ + type += "(" + rs.getInt(7); + if (type.startsWith("numeric")) + type += "," + rs.getInt(9); + type += ")"; + } + System.out.println(" * " + rs.getString(4) + " : " + type); + } + + // Extract all indexed columns: + rs = dbMeta.getIndexInfo(null, tapSchema.getDBName(), tapTable.getDBName(), false, true); + while(rs.next()){ + System.out.println(" # " + rs.getString(6) + " : " + rs.getShort(7) + " (unique ? " + (!rs.getBoolean(4)) + ") -> " + rs.getString(9) + " => " + rs.getInt(11) + " unique values in the index ; " + rs.getInt(12) + " pages"); + } + + return tapSchema; + + }catch(SQLException e){ + e.printStackTrace(); + return null; + } + } + + public void close(){ + try{ + connection.close(); + statement.close(); + System.out.println("[OK] Connection closed !"); + }catch(SQLException e){ + e.printStackTrace(); + System.out.println("[ERROR] Connection CAN NOT be closed !"); + } + } + +}