Index: topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java diff -u topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java:1.9 topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java:1.10 --- topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java:1.9 Wed Aug 3 16:17:10 2005 +++ topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java Thu Aug 4 15:55:45 2005 @@ -23,10 +23,10 @@ * Created: 20 juillet 2005 15:25:06 CEST * * @author Benjamin POUSSIN - * @version $Revision: 1.9 $ + * @version $Revision: 1.10 $ * - * Last update: $Date: 2005/08/03 16:17:10 $ - * by : $Author: thimel $ + * Last update: $Date: 2005/08/04 15:55:45 $ + * by : $Author: dessard $ */ package org.codelutin.topia.persistence; @@ -37,7 +37,6 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.UnsupportedEncodingException; -import java.lang.NoSuchMethodException; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; @@ -46,13 +45,11 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; +import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.Map; -import java.util.Properties; + import org.apache.commons.beanutils.MethodUtils; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.DriverManagerConnectionFactory; @@ -106,6 +103,7 @@ static private Properties SQL_MYSQL = new Properties(SQL_DEFAULT); static private Properties SQL_MCKOI = new Properties(SQL_DEFAULT); static private Properties SQL_ORACLE = new Properties(SQL_DEFAULT); + static private Properties SQL_DERBY = new Properties(SQL_DEFAULT); // byte[] postgresql bytea, mysql LONGBLOB, mckoi LONGVARBINARY (voirJAVA_OBJECT) // string postgresql text, mysql text, mckoi text @@ -143,50 +141,50 @@ static { SQL_DEFAULT.put(SQL_TABLE_EXISTS, - "SELECT count(*) FROM management where id='' AND longdate=0;"); + "SELECT count(*) FROM management where id='' AND longdate=0"); SQL_DEFAULT.put(SQL_CREATE_TABLE_MANAGEMENT, - "CREATE TABLE management (id text, longdate bigint, class text, isNew boolean, isDeleted boolean, schemaVersion bigint, PRIMARY KEY (id, longdate));"); + "CREATE TABLE management (id text, longdate bigint, class text, isNew boolean, isDeleted boolean, schemaVersion bigint, PRIMARY KEY (id, longdate))"); // sans doute faire une suppression en cascade lors que la cle(id, date), n'existe plus dans management // si supporté par toutes les bases cibles SQL_DEFAULT.put(SQL_CREATE_TABLE_DATA, - "CREATE TABLE data (id text, longdate bigint, field text, value bytea, type text, PRIMARY KEY (id, longdate, field), FOREIGN KEY (id, longdate) REFERENCES management (id, longdate) ON DELETE CASCADE ON UPDATE CASCADE);"); + "CREATE TABLE data (id text, longdate bigint, field text, value bytea, type text, PRIMARY KEY (id, longdate, field), FOREIGN KEY (id, longdate) REFERENCES management (id, longdate) ON DELETE CASCADE ON UPDATE CASCADE)"); SQL_DEFAULT.put(SQL_CREATE_INDEX_MANAGEMENT_ID, - "CREATE INDEX index_management_id ON management (id);"); + "CREATE INDEX index_management_id ON management (id)"); SQL_DEFAULT.put(SQL_CREATE_INDEX_MANAGEMENT_DATE, - "CREATE INDEX index_management_llongdate ON management (longdate);"); + "CREATE INDEX index_management_llongdate ON management (longdate)"); SQL_DEFAULT.put(SQL_CREATE_INDEX_DATA_ID, - "CREATE INDEX index_data_id ON data (id);"); + "CREATE INDEX index_data_id ON data (id)"); SQL_DEFAULT.put(SQL_CREATE_INDEX_DATA_DATE, - "CREATE INDEX index_data_longdate ON data (longdate);"); + "CREATE INDEX index_data_longdate ON data (longdate)"); // on tri sur la valeur abasolue puis sur la valeur reel, pour que les transactions arrive en premier dans les resultats SQL_DEFAULT.put(SQL_LOAD_HISTORY, - "SELECT * FROM management WHERE id=? AND ((longdate > 0 and longdate<=?) or longdate=?) order by abs(longdate) desc, longdate;"); + "SELECT * FROM management WHERE id=? AND ((longdate > 0 and longdate<=?) or longdate=?) order by abs(longdate) desc, longdate"); SQL_DEFAULT.put(SQL_REMOVE_DATA, - "DELETE data WHERE id=? and longdate=?;"); + "DELETE data WHERE id=? and longdate=?"); SQL_DEFAULT.put(SQL_GET_ALL_ID, - "SELECT DISTINCT(id) FROM management WHERE (longdate=? OR (longdate>0 AND longdate<=?)) AND id NOT IN (SELECT id FROM management WHERE (longdate=? OR (longdate>0 AND longdate<=?)) AND isDeleted=true);"); + "SELECT DISTINCT(id) FROM management WHERE (longdate=? OR (longdate>0 AND longdate<=?)) AND id NOT IN (SELECT id FROM management WHERE (longdate=? OR (longdate>0 AND longdate<=?)) AND isDeleted=true)"); SQL_DEFAULT.put(SQL_INSERT_DATA, - "INSERT INTO data VALUES (?, ?, ?, ?, ?);"); + "INSERT INTO data VALUES (?, ?, ?, ?, ?)"); SQL_DEFAULT.put(SQL_INSERT_MANAGEMENT, - "INSERT INTO management VALUES (?, ?, ?, ?, ?, ?);"); + "INSERT INTO management VALUES (?, ?, ?, ?, ?, ?)"); SQL_DEFAULT.put(SQL_LOAD_DATA, "SELECT * FROM data WHERE id=? AND longdate=?"); SQL_DEFAULT.put(SQL_LOAD_MANAGEMENT, "SELECT * FROM management WHERE id=? AND longdate=?"); SQL_DEFAULT.put(SQL_UPDATE_DATA, - "UPDATE data SET value=?, type=? WHERE id=? AND longdate=? AND field=?;"); + "UPDATE data SET value=?, type=? WHERE id=? AND longdate=? AND field=?"); SQL_DEFAULT.put(SQL_UPDATE_MANAGEMENT, - "UPDATE management SET isDeleted=? WHERE id=? AND longdate=?;"); + "UPDATE management SET isDeleted=? WHERE id=? AND longdate=?"); SQL_DEFAULT.put(SQL_UPDATE_SCHEMAVERSION, - "UPDATE management SET schemaVersion=? WHERE id=? AND longdate=?;"); + "UPDATE management SET schemaVersion=? WHERE id=? AND longdate=?"); SQL_DEFAULT.put(SQL_ROLLBACK_MANAGEMENT, - "DELETE FROM management WHERE longdate=?;"); + "DELETE FROM management WHERE longdate=?"); SQL_DEFAULT.put(SQL_ROLLBACK_DATA, - "DELETE FROM data WHERE longdate=?;"); + "DELETE FROM data WHERE longdate=?"); SQL_DEFAULT.put(SQL_COMMIT_MANAGEMENT, - "UPDATE management SET longdate=? WHERE longdate=?;"); + "UPDATE management SET longdate=? WHERE longdate=?"); SQL_DEFAULT.put(SQL_COMMIT_DATA, - "UPDATE data SET longdate=? WHERE longdate=?;"); + "UPDATE data SET longdate=? WHERE longdate=?"); SQL_MYSQL.setProperty(SQL_CREATE_TABLE_MANAGEMENT, "CREATE TABLE management (id varchar(100), longdate bigint, class text, isNew bool, isDeleted bool, schemaVersion bigint, PRIMARY KEY (id, longdate));"); @@ -197,9 +195,13 @@ "CREATE TABLE data (id text, longdate bigint, field text, value longvarbinary, type text, PRIMARY KEY (id, longdate, field), FOREIGN KEY (id, longdate) REFERENCES management (id, longdate) ON DELETE CASCADE ON UPDATE CASCADE);"); SQL_ORACLE.setProperty(SQL_CREATE_TABLE_MANAGEMENT, - "CREATE TABLE management (id varchar(100), longdate number(21), class varchar(255), isNew number(1), isDeleted number(1), schemaVersion number(21), PRIMARY KEY (id, longdate));"); + "CREATE TABLE management (id varchar(100), longdate number(21), class varchar(255), isNew number(1), isDeleted number(1), schemaVersion number(21), constraint management_pk PRIMARY KEY (id, longdate))"); SQL_ORACLE.put(SQL_CREATE_TABLE_DATA, - "CREATE TABLE data (id varchar(100), longdate number(21), field varchar(100), value blob, type varchar(255), PRIMARY KEY (id, longdate, field), FOREIGN KEY (id, longdate) REFERENCES management (id, longdate) ON DELETE CASCADE ON UPDATE CASCADE);"); + "CREATE TABLE data (id varchar(100), longdate number(21), field varchar(100), val blob, type varchar(255), constraint data_pk PRIMARY KEY (id, longdate, field))"); + + SQL_DERBY.put(SQL_CREATE_TABLE_MANAGEMENT, "CREATE TABLE management (id VARCHAR(50), longdate bigint, class LONG VARCHAR, isNew integer, isDeleted integer, schemaVersion bigint, PRIMARY KEY (id, longdate))"); + SQL_DERBY.put(SQL_CREATE_TABLE_DATA, "CREATE TABLE data (longdate bigint, field varchar(100), value blob, type LONG VARCHAR, PRIMARY KEY (id, longdate, field))"); + } @@ -221,9 +223,11 @@ SQL = SQL_MCKOI; } else if(driver.indexOf("oracle") != -1){ SQL = SQL_ORACLE; + } else if(driver.indexOf("derby") != -1){ + SQL = SQL_DERBY; } else { SQL = SQL_POSTGRESQL; - } + } Util.getClazz(driver); @@ -362,6 +366,7 @@ conn.close(); } catch(SQLException zzz){ + log.log(Level.INFO, "erreur précédente", eee); log.log(Level.INFO, "Erreur durant le rollback du a une exception", zzz); } } @@ -802,7 +807,9 @@ // peut-etre faire quelque chose comme dans beginTransaction ? context.setTransaction(newtt); } catch(SQLException eee){ + eee.printStackTrace(); throw new TopiaPersistenceException("Erreur durant le rollback transaction: " + context.getTransaction().getId(), eee); + } }