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