package javacodebook.jdbc.moving;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class MoveThroughResultSet {

    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");

            // Einfaches Durchzählen der Datensätze mit einem
            // Counter
            int counter = 0;

            System.out.println("Iterating by ResultSet.next()");
            while (result.next()) {
                counter++;
                System.out.println(
                    "browsing through row " + result.getRow());
            }
            System.out.println(
                "ResulSet contains "
                    + counter
                    + " rows / cursor now at row "
                    + result.getRow()
                    + "(getRow())/");

            // Ist das ResultSet vom Typ "forward_only", kann man
            // jeden Datensatz nur einmal auswählen
            if (statement.getResultSetType()
                == ResultSet.TYPE_FORWARD_ONLY) {
                System.out.println(
                    "You may have a Exception soon /"
                        + " Type of ResultSet is 'forward_only'");
            }

            // Mit absolute kann man ein bestimmte Reihe im
            // ResultSet auswählen
            System.out.println(
                "Iterating by ResultSet.absolute()");
            for (int i = 1; i <= counter; i++) {
                result.absolute(i);
                System.out.println(
                    "browsing through row " + result.getRow());
            }

            // Versuchen wir mal rückwaerts durch das ResultSet
            // zu iterieren...nicht alle JDBC-Treiber
            // unterstützen dieses selten genutzte Feature
            try {
                System.out.println("Reversing fetch direction");
                result.setFetchDirection(ResultSet.FETCH_REVERSE);
                // afterLast spult ans Ende des ResultSet
                result.afterLast();
                while (result.next()) {
                    System.out.println("Row " + result.getRow());
                }

            } catch (Exception e) {
                System.out.println(
                    "ResultSet.setFetchDirection() not "
                        + "supported by JDBC driver");
            }

            // Jetzt wollen wir nur durch jeden zweiten Datensatz
            // iterieren
            System.out.println(
                "Setting fetch size = 2, Iterating by next");
            try {
                result.setFetchSize(2);
                // beforeFirst spult das ResultSet an den Anfang 
                result.beforeFirst();
                while (result.next()) {
                    System.out.println(
                        "browsing through row " + result.getRow());
                }
            } catch (Exception e) {
                System.out.println(
                    "ResultSet.setFetchSize() "
                        + "not supported by JDBC driver");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
