import java.sql.*;
import java.io.*;

public class Exmatrikulierer {
  // String, der die DB-Verbindung beschreibt.
  private static final String CONNECT_URL = "jdbc:oracle:oci8:@lsintern-db";
  
  public static void main(String[] argv) {
    // ------------------------------------------------------------
    // -- Variablen
    // ------------------------------------------------------------

    boolean fertig = false; // Flag, ob der Benutzer aufhören will
    String line = null;     // Aktuelle Eingabezeile
    int matr_nr = 0;        // Aktuelle Matrikelnummer
    BufferedReader in =     // Reader für Consoleneingabe
      new BufferedReader(new InputStreamReader(System.in));

    Connection conn = null; // Verbindung zu Oracle
    PreparedStatement sql_exmatrikuliere = null; // Anfrage zum Exmatrikulieren
    String name = null;     // user für Verbindung
    String passwd = null;   // passwd für Verbindung

    // ------------------------------------------------------------
    // -- Code
    // ------------------------------------------------------------

    System.out.println("Dieses Programm exmatrikuliert " + 
                       "Studenten anhand der Matrikelnummer.\n");

    // Benutzeridentifikation und Authentisierung
    try {
      System.out.println("Benutzername: (/ = \"identified externally\"):");
      name = in.readLine();
      if (!name.equals("/")) {
        System.out.println("Passwort:");
        passwd = in.readLine();
      } 
    }
    catch (IOException e) {
      System.out.println("Fehler beim Lesen der Eingabe: " + e);
      System.exit(-1);
    }
    
    // Initialisierung der Datenbankverbindung und der Anfrage
    try {
      System.out.println("Verbindungsaufbau zu: " + CONNECT_URL);
      Class.forName("oracle.jdbc.driver.OracleDriver");

      if (passwd == null)
        conn = DriverManager.getConnection(CONNECT_URL);
      else
        conn = DriverManager.getConnection(CONNECT_URL, name, passwd);

      conn.setAutoCommit(false); 

      sql_exmatrikuliere = 
        conn.prepareStatement("delete from studenten where matrnr = ?");
    }
    catch (Exception e) {
      System.err.println("Folgender Fehler ist bei der Initialisierung aufgetreten: " + e);
      System.exit(-1);
    }
    
    // Studenten exmatrikulieren
    while(!fertig) {
      // Matrikelnummer abfragen
      System.out.println("Matrikelnummer (0 zum Beenden):");
      try {
        line = in.readLine();
      }
      catch (IOException e) {
        System.out.println("Fehler beim Lesen der Eingabe: " + e);
        fertig = true;
        continue;
      }

      // Eingabe konvertieren
      try {
        matr_nr = Integer.parseInt(line);
      }
      catch(NumberFormatException nfe) {
        System.out.println("Eingabe ist keine Matrikelnummer!");
        continue;
      }

      // Will Benutzer aufhören?
      if(matr_nr == 0) {
        fertig = true;
        continue;
      }

      // Exmatrikulierung an Datenbank schicken
      try {
        sql_exmatrikuliere.setInt(1, matr_nr);
        int rows = sql_exmatrikuliere.executeUpdate();

        if (rows == 1)
          System.out.println("Student gelöscht.");
        else
          System.out.println("Kein Student mit dieser Matrikelnummer in der Datenbank!");
      }
      catch (SQLException e) {
        System.out.println("Fehler beim Ausführen der Anfrage: " + e);
        fertig = true;
        continue;
      }
    }

    // Aufräumen
    try {
      sql_exmatrikuliere.close();
      conn.close();
    } 
    catch (SQLException e) {
      System.out.println("Fehler beim Schliessen der DB-Verbindung: " + e);
    }
  }
}
