query.java

import java.awt.*;         // Le classi per il disegno
import java.applet.Applet; // La superclasse
import java.sql.*;

public class query extends Applet {
  TextField expr;
  Button cerca;    // Fa partire il test
  TextArea textArea; // Display dei risultati
  // Stringhe di configurazione, lette dalla pagina HTML
  String server;   // URL del server
  String database; // nome del database
  String user;     // utrnte con cui connettersi
  String password; // password dell'utente (se presente)
  String driver;   // driver da caricare

  public void init () { // Metodo chiamato all'avvio dell'applet
    // Legge i paramentri dal tag <Applet> (per rendere flessibile l'applet)
    server = getParameter("server");
    database = getParameter("database");
    user = getParameter("user");
    password = getParameter("password");
    driver = getParameter("driver");
    // Gestisce il default dei parametriquery.java
    if (server == null) {
      server="localhst";
    }
    if (database == null) {
      database="test";
    }
    if (user == null) {
      user="www-data";
    }
    if (password == null) {
      password="";
    }
    if (driver == null) {
      driver="org.postgresql.Driver";
    }

    setBackground (new Color(0,0,128));     // Sfondo applet
    setForeground (new Color(255,255,136));  // Scritte applet
    setLayout (new BorderLayout ()); // Layout con le cinque posizioni

    Panel np = new Panel ();           // Un pannello per contenere label e campo
    np.setLayout  (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
    np.add (new Label ("Nome da cercare"));
    expr = new TextField (40);
    np.add (expr); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
    add ("North", np); // Metto il pannello con label e campo in alto

    textArea = new TextArea(11, 80); // Display (11 righe di 80 caratteri)
    textArea.setEditable(false);     // Il display non deve essere modificabile
    add ("Center",textArea);          // Aggiungo il display a in centro

    Panel sp = new Panel ();           // Un pannello per centrare il bottone
    sp.setLayout  (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
    cerca = new Button ("Cerca");
    sp.add (cerca); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
        
    add ("South",sp); // Metto il pannello con il bottone a sud dell'applet
  }

  // Piccolo metodo di utilita' per gestire gli errori:
  // - stampa il messaggio m
  // - stampa il codice di errore dell'Exception
  void printException (String m, Exception e) {
      textArea.setText (m + "\n");
      textArea.appendText (e.toString ());
      textArea.appendText ("\n");
  }

  // Carica la driver da utilizzare (parametro 'driver') ed
  // apre una connesione al database 'db', con l'utente 'user'
  // e la password 'pwd'
  // Ritorna la connessione creata
  Connection Conn (String db, String user, String pwd, String driver) {
    Connection c = null;
    String dbUrl;
    try {
      Class.forName(driver);
    } catch (ClassNotFoundException e) {
      printException ("Non trovo la driver del database", e);
      return null;
    }
    dbUrl = "jdbc:postgresql:" + db;
    try {
      c = DriverManager.getConnection(dbUrl, user, pwd);
    } catch (SQLException e) {
      printException ("Non riesco a connettermi con il database " + db,e);
      return null;
    }

    textArea.setText ("Connesso con il database " + db);
    return c;
  }

  // Esegue una query usando la stringa di ricerca passata per parametro
  // Estrae le righe (tuple) dal risultato ed i valori dalle tuple
  void queryTable (Connection conn, String espressione) {
    textArea.setText ("");
    try {
      Statement dbst = conn.createStatement();
      ResultSet rs;
      // Questa volta esegue una 'executeQuery' che ritorna i valori
      // nel 'ResultSet'.
      if (espressione.compareTo ("") != 0) {
        rs = dbst.executeQuery("select * from agenda where nome~'" + espressione + "';");
      } else {
        rs = dbst.executeQuery("select * from agenda;");
      }
      if(rs!=null) {
        // Adesso traversiamo l'insieme dei risultati, stampandoli.
        // Dobbiamo chiamare .next() per caricare ogni riga
        while(rs.next()) {
	  String a = rs.getString(1); // Recupera la colonna 'nome'
	  int b = rs.getInt(2);       // Recupera la colonna 'cellulare'
	  textArea.appendText (a + " : " + b + "\n");
        }
        rs.close();	// Occorre sempre chiudere quando abbiamo finito
      } else {	// La query non ha ritornato risultati
        textArea.appendText  ("Nessun record nella tabella 'agenda'\n");
      }
      dbst.close ();       // Occorre sempre chiudere quando abbiamo finito
      conn.close ();             // chiude la connessione
    } catch (SQLException e) {
      printException ("Non riesco a estrarre i dati dalla tabella 'agenda'",e);
      return;
    }
  }

  // Esegue la query
  void doQuery () {
  Connection conn;
  String espressione = expr.getText ();
    // Crea la connessione al nostro database
    conn = Conn ("//" + server + "/" + database, user, password, driver);
    if (conn != null) {
      queryTable (conn, espressione);  // esegue la query
    }
  }

  // Gestione del bottone
  public boolean action(Event event, Object arg) {
    if (event.target == cerca) {
      doQuery ();             // ed esegue la query
    }
    return true;
  }
	
}