Index: topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceHelper.java diff -u topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceHelper.java:1.5 topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceHelper.java:1.6 --- topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceHelper.java:1.5 Tue Aug 2 21:03:58 2005 +++ topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceHelper.java Wed Aug 3 16:17:10 2005 @@ -23,10 +23,10 @@ * Created: Jul 16, 2005 * * @author Benjamin POUSSIN - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ * - * Last update : $Date: 2005/08/02 21:03:58 $ - * by : $Author: bpoussin $ + * Last update : $Date: 2005/08/03 16:17:10 $ + * by : $Author: thimel $ */ package org.codelutin.topia.persistence; @@ -99,12 +99,12 @@ getStorage().beginTransaction(getContext()); } - public TopiaTransaction commitTransaction() throws TopiaException { - return getStorage().commitTransaction(getContext()); + public void commitTransaction() throws TopiaException { + getStorage().commitTransaction(getContext()); } - public TopiaTransaction rollbackTransaction() throws TopiaException { - return getStorage().rollbackTransaction(getContext()); + public void rollbackTransaction() throws TopiaException { + getStorage().rollbackTransaction(getContext()); } /** Index: topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java diff -u topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java:1.8 topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java:1.9 --- topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java:1.8 Tue Aug 2 23:37:17 2005 +++ topia/src/java/org/codelutin/topia/persistence/PersistenceStorageJDBC.java Wed Aug 3 16:17:10 2005 @@ -23,10 +23,10 @@ * Created: 20 juillet 2005 15:25:06 CEST * * @author Benjamin POUSSIN - * @version $Revision: 1.8 $ + * @version $Revision: 1.9 $ * - * Last update: $Date: 2005/08/02 23:37:17 $ - * by : $Author: bpoussin $ + * Last update: $Date: 2005/08/03 16:17:10 $ + * by : $Author: thimel $ */ package org.codelutin.topia.persistence; @@ -764,16 +764,15 @@ } /** - * Indique au storage de commiter la transaction passé en paramètre. - * @return la nouvelle transaction utilisable pour de futurs appels au storage - * car l'ancienne transaction n'est plus valide + * Indique au storage de commiter la transaction passé en paramètre. La + * TopiaTransaction du Context est mise à jour automatiquement. * @todo pour l'instant on commit tous les objets meme les nouveaux && supprimé * pour optimiser un peu on pourrait ne pas les commiter. Ca demande un peu * plus de travaille pour les data, car il faut voir si dans le management * il sont supprimé on non. Ensuite, il faut supprimer avec les meme requete * que rollback ces objets. */ - public TopiaTransaction commitTransaction(TopiaContext context) throws TopiaPersistenceException { + public void commitTransaction(TopiaContext context) throws TopiaPersistenceException { try{ TopiaTransaction newtt = context.getTransaction().regenerateTransaction(); Connection conn = getConnection(); @@ -801,18 +800,17 @@ conn.close(); } // peut-etre faire quelque chose comme dans beginTransaction ? - return newtt; + context.setTransaction(newtt); } catch(SQLException eee){ throw new TopiaPersistenceException("Erreur durant le rollback transaction: " + context.getTransaction().getId(), eee); } } /** - * Indique au storage de faire un rollback de la transaction passé en paramètre. - * @return la nouvelle transaction utilisable pour de futurs appels au storage - * car l'ancienne transaction n'est plus valide + * Indique au storage de faire un rollback de la transaction passé en + * paramètre. La Transaction du Context est mise à jour automatiquement. */ - public TopiaTransaction rollbackTransaction(TopiaContext context) throws TopiaPersistenceException { + public void rollbackTransaction(TopiaContext context) throws TopiaPersistenceException { try{ Connection conn = getConnection(); try{ @@ -839,9 +837,8 @@ conn.close(); } // creation d'un nouvelle transation - TopiaTransaction tt = context.getTransaction().regenerateTransaction(); + context.setTransaction(context.getTransaction().regenerateTransaction()); // peut-etre faire quelque chose comme dans beginTransaction ? - return tt; } catch(SQLException eee){ throw new TopiaPersistenceException("Erreur durant le rollback transaction: " + context.getTransaction().getId(), eee); } @@ -865,6 +862,7 @@ TopiaJDBCQueryHelper queryHelper = new TopiaJDBCQueryHelper(); try { queryHelper.setQuery(query.getQueryString()); + queryHelper.setArgs(query.getArgs()); } catch (IOException eee) { throw new TopiaPersistenceException("Creation de la requete impossible, requete source mal formée", eee); } @@ -876,10 +874,9 @@ try{ PreparedStatement sta = conn.prepareStatement(preparedQuery); try{ - Iterator args = queryHelper.getArgs().iterator(); int i = 1; - while (args.hasNext()) { - sta.setObject(i, args.next()); + for (Object o : queryHelper.getArgs()) { + sta.setObject(i, o); i++; } ResultSet rr = sta.executeQuery(); Index: topia/src/java/org/codelutin/topia/persistence/PersistenceStorage.java diff -u topia/src/java/org/codelutin/topia/persistence/PersistenceStorage.java:1.4 topia/src/java/org/codelutin/topia/persistence/PersistenceStorage.java:1.5 --- topia/src/java/org/codelutin/topia/persistence/PersistenceStorage.java:1.4 Tue Aug 2 21:03:58 2005 +++ topia/src/java/org/codelutin/topia/persistence/PersistenceStorage.java Wed Aug 3 16:17:10 2005 @@ -23,10 +23,10 @@ * Created: 16 juillet 2005 23:40:21 CEST * * @author Benjamin POUSSIN - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ * - * Last update: $Date: 2005/08/02 21:03:58 $ - * by : $Author: bpoussin $ + * Last update: $Date: 2005/08/03 16:17:10 $ + * by : $Author: thimel $ */ package org.codelutin.topia.persistence; @@ -75,14 +75,14 @@ * @return la nouvelle transaction utilisable pour de futurs appels au storage * car l'ancienne transaction n'est plus valide */ - public TopiaTransaction commitTransaction(TopiaContext context) throws TopiaPersistenceException; + public void commitTransaction(TopiaContext context) throws TopiaPersistenceException; /** * Indique au storage de faire un rollback de la transaction passé en paramètre. * @return la nouvelle transaction utilisable pour de futurs appels au storage * car l'ancienne transaction n'est plus valide */ - public TopiaTransaction rollbackTransaction(TopiaContext context) throws TopiaPersistenceException; + public void rollbackTransaction(TopiaContext context) throws TopiaPersistenceException; /** * Indique si le storage implante une methode de recherche rapide Index: topia/src/java/org/codelutin/topia/persistence/PersistenceHelper.java diff -u topia/src/java/org/codelutin/topia/persistence/PersistenceHelper.java:1.11 topia/src/java/org/codelutin/topia/persistence/PersistenceHelper.java:1.12 --- topia/src/java/org/codelutin/topia/persistence/PersistenceHelper.java:1.11 Fri Jul 22 16:57:57 2005 +++ topia/src/java/org/codelutin/topia/persistence/PersistenceHelper.java Wed Aug 3 16:17:10 2005 @@ -23,9 +23,9 @@ * Created: Aug 1, 2004 * * @author Cédric Pineau - * @version $Revision: 1.11 $ + * @version $Revision: 1.12 $ * - * Last update : $Date: 2005/07/22 16:57:57 $ + * Last update : $Date: 2005/08/03 16:17:10 $ * by : $Author: thimel $ */ @@ -124,11 +124,11 @@ * Commit les changements fait durant la transaction * @throws TopiaException si aucune transaction ouverte pour le thread courant */ - public TopiaTransaction commitTransaction() throws TopiaException; + public void commitTransaction() throws TopiaException; /** * Rollback les changements fait durant la transaction * @throws TopiaException si aucune transaction ouverte pour le thread courant */ - public TopiaTransaction rollbackTransaction() throws TopiaException; + public void rollbackTransaction() throws TopiaException; } Index: topia/src/java/org/codelutin/topia/persistence/TopiaJDBCQueryHelper.java diff -u topia/src/java/org/codelutin/topia/persistence/TopiaJDBCQueryHelper.java:1.2 topia/src/java/org/codelutin/topia/persistence/TopiaJDBCQueryHelper.java:1.3 --- topia/src/java/org/codelutin/topia/persistence/TopiaJDBCQueryHelper.java:1.2 Tue Aug 2 13:13:02 2005 +++ topia/src/java/org/codelutin/topia/persistence/TopiaJDBCQueryHelper.java Wed Aug 3 16:17:10 2005 @@ -23,9 +23,9 @@ * * @author Arnaud Thimel * Copyright Code Lutin - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * - * Mise a jour: $Date: 2005/08/02 13:13:02 $ + * Mise a jour: $Date: 2005/08/03 16:17:10 $ * par : $Author: thimel $ */ package org.codelutin.topia.persistence; @@ -33,6 +33,8 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; +import java.util.logging.Logger; +import java.util.logging.Level; import org.codelutin.queryparser.Constraint; import org.codelutin.queryparser.DefaultQueryVisitorUnsupportedOperation; @@ -49,6 +51,8 @@ public class TopiaJDBCQueryHelper extends QueryHelper { + static private Logger log = Logger.getLogger("org.codelutin.topia.persistence.TopiaJDBCQueryHelper"); + public static final String AND = " AND"; public static final String IN_START = " (id,longdate) IN ("; public static final String IN_AND_SELECT = "SELECT id, longdate FROM data WHERE "; @@ -64,8 +68,6 @@ // public static final String END_AFTER_TYPE = "' AND longdate=-900 AND isDeleted=false) GROUP BY id)"; protected TopiaJDBCQueryBuilder queryBuilder; - protected TopiaTransaction transaction; - protected long thetime; protected String request; public void setQuery(Query query) { @@ -78,10 +80,9 @@ throw new QueryHelperException("Please use setQuery(...) " + "before execute()"); } - if (transaction == null) { -// throw new QueryHelperException("Please use setTransaction(...) " + -// "before execute()"); - thetime = System.currentTimeMillis(); + if (tt == null) { + throw new QueryHelperException("Please use setTransaction(...) " + + "before execute()"); } // Préparation de la requete SQL @@ -104,11 +105,16 @@ // utiliser la transaction pour ajouter les valeurs des 5 "?". Il faut : // -transaction.getId(), transaction.getId(), -transaction.getId(), transaction.getId(), -transaction.getId() // soit : -, +, -, +, - - args.add(-thetime); + long thetime = tt.getId(); + if (queryBuilder.isQuestionMarkSet() && args.size() == 0) { + log.log(Level.WARNING, "? utilisé mais aucun argument trouvé" + + ", résultat de la requête non garanti !"); + } args.add(thetime); args.add(-thetime); args.add(thetime); args.add(-thetime); + args.add(thetime); } return request; @@ -127,6 +133,7 @@ private String from; private boolean inNotClause = false; + private boolean questionMarkSet = false; public String getFrom() { return from; @@ -140,6 +147,10 @@ return ANDs; } + public boolean isQuestionMarkSet() { + return questionMarkSet; + } + public void visitQuery(Query query) { this.query = query; ANDs = new LinkedList(); @@ -184,11 +195,12 @@ if (op instanceof Constraint) { ((Constraint)op).visit(this); } else if(op == null) { - filter += " null"; + filter += "null"; } else if(op instanceof String) { - filter += " \""+op.toString()+"\""; + filter += "'"+op.toString()+"'"; } else if(op instanceof QMark) { filter += "?"; + questionMarkSet = true; } else if(op instanceof FieldPath) { FieldPath field = (FieldPath)op; String path = field.getField(); @@ -204,14 +216,14 @@ throw new UnsupportedOperationException("Only one source can be used"); } if(path.length() > 0){ - filter += path; + filter += "'" + path + "'"; } else { filter += null; } } else if(op instanceof Number) { - filter += op.toString(); + filter += "" + op.toString() + ""; } else if(op instanceof Boolean) { - filter += op.toString(); + filter += "'" + op.toString() + "'"; } else if(op instanceof Collection) { // filter += "argCollection" + argCollection.size(); // argCollection.add(op); @@ -298,11 +310,11 @@ visitWhereNotEqual(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value='"; + filter += " AND value="; visitOperand(op2); - filter += "')"; + filter += ")"; } } public void visitWhereNotEqual(Constraint constraint, Object op1, @@ -312,11 +324,11 @@ visitWhereEqual(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value!='"; + filter += " AND value!="; visitOperand(op2); - filter += "')"; + filter += ")"; } } @@ -327,11 +339,11 @@ visitWhereSmallerOrEqual(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value>'"; + filter += " AND value>"; visitOperand(op2); - filter += "')"; + filter += ")"; } } public void visitWhereGreaterOrEqual(Constraint constraint, Object op1, @@ -341,11 +353,11 @@ visitWhereSmaller(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value>='"; + filter += " AND value>="; visitOperand(op2); - filter += "')"; + filter += ")"; } } public void visitWhereSmaller(Constraint constraint, Object op1, @@ -355,11 +367,11 @@ visitWhereGreaterOrEqual(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value<'"; + filter += " AND value<"; visitOperand(op2); - filter += "')"; + filter += ")"; } } public void visitWhereSmallerOrEqual(Constraint constraint, Object op1, @@ -369,11 +381,11 @@ visitWhereGreater(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value<='"; + filter += " AND value<="; visitOperand(op2); - filter += "')"; + filter += ")"; } } @@ -418,11 +430,11 @@ visitWhereNotLike(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value LIKE '"; + filter += " AND value LIKE "; visitOperand(op2); - filter += "')"; + filter += ")"; } } public void visitWhereNotLike(Constraint constraint, Object op1, @@ -432,11 +444,11 @@ visitWhereLike(constraint, op1, op2); inNotClause = true; } else { - filter += "(field='"; + filter += "(field="; visitOperand(op1); - filter += "' AND value NOT LIKE '"; + filter += " AND value NOT LIKE "; visitOperand(op2); - filter += "')"; + filter += ")"; } }