//-----------------------------------------------------------------------------
// CorrJDBC7.java 
//-----------------------------------------------------------------------------

import java.io.*;
import java.sql.*;

class CorrJDBC7 {

    static Connection connexion(String login, String password, 
				String serveur, String base) 
	throws SQLException, ClassNotFoundException {
	System.out.println("ici connexion");

	Connection c = DriverManager.getConnection(
            "jdbc:oracle:thin:"+login+"/"+password+"@"+serveur+":1521:"+base); 
	return c;
    }

    static void deconnexion(Connection c) 
	throws SQLException {
	System.out.println("ici deconnexion");
	c.close();
    }

    static void traitement3(Connection c) 
	throws SQLException {
	System.out.println("ici traitement3");

	// parametres :
	int jour = 
	    Integer.parseInt(lireClavier("Parametre: entrez le jour limite : "));

	// construction texte ordre :
        String texte = "delete sejour where jour<"+jour;
        System.out.println(texte);

	// acces serveur :
	Statement stmt = c.createStatement();
	int nb = stmt.executeUpdate(texte);
	stmt.close();

	// retours :
	System.out.println("Retour : nombre de sejours detruits : "+nb);
    }

    static void consultationSejoursClient(Connection c) 
	throws SQLException {
	System.out.println("ici consultationSejoursClient");

	// parametres :
	System.out.print("entrez l'identifiant client : ");
	int idc = Integer.parseInt(lireClavier());

	// construction texte ordre :
        String texte = "select ids, idc, idv, jour from sejour where idc = ?";
        System.out.println(texte);

	// acces serveur :
	PreparedStatement p = c.prepareStatement(texte);
	p.setInt(1, idc);
	ResultSet r = p.executeQuery();
	while (r.next())
	    System.out.println(r.getInt(1)+", "+r.getInt(2)+", "+r.getInt(3)
			       +", "+r.getInt(4));
	r.close();
	p.close();
    }

    static void traitement1(Connection c) 
	throws SQLException {
	System.out.println("ici traitement1");

	// parametres :
	System.out.print("entrez le nom du client: ");
	String nom = lireClavier();
	System.out.print("entrez l'age : ");
	int age = Integer.parseInt(lireClavier());

        String texte = "select seq_client.nextval from dual";
        System.out.println(texte);
	Statement s = c.createStatement();
	ResultSet r = s.executeQuery(texte);
	r.next();
	int idc = r.getInt(1); 
	r.close();
	// ideal serait un select into au lieu d'un curseur puisqu'il y a 
	// exactement une valeur de retour

        texte = "insert into client(idc, nom, age) values(?, ?, ?)";
        System.out.println(texte);

	PreparedStatement p = c.prepareStatement(texte);
	// rem : Statement serait justifie aussi car un seul appel
	p.setInt(1, idc);
	p.setString(2, nom);
	p.setInt(3, age);
	p.executeUpdate();
	p.close();

	// retours :
	System.out.println("identifiant client : "+idc);
    }

    static void traitement1Simplifie(Connection c) 
	throws SQLException {
	System.out.println("ici traitement1");

	// parametres :
	String nom = lireClavier("Parametre : entrez le nom du client: ");
	int age = Integer.parseInt(lireClavier("entrez l'age : "));

	// construction texte ordre :
        String texte = 
            "insert into client(idc, nom, age) values(seq_client.nextval, '"
            +nom+"', "+age+")";
        System.out.println(texte);

	// acces serveur :
	Statement s = c.createStatement();
	s.executeUpdate(texte);
	s.close();

    }

    static String lireClavier(String message) {
	// Dans cette fonction l'exception est catchee pour ne pas avoir a la 
        // gerer dans le main, et donc mieux voir les exceptions BD. 
	try {
	    System.out.print(message);
	    BufferedReader clavier =
		new BufferedReader(new InputStreamReader(System.in));
	    return clavier.readLine();
	} catch (Exception e) {
	    return "erreur dans fonction lireClavier";
	}
    }

    public static void main(String[] args) 
	throws SQLException, ClassNotFoundException {

	// remarque : une seule fois dans programme (donc pas dans connnexion) :
	Class.forName("oracle.jdbc.driver.OracleDriver"); 

	Connection c = connexion("waller_a", "AQWzsx34", "servora", "dbinfo"); 
	while (true) {
	    System.out.println("-------------------------------");
	    System.out.println("Bienvenue dans le menu CorrJDBC");
	    System.out.println("1 : traitement1");
	    System.out.println("3 : traitement3");
	    System.out.println("9 : deconnexion");
	    System.out.println("0 : terminer");
	    int n = Integer.parseInt(lireClavier("Entrez votre choix : "));
	    switch (n) {
	    case 1 : traitement1Simplifie(c); break;
	    case 3 : traitement3(c); break;
	    case 9 : deconnexion(c); break;
	    case 0 : return;
	    }
	}
    }
}

//-----------------------------------------------------------------------------
/*
traitement 3 : 
select * from sejour;

traitement 1 :
select * from client;
 */
//-----------------------------------------------------------------------------
