package javacodebook.jdbc.dbinfo;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class DatabaseInfos {

    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection con =
                DriverManager.getConnection(
                    "jdbc:postgresql:test",
                    "postgres",
                    "postgres");

            // Zuerst brauchen wir die Referenz auf die Metadaten
            // der Datenbank
            DatabaseMetaData data = con.getMetaData();

            // Dann können mit den Methoden von DatabaseMetaData
            // alle möglichen Informationen abgefragt werden
            System.out.println(
                "Database product name   : "
                    + data.getDatabaseProductName());
            System.out.println(
                "Database product version: "
                    + data.getDatabaseProductVersion());
            System.out.println(
                "JDBC driver             : "
                    + data.getDriverName());
            System.out.println(
                "JDBC driver version     : "
                    + data.getDriverVersion());

            // Ueber getCatalogs kann man dann die verfügbaren
            // Datenbanken und Tabellen erfragen.

            // Zuerst mal alle Datenbanken
            System.out.println("Available Catalogs:");
            ResultSet result = data.getCatalogs();
            while (result.next()) {
                System.out.println("-" + result.getString(1));
            }

            result.beforeFirst();

            while (result.next()) {
                // Dann alle Tabellen in der jeweiligen Datenbank
                System.out.println(
                    "Tables in Catalog '"
                        + result.getString(1)
                        + "'");
                ResultSet resultTables =
                    data.getTables(
                        result.getString(1),
                        null,
                        null,
                        null);
                while (resultTables.next()) {
                    // Letzendlich alle Felder in der jeweiligen
                    // Tabelle
                    System.out.println(
                        "    Table '"
                            + resultTables.getString("TABLE_NAME")
                            + "'");
                    ResultSet resultCols =
                        data.getColumns(
                            result.getString(1),
                            null,
                            resultTables.getString("TABLE_NAME"),
                            null);
                    while (resultCols.next()) {
                        System.out.println(
                            "        "
                                + resultCols.getString(
                                    "COLUMN_NAME")
                                + ", "
                                + resultCols.getString("TYPE_NAME"));
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
