diff --git a/src/main/java/org/caosdb/server/database/access/AbstractAccess.java b/src/main/java/org/caosdb/server/database/access/AbstractAccess.java index 46e10adb476112a04d09a0d577eca810088044c0..1d30bd3fee7187b9c44378e5b94c1c6d97287f00 100644 --- a/src/main/java/org/caosdb/server/database/access/AbstractAccess.java +++ b/src/main/java/org/caosdb/server/database/access/AbstractAccess.java @@ -25,7 +25,6 @@ package org.caosdb.server.database.access; import java.util.HashMap; import org.caosdb.server.database.misc.DBHelper; import org.caosdb.server.database.misc.RollBackHandler; -import org.caosdb.server.query.NoCache; import org.caosdb.server.transaction.TransactionInterface; public abstract class AbstractAccess<T extends TransactionInterface> implements Access { @@ -79,8 +78,8 @@ public abstract class AbstractAccess<T extends TransactionInterface> implements this.useCache = useCache; } /** - * Whether the transaction allows to use the query cache or other caches. This is controlled - * by the "cache" flag. + * Whether the transaction allows to use the query cache or other caches. This is controlled by + * the "cache" flag. * * @see {@link NoCache} * @return true if caching is encouraged. diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java index ee3a971292ea3ecde3c68ca1c34ff935a6301770..d8fd5d7561735040a47619191611ae15652b40c4 100644 --- a/src/main/java/org/caosdb/server/query/Query.java +++ b/src/main/java/org/caosdb/server/query/Query.java @@ -692,7 +692,6 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac } } - /** * Try to set the `resultSet` member variable using the values stored in the high level query * cache. @@ -861,24 +860,26 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac * with (acl_id, acl) and a table with (entity_id, acl_id) to reduce the * amount of data being transfered. */ - final Statement stmt = this.getConnection().createStatement(); - - final String query = - ("SELECT entity_n_acl.id, entity_acl.acl from " - + "(select entities.id, entities.acl from entities " - + "inner join `" - + tabname - + "` as rs on entities.id=rs.id) " - + "as entity_n_acl " - + "left join entity_acl on entity_n_acl.acl=entity_acl.id;"); - final ResultSet entitiesRS = stmt.executeQuery(query); - final ResultSetIterator entitiesWithACL = new ResultSetIterator(entitiesRS); - final List<Integer> toBeDeleted = collectIdsWithoutPermission(entitiesWithACL); - entitiesRS.close(); - - // TODO is there a better way than the following? - for (final Integer id : toBeDeleted) { - stmt.execute("DELETE FROM `" + tabname + "` WHERE id = " + id); + + try (final Statement stmt = this.getConnection().createStatement()) { + final String query = + ("SELECT entity_n_acl.id, entity_acl.acl from " + + "(select entities.id, entities.acl from entities " + + "inner join `" + + tabname + + "` as rs on entities.id=rs.id) " + + "as entity_n_acl " + + "left join entity_acl on entity_n_acl.acl=entity_acl.id;"); + final ResultSet entitiesRS = stmt.executeQuery(query); + final ResultSetIterator entitiesWithACL = new ResultSetIterator(entitiesRS); + final List<Integer> toBeDeleted = collectIdsWithoutPermission(entitiesWithACL); + try (final PreparedStatement pstmt = + this.getConnection().prepareStatement("DELETE FROM `" + tabname + "` WHERE id = ?")) { + for (final Integer id : toBeDeleted) { + pstmt.setInt(1, id); + pstmt.execute(); + } + } } }