diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index c8d53fb594..81302d5273 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -1073,7 +1073,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery } ExecuteContext ctx2 = new DefaultExecuteContext(((DefaultExecuteContext) ctx).originalConfiguration()); - ExecuteListener listener2 = ExecuteListeners.get(ctx2); + ExecuteListener listener2 = ExecuteListeners.getAndStart(ctx2); ctx2.resultSet(rs); returnedResult = new CursorImpl<>(ctx2, listener2, returningResolvedAsterisks.toArray(EMPTY_FIELD), null, false, true).fetch(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java index a5406d5556..79800ba5c9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java @@ -305,6 +305,9 @@ abstract class AbstractQuery extends AbstractQueryPart implements Query { int result = 0; try { + // [#8968] Keep start() event inside of lifecycle management + listener.start(ctx); + // [#385] If a statement was previously kept open if (keepStatement() && statement != null) { ctx.sql(rendered.sql); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 977794cda6..b77af101e0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -480,6 +480,9 @@ public abstract class AbstractRoutine extends AbstractNamed implements Routin ExecuteListener listener = ExecuteListeners.get(ctx); try { + // [#8968] Keep start() event inside of lifecycle management + listener.start(ctx); + Connection connection = ctx.connection(); listener.renderStart(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java b/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java index 65585ce8d7..dde84e04b2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java +++ b/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java @@ -82,6 +82,10 @@ final class BatchMultiple implements Batch { Connection connection = ctx.connection(); try { + + // [#8968] Keep start() event inside of lifecycle management + listener.start(ctx); + ctx.statement(new SettingsEnabledPreparedStatement(connection)); String[] batchSQL = ctx.batchSQL(); diff --git a/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java b/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java index 1a0baebdc2..477117a7fa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java +++ b/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java @@ -205,6 +205,9 @@ final class BatchSingle implements BatchBindStep { DataType[] paramTypes = dataTypes(params); try { + // [#8968] Keep start() event inside of lifecycle management + listener.start(ctx); + listener.renderStart(ctx); // [#1520] TODO: Should the number of bind values be checked, here? ctx.sql(create.render(query)); diff --git a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java index f06187592d..cfa3901b55 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java @@ -131,7 +131,7 @@ final class CursorImpl extends AbstractCursor implements Cu super(ctx.configuration(), new Fields<>(fields)); this.ctx = ctx; - this.listener = (listener != null ? listener : ExecuteListeners.get(ctx)); + this.listener = (listener != null ? listener : ExecuteListeners.getAndStart(ctx)); this.factory = recordFactory(type, fields); this.keepStatement = keepStatement; this.keepResultSet = keepResultSet; diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java index f913962c58..647a1509fd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java @@ -1330,7 +1330,7 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri @Override public Cursor fetchLazy(ResultSet rs, Field... fields) { ExecuteContext ctx = new DefaultExecuteContext(configuration()); - ExecuteListener listener = ExecuteListeners.get(ctx); + ExecuteListener listener = ExecuteListeners.getAndStart(ctx); ctx.resultSet(rs); return new CursorImpl<>(ctx, listener, fields, null, false, true); diff --git a/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java b/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java index f7040bc8e3..b707e11496 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java +++ b/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java @@ -75,13 +75,28 @@ final class ExecuteListeners implements ExecuteListener { private boolean resultStart; private boolean fetchEnd; + /** + * Initialise the provided {@link ExecuteListener} set and return a wrapper. + */ static ExecuteListener get(ExecuteContext ctx) { ExecuteListener[][] listeners = listeners(ctx); if (listeners == null) return EMPTY_LISTENER; else - return new ExecuteListeners(ctx, listeners); + return new ExecuteListeners(listeners); + } + + /** + * Initialise the provided {@link ExecuteListener} set and return a wrapper. + *

+ * Call this if the {@link ExecuteListener#start(ExecuteContext)} event + * should be triggered eagerly. + */ + static ExecuteListener getAndStart(ExecuteContext ctx) { + ExecuteListener result = get(ctx); + result.start(ctx); + return result; } /** @@ -128,10 +143,8 @@ final class ExecuteListeners implements ExecuteListener { return result == null ? new ArrayList<>() : result; } - private ExecuteListeners(ExecuteContext ctx, ExecuteListener[][] listeners) { + private ExecuteListeners(ExecuteListener[][] listeners) { this.listeners = listeners; - - start(ctx); } @Override