/*
 * Beispielimplementierung 
 * zu Aufgabe 4.26
 * Datenbanksysteme - Eine Einführung
 * 
 * Kurzbeschreibung:
 * - Aufbau einer JDBC-Verbindung zu einer Datenbank mit der
 *   Beispielausprägung der Universitätsverwaltung
 * - Erstellen einer temporären Tabelle, in der die IDs der
 *   Vorgängervorlesung gehalten werden
 * - Löschen der Vorlesungen-Tupel, die in der temporären Tabelle
 *   eingetragen sind.
 *   
 * Anmerkung:
 * - Zum Testen Verbindungsdaten ändern
 * - Löschen kann ggf. scheitern, wenn Integritätsbedingungen des 
 *   Datenbankschemas dadurch verletzt würden
 */

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Predecessors {
private static String driver  = "...";
private static String conURL  = "...";
private static String user    = "...";
private static String pwd     = "...";

  /**
   * @param args
   *          die Vorlesungsnummer, deren Vorgängervorlesungen gelöscht werden
   *          sollen
   */
  public static void main(String[] args) throws SQLException {
    if (args.length != 1) {
      System.out.println("Bitte geben Sie eine Vorlesungsnummer ein");
      System.exit(0);
    }
    Connection conn = null;
    Statement tmpStmt = null;
    PreparedStatement stmt = null;
    try {
      // Aufbau der Datenbankverbindung
      Class.forName(driver);
      conn = DriverManager.getConnection(conURL, user, pwd);

      tmpStmt = conn.createStatement();
      tmpStmt.execute("create table temp (todel integer)");
      stmt = conn.prepareStatement("insert into temp "
          + "(select Vorgänger from voraussetzen " 
          + "where Nachfolger = ?)");

      int vorlNr = Integer.parseInt(args[0]);

      stmt.setInt(1, vorlNr);
      stmt.execute();
      int oldcount = 0;
      int newcount = 0;

      // Füllen der temporären Tabelle
      do {
        oldcount = newcount;
        tmpStmt.execute("insert into temp ( select v.Vorgänger "
            + "from temp t, voraussetzen v " 
            + "where t.todel = v.Nachfolger "
            + " and v.Vorgänger not in(select * from temp))");
        ResultSet r = tmpStmt.executeQuery("select count(*) from temp ");
        r.next();
        newcount = r.getInt(1);
        r.close();
      } while (oldcount < newcount);

      // Löschen der Einträge und der temporären Tabelle
      tmpStmt.execute("delete from Vorlesungen "
          + "where VorlNr in (select * from temp)");
      tmpStmt.execute("drop table temp");

    } catch (Exception e) {
      e.printStackTrace();
    }
    // Verbindungsabbau
    if (tmpStmt != null)
      tmpStmt.close();
    if (stmt != null)
      stmt.close();
    if (conn != null)
      conn.close();
  }
}
