Newsgroup: it.comp.java
Titolo: Archivi senza DataBase

Vorrei provare a scrivere un programmino Java che lavori con degli "archivi"
locali. Dovrebbe salvare dati (tipo tabelle) in un file e poi rileggerli, ma
non voglio usare un db esterno (con jdbc ho fatto le mie prove e va bene, ma
non voglio la complessità di un db).
Potreste gentilmente indirizzarmi verso qualche meccanismo che possa usare
direttamente da Java senza supporti esterni (e soprattutto non a pagamento)?
L'ideale sarebbe scoprire di poter usare direttamente files XML...
Grazie in anticipo a chi voglia suggerirmi la strada da (intra)prendere...
:)

Io uso Hypersonic SQL, un db Java embedded che si basa su file system. E' discretamente
efficiente e mooolto facile da usare, ed e' possibile nascondere la complessita' del
database pur mantenendo il database :-D (lo so, sembra un gioco di parole ma il succo e'
quello).
In pratica hai la semplicita' di un file (4 file, in realta' :-D) con la versatilita' di
un database, e con la possibilita' quasi gratis in futuro di passare a un "vero" DB.
Ecco ad esempio lo scheletro di un mio database, un archivio per le pagine di un Wiki:
public WikiArchive
{
    public WikiArchive(File aDirectory) 
    {
        ....
    }
    public String getPageContents(String pageName) 
    {
        ....
    }
    public boolean setPageContents(String pageName, String contents) 
    {
        ....
    }
    ....
}
Lo stesso ho fatto per un sistema di controllo versione, dove all'interno di HSQL ci tengo
le varie versioni dei sorgenti del progetto.
L'ultima versione rilasciata la trovi qui:
http://hsqldb.sourceforge.net/
(se vuoi la versione "storica invece la trovi su 
http://hsql.sourceforge.net/index.html
)
Fammi sapere cosa ne pensi.
Ciao,
    Bruno.
 


|
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://bbruno.fasturl.it
|
| 
http://members.xoom.it/bbruno
| 
http://digilander.iol.it/bbossola
|

 :)
Invece, per usare direttamente Xml potresti usare le classi che trovi sul sito
ufficiale di Java ( 
http://java.sun.com
 ), in particolare JAXP
( 
http://java.sun.com/xml/jaxp/
 ) di cui puoi trovare un ottimo tutorial sul
medesimo sito con qualche esempio per essere subito operativo.
Spero di esserti stato d'aiuto.
Ciao.
Luca!!!

 Luca!!!
Sicuramente sei stato d'aiuto, e ti ringrazio! Mi sa che dovrò fare un
saltino al link indicato. L'unico piccolo rammarico è che, ogni volta che
viene in mente di fare qualche cosa, per impadronirsi degli strumenti
necessari tocca leggere e studiare malloppi enormi di informazioni (quel che
ho in mente lo ho già fatto in VB, ma è una piattaforma che sto cercando di
abbandonare sui miei progetti per passare a Java. Purtroppo il tempo di
upload non è affatto vicino ad epsilon... :) )


Grazie dell'informazione. Credo si avvicini molto a quello che avevo in
mente. Proverò sicuramente a dare un'occhiata.
Già che ci sono: cosa intendi esattamente con "embedded"? Integrato con java
a livello di codice, o magari un Jar già pronto e funzionante?
Lo so, la cosa migliore è cliccare sul link che mi hai dato e leggere un pò!
Credo che seguirò il mio consiglio... ;)
Thanks Again!

  |
|  Delete WORLD from address, to send |
+-------------------------------------+


:-D
Ciao,
    Bruno.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Beh, o usi il DatabaseManager ("run DatabaseManager" dalla directory /demo) 
oppure ti armi di "CREATE TABLE..." lanciate da statement java. 
Domani se ho tempo posto un esempio :-)


 Domani se ho tempo posto un esempio :-)
Sarebbe grandioso.   :-)
Magari con inserimenti, select, modifiche, ...    ;-)



Uhm.... mi viene un dubbio: conosci JDBC? E' un insieme di API, standard, disponibili sin
dalla versione 1.02, che consentono l'accesso a database relazionali: se non le conosci ti
consiglio tempestivamente di darci un'occhiata :-)
Comunque, tornando all'esempio, ecco quello che si intendeva fare, un archivio delle
pagine di un Wiki realizzato con Hypersonic SQL:
public WikiArchive
{
    public WikiArchive(File aDirectory) 
    {
        ....
    }
    public String getPageContents(String pageName) 
        throws SQLException
    {
        ....
    }
    public void setPageContents(String userId, String pageName, String pageContents) 
        throws SQLException
    {
        ....
    }
}
Ed ecco l'implementazione, funzionante e completa di metodi privati. Ho cercato di essere
un po' vario, i piu' esperti spero mi perdoneranno eventuali manchevolezze dovute pero'
alla volonta' di mostrare modi diversi di fare le cose, lasciando poi decidere a chi
decidera' di sviluppare :-D
import java.sql.*;
import java.io.File;
public class WikiArchive
{
    private static final String USER = "sa";
    private static final String NAME = "wiki";
    private static final String PASS = "";
    private String itsDatabaseURL;
    public WikiArchive(File dir) throws SQLException
    {
    	File theDatabaseFile = new File(dir, NAME);
    	itsDatabaseURL = "jdbc:HypersonicSQL:"+theDatabaseFile.getAbsolutePath();
 
    	rebuildIfNecessary();
    }
    public String getPageContents(String pageName) throws SQLException
    {
    	String resultContents = null;
    	Connection conn = this.getConnection();
    	Statement statement = null;
    	ResultSet result = null;
 
    	try
    	{
    		statement = conn.createStatement();
    		String sql ="SELECT contents FROM pages WHERE LCASE(name)
='"+pageName.toLowerCase()+"'";
    		result = statement.executeQuery(sql);
 
    		if(result.next())
    			resultContents = result.getString(1);
 
    	}
    	finally
    	{
    		if(result != null) 
    			result.close();
    		if(statement!= null) 
    			statement.close();
    		conn.close();	
    	}
 
    	return resultContents;
    }
    public void setPageContents(String userId, String pageName, String pageContents)
throws SQLException
    {
    	Date aDate = new java.sql.Date(System.currentTimeMillis());
    	Connection conn = getConnection();
    	PreparedStatement statement  = null;
 
    	try
    	{
    		String currentPageName = getPageCurrentName(conn, pageName);
 
    		if (currentPageName != null)
    		{
    			String sql ="UPDATE pages SET contents=?, last_update=?, userid=?
WHERE name=?";
    			statement = conn.prepareStatement(sql);
    			statement.setString(1, pageContents);
    			statement.setDate(2, aDate);
    			statement.setString(3, userId);
    			statement.setString(4, currentPageName);			
    		}
    		else
    		{
    			String sql ="INSERT INTO pages (name, contents, last_update,
userid) VALUES (?,?,?,?)";
    			statement = conn.prepareStatement(sql);
    			statement.setString(1, pageName);
    			statement.setString(2, pageContents);
    			statement.setDate(3, aDate);
    			statement.setString(4, userId);			
    		}
 
    		int rownum = statement.executeUpdate();
 
    		if (rownum != 1)
    			throw new SQLException("No pages were updated!");
    	}
    	finally
    	{
    		if (statement != null) statement.close();
    		conn.close();
    	}
    }
    private String getPageCurrentName(Connection conn, String pageName) throws
SQLException
    {
    	String currentPageName = null;
 
    	Statement statement = conn.createStatement();
    	try
    	{
    		String sql ="SELECT name FROM pages WHERE
LCASE(name)='"+pageName.toLowerCase()+"'";
 
    		ResultSet result = statement.executeQuery(sql);
    		try
    		{
    			if (result.next())
    				currentPageName = result.getString(1);
    		}
    		finally
    		{
    			result.close();
    		}
    	}
    	finally
    	{
    		if (statement != null) statement.close();
    	}
 
    	return currentPageName;
    }
    private Connection getConnection() throws SQLException
    {
    	try {Class.forName("org.hsql.jdbcDriver");}
    	catch (ClassNotFoundException ex)
    	{
    		throw new SQLException("SQL driver not found!");
    	}
 
    	Connection conn = DriverManager.getConnection(itsDatabaseURL, USER, PASS);
    	return conn;
    }
    private void rebuildIfNecessary() throws SQLException
    {
    	boolean rebuildNeeded = false;
 
    	Connection conn = getConnection();
    	Statement statement  = null;
    	ResultSet result  = null;
 
    	try
    	{
    		statement = conn.createStatement();
    		result = statement.executeQuery("select name, contents, last_update,
userid from pages");
    	}
    	catch (SQLException ex)
    	{
    		rebuildNeeded = true;
    	}
    	finally
    	{
    		if (result != null) result.close();
    		if (statement != null) statement.close();
    		conn.close();
    	}
 
    	if (rebuildNeeded)
    		rebuild();
 
    }
    private void rebuild() throws SQLException
    {
    	Connection conn = getConnection();
    	Statement statement  = null;
 
    	try
    	{
    		statement = conn.createStatement();
 
    		try {statement.executeUpdate("DROP TABLE pages");} catch (SQLException ex)
{}
 
    		String sql ="CREATE TABLE pages	(name VARCHAR NOT NULL PRIMARY
KEY,contents VARCHAR, last_update DATE, userid VARCHAR)";
    		statement.executeUpdate(sql);
    		statement.close();
    		statement=null;
    	}
    	finally
    	{
   		if (statement != null) statement.close();
    		conn.close();
    	}
    }
    /**
     * main() di test
     */
    public static void main(String[] args) 
    {
    	final String pageName = "Indice";
 
    	try
    	{
    		// si aggancia all'archivio	
    		File dir = new File(System.getProperty("user.home"));
    		WikiArchive archive = new WikiArchive(dir);
 
    		// aggiorna la pagina 
    		archive.setPageContents("Pippo", pageName, "Questo e' il contenuto della
pagina in data "+new java.util.Date());
 
    		// stampa il contenuto attuale della pagina
    		String contents = archive.getPageContents(pageName);
    		System.out.println("Contenuto della pagina "+pageName+": '"+contents+"'");
    	}
    	catch (SQLException ex)
    	{
    		ex.printStackTrace();
    	}
    }
}
Spero questo esempio vi aiuti ad approcciare questo simpatico motore per database scritto
in Java!
Ciao,
    Bruno.


     try {Class.forName("org.hsql.jdbcDriver");}
Ho notato 2 errorini sul nome del DBMS, roba da poco.  :-)
    itsDatabaseURL = "jdbc:hsqldb:"+theDatabaseFile.getAbsolutePath();
    try {Class.forName("org.hsqldb.jdbcDriver");}
Per il resto ho fatto un pò di prove e tutto funziona a meraviglia!!!
E' un DBMS molto interessante.
Grazie



No, non ci sono errori, e' solo che l'esempio funziona con la versione 1.43 di Hypersonic
SQL (il progetto originale, ormai chiuso), tu stai utilizzando (giustamente) HSQLDB che e'
il nuovo progetto e che usa, fra l'altro, un driver e un URL di connessione diverso.


 il nuovo progetto e che usa, fra l'altro, un driver e un URL di
connessione diverso.
Ah, ok. Come non detto, scusa.
Comunque ribadisco che è una figata!!
