package javacodebook.jdbc.clobs;

import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class CLOBExample {

    // Hier der lange String, der in der Datenbank gespeichert 
    // werden soll.
    // Hier ein Ausschnitt aus den (bisher unveröffentlichten)
    // Teilen des Manuskripts von Caesars "De bello Gallico"
    public static final String poem =
        "Gallia est divisa in partes tres. Omnia est sub rhena,"
            + " altera nominatur lutetia. Hominem ex Gallia semper"
            + " per illis vocantur verba grava, nihil tenebrae nisi"
            + " romae respectant. Miles romanem de ordinarii multum"
            + " vino bebendi quam in Gallia sunt et gallicas"
            + " molesterent. Altera factum horribilis est pluvium"
            + " quasi semper ad aqua permeat per multitudinis"
            + " aquaeductiis in domi nos.";

    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection con =
                DriverManager.getConnection(
                    "jdbc:postgresql:test",
                    "postgres",
                    "postgres");

            // Zuerst einmal die Datenbank sauber machen
            con.createStatement().executeUpdate(
                "DELETE FROM poems");

            // Das PreparedStatement, mit dem gleich der String
            // poem auf dreierlei Art in die Datenbank geschrieben
            // wird
            PreparedStatement statement =
                con.prepareStatement(
                    "INSERT INTO poems(name,author,poem) "
                        + "VALUES(?,?,?)");

            // StringReader erlaubt einen einfachen java.io.Reader auf
            // eines Strings
            StringReader in = new StringReader(poem);

            // Erster Versuch über die Methode setCharacterStream
            statement.setString(
                1,
                "De bello Gallico via CharacterStream");
            statement.setString(2, "Caesor");
            statement.setCharacterStream(3, in, poem.length());
            statement.execute();

            // Zweiter Versuch über die naheliegende Methode
            // setString 
            statement.setString(
                1,
                "De bello Gallico via setString");
            statement.setString(2, "Caesor");
            statement.setString(3, poem);
            statement.execute();

            // Dritter und letzter Versuch über ein Array
            // von Bytes
            statement.setString(
                1,
                "De bello Gallico via setBytes");
            statement.setString(2, "Caesor");
            statement.setBytes(3, poem.getBytes());
            statement.execute();

            // Hier prüfen wir dann, was in der Datenbank
            // angekommen ist:
            ResultSet result =
                con.createStatement().executeQuery(
                    "SELECT name,author,poem FROM poems");
            while (result.next()) {
                System.out.println(
                    "Name:   " + result.getString(1));
                System.out.println(
                    "Author: " + result.getString(2));
                System.out.println(
                    "Poem:   " + result.getString(3));
            }

            // Die Datenbank wieder säubern
            con.createStatement().executeUpdate(
                "DELETE FROM poems");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
