package biblio;

import java.sql.*;
import java.util.*;

/**
 * Questa classe mette a disposizione i metodi per effettuare interrogazioni
 * sulla base di dati.
 *
 */
public class DBMS {
    /** Inserire utente per la connessione alla base di dati.  */
    private String user = "";

    /** Password associata all'utente della base di dati. */
    private String passwd = "";

    /** URL per la connessione alla base di dati. &Egrave; formato dai
     * seguenti componenti:<br>
     * <protocollo>://<host del server>/<nome base di dati>.
     */
    private String url = "jdbc:postgresql://sqlserver.sci.univr.it/esercitazioni";

    /** Driver da utilizzare per la connessione e l'esecuzione delle query. */
    private String driver = "org.postgresql.Driver";
    
    /** Interrogazione SQL per ottenere tutti i generi di dischi presenti nella base di dati. */
    
	private String generiSql = "SELECT * FROM genere";

    /**
     * Costruttore della classe. Carica i driver da utilizzare per la
     * connessione alla base di dati.
     *
     * @throws ClassNotFoundException Eccezione generata nel caso in cui
     *         i driver per la connessione non siano trovati nel
     *         CLASSPATH.
     */
    public DBMS() throws ClassNotFoundException {
	Class.forName(driver);
    }

    /**
     * Questo metodo viene utilizzato per la creazione di un GenereBean in base al
     * contenuto della riga corrente del ResultSet.
     *
     * @param rs ResultSet da cui estrarre le informazioni per la creazione del
     *           GenereBean.
     *
     * @return GenereBean creato in base al contenuto della riga corrente del
     *         ResultSet.
     *
     * @throws SQLException Eccezione generata nel caso in cui la ricerca delle
     *                      informazioni nel ResultSet non sia corretta.
     */
    private GenereBean makeGenereBean(ResultSet rs) throws SQLException {
	GenereBean bean = new GenereBean();

	bean.setCodiceGenere(rs.getInt("codice_genere"));
	bean.setDescrizione(rs.getString("descrizione"));
	/*
	  IMPORTANTE!!!
	  
	  Nel caso in cui la colonna della tabella interrogata possa contenere
	  valori nulli DEVE essere verificata la presenza del valore e nel caso
	  in cui sia NULL si deve impostare il valore del campo relativo del bean
	  ad un valore di default.
	  
	  Per esempio: se la colonna descrizione della tabella genere potesse avere
	  valori nulli il codice completo sarebbe:

	  bean.setDescrizione(rs.getString("descrizione"));
	  if (rs.wasNull()) bean.setDescrizione("");
	 */

	return bean;
    }

    /**
     * Questo metodo permette di ottenere tutti i generi presenti nella tabella
     * GENERE.
     *
     * @return Oggetto Vector contenente una serie di GenereBean contenenti le
     *         informazioni relative.
     */
    public Vector getGeneri() {
	// Dichiarazione delle variabili
	Connection con = null;
	Statement stmt = null;
	ResultSet rs = null;
	Vector result = new Vector();

	try {
	    // Tentativo di connessione al database
	    con = DriverManager.getConnection(url, user, passwd);
	    // Connessione riuscita, ottengo l'oggetto per l'esecuzione
	    // dell'interrogazione.
	    stmt = con.createStatement();
	    // Eseguo l'interrogazione desiderata
	    rs = stmt.executeQuery(generiSql);
	    // Memorizzo il risultato dell'interrogazione nel Vector
	    while(rs.next())
		result.add(makeGenereBean(rs));
	} catch(SQLException sqle) {                /* Catturo le eventuali eccezioni! */
	    sqle.printStackTrace();
	} finally {                                 /* Alla fine chiudo la connessione. */
	    try {
		con.close();
	    } catch(SQLException sqle1) {
		sqle1.printStackTrace();
	    }
	}
	// Ritorno il Vector
	return result;
    }
}
