giovedì 19 novembre 2009

SqlTool

Ho scoperto di recente che HSQLDB possiede un piccolo tool, chiamato SqlTool, con cui è possibile connettersi ad un qualsiasi database e inviare comandi e script SQL da linea di comando.
Già questo ne fa uno strumento fondamentale, visto che esistono database che non offrono tool per l'invio di script SQL da shell.
Ma la vera forza è la possibilità di utilizzarlo dall'interno dei propri programmi.
Immaginate un applicativo che la prima volta che viene lanciato crea il suo database senza bisogno di intervento, o la possibilità di applicare patch al db dopo l'installazione di una nuova versione.
L'utilizzo è veramente semplice. Di seguito riporto un esempio:


String url = "jdbc:hsqldb:file:/java/provehsql/provedb;shutdown=true";
String user = "sa";
String pwd = "";
String sql = IOUtils.toString(Prova.class.getResourceAsStream("script.sql"));
SqlTool.objectMain(new String[] {
"--inlineRc",
"URL=" + url + ",USER=" + user + ",PASSWORD=" + pwd,
"--sql",
sql
});


Come si può notare ho caricato il contenuto di uno script file in una string (utilizzando Apache IOUtils) per poi passarlo al metodo objectMain() di SqlTool insieme all'url e alle credenziali per la connessione al DB.
Il metodo accetta un array di stringhe analogo a quanto farebbe il metodo main per i parametri della riga di comando.
L'unico reale impedimento che ho riscontrato è che non è possibile passare una password non vuota. Se l'utente del database ha una password impostata il metodo si ferma per leggerla dallo standard input, cosa che vanifica ogni tentativo di automatizzazione.