package javacodebook.jdbc.types;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class TypedResults {

    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection con =
                DriverManager.getConnection(
                    "jdbc:postgresql:test",
                    "postgres",
                    "postgres");

            Statement statement = con.createStatement();
            ResultSet result =
                statement.executeQuery("SELECT * FROM employees");
            ResultSetMetaData data = result.getMetaData();
            result.next();

            int columns = data.getColumnCount();

            System.out.println("ResulSet consists of 4 columns:");
            for (int i = 1; i <= columns; i++) {
                System.out.println("Column no. " + i + ":");
                System.out.println(
                    "Name  :" + data.getColumnName(i));
                System.out.println(
                    "Class :" + data.getColumnClassName(i));
                System.out.println(
                    "Type  :" + data.getColumnTypeName(i));

                // Typspezifische Auswertung der Ergebnisse über
                // getColumnClassName
                if (data
                    .getColumnClassName(i)
                    .equals(String.class.getName())) {
                    System.out.println("This is a String");
                    StringBuffer buffer =
                        new StringBuffer(result.getString(i));
                    System.out.println(
                        "example output: "
                            + buffer.reverse().toString());
                }
                if (data
                    .getColumnClassName(i)
                    .equals(java.sql.Date.class.getName())) {
                    System.out.println("This is a java.sql.Date");
                    Date date = result.getDate(i);
                    DateFormat format =
                        SimpleDateFormat.getDateInstance();
                    System.out.println(
                        "example ouput: " + format.format(date));
                }

            }

            // Alternativ kann man mit getObject dem JDBC-Treiber
            // die Wahl des entsprechenden Objekttyps überlassen
            // und danach per instanceof die Ergebnisse je nach
            // Typ behandeln
            if (result.next()) {
                for (int i = 1; i <= columns; i++) {
                    Object o = result.getObject(i);
                    if (o == null)
                        continue;
                    System.out.println("Column no. " + i + ":");
                    System.out.println("Class :" + o.getClass());
                    if (o instanceof String) {
                        System.out.println("This is a String");
                        StringBuffer buffer =
                            new StringBuffer((String) o);
                        System.out.println(
                            "example output: "
                                + buffer.reverse().toString());
                    }
                    if (o instanceof java.sql.Date) {
                        System.out.println(
                            "This is a java.sql.Date");
                        Date date = (java.sql.Date) o;
                        DateFormat format =
                            SimpleDateFormat.getDateInstance();
                        System.out.println(
                            "example output: "
                                + format.format(date));
                    }

                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
