//-----------------------------------------------------------------------------
// CorrJDBC8.java
// (ne contient pas correction TD 7)
// !!! AF : a adapter cause corr TD 7 modifiee, mais pas encore ici !!!
//-----------------------------------------------------------------------------

import java.io.*;
import java.sql.*;

class CorrJDBC8 {

    // reprendre celles TD 7 :
    //    static Connection connexion() 
    //    static void deconnexion(Connection c) 

    static void traitement1Proc(Connection c) 
	throws SQLException {
	System.out.println("ici traitement1Proc");

	// parametres :
	System.out.print("entrez le nom du client: ");
	String nom = lireClavier();
	System.out.print("entrez l'age : ");
	int age = Integer.parseInt(lireClavier());

	CallableStatement cs = c.prepareCall("{? = call traitement1(?,?)}");
	cs.registerOutParameter(1, Types.INTEGER);
	cs.setString(2, nom);
	cs.setInt(3, age);
	cs.execute();
	int idc = cs.getInt(1);
	cs.close();

	// retours :
	System.out.println("identifiant client : "+idc);
    }

    static void traitement2Proc(Connection c) 
	throws SQLException {
	System.out.println("ici traitement2Proc");
	
	// parametres :
	System.out.print("entrez l'identifiant client : ");
	int idc = Integer.parseInt(lireClavier());
	System.out.print("entrez la ville : ");
	String ville = lireClavier();
	System.out.print("entrez le jour : ");
	int jour = Integer.parseInt(lireClavier());

	CallableStatement cs = c.prepareCall("{call traitement2(?,?,?,?,?,?)}");
	cs.registerOutParameter(4, Types.INTEGER);
	cs.registerOutParameter(5, Types.INTEGER);
	cs.registerOutParameter(6, Types.VARCHAR);

	cs.setInt(1, idc);
	cs.setString(2, ville);
	cs.setInt(3, jour);
	cs.execute();

	int idv=cs.getInt(4);
	int ids=cs.getInt(5);
	String activite=cs.getString(6);
	cs.close();

	// retours :	
	System.out.println("identifiant village : "+idv);
	System.out.println("identifiant sejour : "+ids);
	System.out.println("activite : "+activite);
    }

    static void traitement2(Connection c) 
	throws SQLException {
	System.out.println("ici traitement2");

	// parametres :
	System.out.print("entrez l'identifiant client : ");
	int idc = Integer.parseInt(lireClavier());
	System.out.print("entrez la ville : ");
	String ville = lireClavier();
	System.out.print("entrez le jour : ");
	int jour = Integer.parseInt(lireClavier());

	// initialisation valeurs retour pour cas ou pas de village :
	int idv=-1;
	int ids=-1;
	String activite="neant";

	int prix;
	String texte = "select idv, activite, prix from village"
                       +" where destination = '"+ville+"' order by prix";
	System.out.println(texte);

	Statement s = c.createStatement();
	ResultSet r = s.executeQuery(texte);
	if (r.next()) {
	    idv = r.getInt(1); // affectation valeur de retour 
	    activite = r.getString(2); // affectation valeur de retour 
	    prix = r.getInt(3); 
	    r.close();
	    
	    // achat sejour :
	    texte = "insert into sejour values(seq_sejour.nextval,"+idc+","
                    +idv+","+jour+")";
	    System.out.println(texte);
	    s.executeUpdate(texte); 
	    texte = "update client set avoir=avoir-"+prix+" where idc="+idc; 
	    System.out.println(texte);
	    s.executeUpdate(texte);
	    
	    // affectation valeur de retour :
	    texte = "select seq_sejour.currval from dual";
	    // ideal serait select into au lieu curseur, comme dans traitement1
	    r = s.executeQuery(texte);
	    r.next();
	    ids = r.getInt(1); 
	    r.close();
	}
	
	// retours :	
	System.out.println("identifiant village : "+idv);
	System.out.println("identifiant sejour : "+ids);
	System.out.println("activite : "+activite);
    }

    static void verificationCompil(Connection c) 
	throws SQLException {
	System.out.println("ici verificationCompil");
	System.out.println("traitement3 + erreurs");

	// parametres :
	System.out.print("entrez le jour limite : ");
	int jour = Integer.parseInt(lireClavier());

	Statement s = c.createStatement();
	//	String texte = "delete sejour where jour<"+jour; // correct

	// erreur 1 : syntaxe ; compile correctement, mais erreur execution
	String texte = "delete where sejour jour<"+jour;

	// erreur 2 : semantique ; drop table sejour + delete correct ci-dessus,
	// puis compilation : compile correctement, mais erreur execution

        System.out.println(texte);
	int nb = s.executeUpdate(texte);
	s.close();

	// retours :
	System.out.println("nombre de sejours detruits : "+nb);
    }

    static void SQLDyn(Connection c) 
	throws SQLException {
	System.out.println("ici SQLDyn");

	// a tester avec par exemple : create table t(a int); puis entrer : t

	// parametres :
	System.out.print("entrez un nom de table : ");

	Statement s = c.createStatement();
	String texteOrdre = "drop table ";
	texteOrdre += lireClavier();
	s.executeUpdate(texteOrdre);
	s.close();

	// Commentaire : JDBC ne sait faire que du SQL dynamique. 
	// Comme en SQL dynamique en PL/SQL, il construit des ordres par 
        // concatenation de chaines, puis les execute (et de meme pour
        // utilisation de variables in et out. 
    }

    // reprendre celle TD 7 :
    //    static String lireClavier() {

    public static void main(String[] args) 
	throws SQLException, ClassNotFoundException {
	
	Connection c = connexion();
	while (true) {
	    System.out.println("-------------------------------");
	    System.out.println("Bienvenue dans le menu CorrJDBC8");
	    System.out.println("2 : traitement2");
	    System.out.println("5 : traitement1Proc"); 
	    System.out.println("6 : traitement2Proc"); 
	    System.out.println("7 : verificationCompil"); 
	    System.out.println("8 : SQLDyn"); 
	    System.out.println("-1 : deconnexion");
	    System.out.println("-2 : terminer");
	    System.out.print("Entrez votre choix : ");
	    int n = Integer.parseInt(lireClavier());
	    switch (n) {
	    case 2 : traitement2(c); break;
	    case 5 : traitement1Proc(c); break;
	    case 6 : traitement2Proc(c); break;
	    case 7 : verificationCompil(c); break;
	    case 8 : SQLDyn(c); break;
	    case -1 : deconnexion(c); break;
	    case -2 : return;
	    }
	}
    }
}

//-----------------------------------------------------------------------------
