From fdf8394796dca4e8445abf025f1c32c6f74ed311 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 10 May 2013 17:56:54 +0200 Subject: [PATCH] [#2458] Add Cursor.closesAfterFetch() to indicate whether a Cursor auto-closes the underlying ResultSet after it has fetched all records --- jOOQ/src/main/java/org/jooq/Cursor.java | 9 +++++++++ .../src/main/java/org/jooq/impl/AbstractResultQuery.java | 4 +++- jOOQ/src/main/java/org/jooq/impl/CursorImpl.java | 9 +++++---- jOOQ/src/main/java/org/jooq/impl/Utils.java | 4 +++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Cursor.java b/jOOQ/src/main/java/org/jooq/Cursor.java index cba3916d59..0e260ff9ff 100644 --- a/jOOQ/src/main/java/org/jooq/Cursor.java +++ b/jOOQ/src/main/java/org/jooq/Cursor.java @@ -275,6 +275,15 @@ public interface Cursor extends Iterable { */ Result fetchInto(Table table) throws DataAccessException, MappingException; + /** + * Whether this Cursor closes itself after fetching all data. + *

+ * By default, a Cursor will close itself after fetching all + * data. This behaviour can be overridden by + * {@link ResultQuery#keepResultSet(KeepResultSetMode)}, though. + */ + boolean closesAfterFetch(); + /** * Explicitly close the underlying {@link PreparedStatement} and * {@link ResultSet}. diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index fab8b3addc..741294e4b2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -516,7 +516,9 @@ abstract class AbstractResultQuery extends AbstractQuery imple return c.fetchOne(); } finally { - c.close(); + if (c.closesAfterFetch()) { + c.close(); + } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java index 07d2ceec1f..f6c86f11ad 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java @@ -119,7 +119,8 @@ class CursorImpl implements Cursor { } } - final boolean closeAfterFetch() { + @Override + public final boolean closesAfterFetch() { return keepResultSetMode == null || keepResultSetMode == CLOSE_AFTER_FETCH; } @@ -186,7 +187,7 @@ class CursorImpl implements Cursor { // Before listener.resultStart(ctx) iterator(); - ResultImpl result = new ResultImpl(ctx.configuration(), closeAfterFetch() ? null : rs, fields); + ResultImpl result = new ResultImpl(ctx.configuration(), closesAfterFetch() ? null : rs, fields); R record = null; ctx.result(result); @@ -1286,7 +1287,7 @@ class CursorImpl implements Cursor { // [#1846] Add a reference to the Cursor's ResultSet if // Updatable ResultSets are requested - if (!closeAfterFetch()) { + if (!closesAfterFetch()) { record.rs = rs; record.rsIndex = rsIndex; } @@ -1317,7 +1318,7 @@ class CursorImpl implements Cursor { // the result is not eager-fetched. // [#1846] When fetching updatable Results, do not close the // Cursor's ResultSet! - if (record == null && closeAfterFetch()) { + if (record == null && closesAfterFetch()) { CursorImpl.this.close(); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Utils.java b/jOOQ/src/main/java/org/jooq/impl/Utils.java index c6ef2582ab..3ac9b0bf6a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Utils.java +++ b/jOOQ/src/main/java/org/jooq/impl/Utils.java @@ -754,7 +754,9 @@ final class Utils { return record; } finally { - cursor.close(); + if (cursor.closesAfterFetch()) { + cursor.close(); + } } }