From 360c1c5dc5b51048c94972698398929aebae785d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com> Date: Wed, 20 Jul 2022 12:18:22 +0200 Subject: [PATCH] MAINT: refactor sql statement execution --- .../database/access/AbstractAccess.java | 5 +-- .../java/org/caosdb/server/query/Query.java | 39 ++++++++++--------- 2 files changed, 22 insertions(+), 22 deletions(-) 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 46e10adb..1d30bd3f 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 ee3a9712..d8fd5d75 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(); + } + } } } -- GitLab