/*
 *Beispiel für die Verwendung von HSQLDB zur Erstellung und Bearbeitung von
 *Datenbanken. Die Dokumentation von HSQL findet sich unter:
 * http://hsqldb.org/web/hsqlDocsFrame.html
 *HSQL ist Bestandteil jeder OpenOffice.org 2.0 Distribution.
 *Der zum Betrieb der Datenbank nötige Treiber befindet sich im Archiv
 *hsqldb.jar im Ordner <OpenOfficeInstallationsverzeichnis>/program/classes
 */

import java.sql.*;
import java.util.*;

public class DatenbankManager {
	//wichtig ist hier das "file", sonst wird die Datenbank nicht gespeichert
	private static final String url = "jdbc:hsqldb:file:Datenbank/daten";
	private static final String treiber = "org.hsqldb.jdbcDriver";
	private static final Connection con;
	private static final Statement stmt;
	
	//static-Initialisierer
	/*
	 *So ist es möglich Code auszuführen, wenn die Klasse geladen wird.
	 *D. h. Es kann eine Verbindung zur Datenbank hergestellt werden ohne eine Instanz der Klasse
	 *zu erzeugen.
	 */
	static {
		try {
			//Mit der Datenbank verbinden
			Class.forName(treiber);
			con = DriverManager.getConnection(url, "sa","");
			stmt = con.createStatement();
			//Methode um herauszufinden ob Datenbank schon existiert.
			//Existiert sie nicht, wird sie angelegt.
			ResultSet rs = con.getMetaData().getTables(null, null, "Termine", null);
			if(!rs.next()) stmt.executeUpdate(
				"CREATE TABLE \"Termine\""+
				//Methode um Spalten  mit automatisch generierten Schlüssel zu erzeugen.
				"( NR   INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 40, INCREMENT BY 3) PRIMARY KEY,"+
				"  NAME VARCHAR(20) NOT NULL, "+
				"  UNIQUE (NAME))");
		}
		//Bisschen schmutziger Weg die Exceptions abzufangen.
		catch(Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	//private Konstruktor, verhindert das Anlegen von Instanzen dieser Klasse.
	private DatenbankManager(){}
	
	
	//Typische Methoden zum Arbeiten auf der Datenbank
	public static boolean executeStatement(String statement) {
		try {
			stmt.executeUpdate(statement);
		}
		catch(SQLException sqle) {
			sqle.printStackTrace();
			return false;
		}
		return true;
	}
	
	public static ResultSet executeQuery(String query) {
		try {
			return stmt.executeQuery(query);
		}
		
		catch(SQLException sqle) {
			sqle.printStackTrace();
			return null;			
		}
		
	}
	
	public static void close() throws SQLException{
		stmt.executeUpdate("SHUTDOWN");
		stmt.close();
		con.close();
	}
	
	
	public static void main (String[] args) 
	throws Exception {
		//Ein paar Daten in die Datenbank einfügen
		DatenbankManager.executeStatement("INSERT INTO \"Termine\" VALUES(NULL, 'Blim')");
		DatenbankManager.executeStatement("INSERT INTO \"Termine\" VALUES(NULL, 'Blam')");
		//Die NULL für die automatisch generierte erste Spalte eintragen  /\
		ResultSet rs = DatenbankManager.executeQuery("SELECT * FROM \"Termine\"");
		rs.next();
		System.out.println(rs.getString("Name"));
		rs.next();
		System.out.println(rs.getInt("Nr"));
		
		//und wieder aufräumen
		DatenbankManager.close();
	}	
}