[jOOQ/jOOQ#8968] An exception in ExecuteListener#start is not routed to ExecuteListener#exception

This commit is contained in:
Lukas Eder 2020-02-05 14:56:11 +01:00
parent 4af8828cea
commit 0617c77c36
8 changed files with 33 additions and 7 deletions

View File

@ -1073,7 +1073,7 @@ abstract class AbstractDMLQuery<R extends Record> 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();

View File

@ -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);

View File

@ -480,6 +480,9 @@ public abstract class AbstractRoutine<T> 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);

View File

@ -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();

View File

@ -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));

View File

@ -131,7 +131,7 @@ final class CursorImpl<R extends Record> extends AbstractCursor<R> 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;

View File

@ -1330,7 +1330,7 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri
@Override
public Cursor<Record> 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);

View File

@ -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.
* <p>
* 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