diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/ExecuteListenerTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/ExecuteListenerTests.java index 5423d2864e..1cec066e70 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/ExecuteListenerTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/ExecuteListenerTests.java @@ -52,7 +52,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Queue; +import org.jooq.Cursor; import org.jooq.ExecuteContext; +import org.jooq.ExecuteListener; import org.jooq.ExecuteType; import org.jooq.Field; import org.jooq.Result; @@ -881,4 +883,224 @@ extends BaseTest cursor = create.selectFrom(TAuthor()).fetchLazy(); + assertEquals(1, FetchLazyListener.countStart); + assertEquals(1, FetchLazyListener.countRenderStart); + assertEquals(1, FetchLazyListener.countRenderEnd); + assertEquals(1, FetchLazyListener.countPrepareStart); + assertEquals(1, FetchLazyListener.countPrepareEnd); + assertEquals(1, FetchLazyListener.countBindStart); + assertEquals(1, FetchLazyListener.countBindEnd); + assertEquals(1, FetchLazyListener.countExecuteStart); + assertEquals(1, FetchLazyListener.countExecuteEnd); + assertEquals(0, FetchLazyListener.countFetchStart); + assertEquals(0, FetchLazyListener.countResultStart); + assertEquals(0, FetchLazyListener.countRecordStart); + assertEquals(0, FetchLazyListener.countRecordEnd); + assertEquals(0, FetchLazyListener.countResultEnd); + assertEquals(0, FetchLazyListener.countFetchEnd); + assertEquals(0, FetchLazyListener.countEnd); + assertEquals(0, FetchLazyListener.countException); + + cursor.fetchOne(); + assertEquals(1, FetchLazyListener.countStart); + assertEquals(1, FetchLazyListener.countRenderStart); + assertEquals(1, FetchLazyListener.countRenderEnd); + assertEquals(1, FetchLazyListener.countPrepareStart); + assertEquals(1, FetchLazyListener.countPrepareEnd); + assertEquals(1, FetchLazyListener.countBindStart); + assertEquals(1, FetchLazyListener.countBindEnd); + assertEquals(1, FetchLazyListener.countExecuteStart); + assertEquals(1, FetchLazyListener.countExecuteEnd); + assertEquals(1, FetchLazyListener.countFetchStart); + assertEquals(1, FetchLazyListener.countResultStart); + assertEquals(1, FetchLazyListener.countRecordStart); + assertEquals(1, FetchLazyListener.countRecordEnd); + assertEquals(1, FetchLazyListener.countResultEnd); + assertEquals(0, FetchLazyListener.countFetchEnd); + assertEquals(0, FetchLazyListener.countEnd); + assertEquals(0, FetchLazyListener.countException); + + cursor.fetchOne(); + assertEquals(1, FetchLazyListener.countStart); + assertEquals(1, FetchLazyListener.countRenderStart); + assertEquals(1, FetchLazyListener.countRenderEnd); + assertEquals(1, FetchLazyListener.countPrepareStart); + assertEquals(1, FetchLazyListener.countPrepareEnd); + assertEquals(1, FetchLazyListener.countBindStart); + assertEquals(1, FetchLazyListener.countBindEnd); + assertEquals(1, FetchLazyListener.countExecuteStart); + assertEquals(1, FetchLazyListener.countExecuteEnd); + assertEquals(1, FetchLazyListener.countFetchStart); + assertEquals(2, FetchLazyListener.countResultStart); + assertEquals(2, FetchLazyListener.countRecordStart); + assertEquals(2, FetchLazyListener.countRecordEnd); + assertEquals(2, FetchLazyListener.countResultEnd); + assertEquals(0, FetchLazyListener.countFetchEnd); + assertEquals(0, FetchLazyListener.countEnd); + assertEquals(0, FetchLazyListener.countException); + + cursor.fetchOne(); + assertEquals(1, FetchLazyListener.countStart); + assertEquals(1, FetchLazyListener.countRenderStart); + assertEquals(1, FetchLazyListener.countRenderEnd); + assertEquals(1, FetchLazyListener.countPrepareStart); + assertEquals(1, FetchLazyListener.countPrepareEnd); + assertEquals(1, FetchLazyListener.countBindStart); + assertEquals(1, FetchLazyListener.countBindEnd); + assertEquals(1, FetchLazyListener.countExecuteStart); + assertEquals(1, FetchLazyListener.countExecuteEnd); + assertEquals(1, FetchLazyListener.countFetchStart); + assertEquals(2, FetchLazyListener.countResultStart); + assertEquals(2, FetchLazyListener.countRecordStart); + assertEquals(2, FetchLazyListener.countRecordEnd); + assertEquals(2, FetchLazyListener.countResultEnd); + assertEquals(0, FetchLazyListener.countFetchEnd); + assertEquals(0, FetchLazyListener.countEnd); + assertEquals(0, FetchLazyListener.countException); + } + + public static class FetchLazyListener implements ExecuteListener { + + static int countStart; + static int countRenderStart; + static int countRenderEnd; + static int countPrepareStart; + static int countPrepareEnd; + static int countBindStart; + static int countBindEnd; + static int countExecuteStart; + static int countExecuteEnd; + static int countFetchStart; + static int countResultStart; + static int countRecordStart; + static int countRecordEnd; + static int countResultEnd; + static int countFetchEnd; + static int countEnd; + static int countException; + + static void reset() { + for (java.lang.reflect.Field f : FetchLazyListener.class.getDeclaredFields()) { + f.setAccessible(true); + + try { + f.set(FetchLazyListener.class, 0); + } + catch (Exception ignore) {} + } + } + + @Override + public void start(ExecuteContext ctx) { + countStart++; + } + + @Override + public void renderStart(ExecuteContext ctx) { + countRenderStart++; + } + + @Override + public void renderEnd(ExecuteContext ctx) { + countRenderEnd++; + } + + @Override + public void prepareStart(ExecuteContext ctx) { + countPrepareStart++; + } + + @Override + public void prepareEnd(ExecuteContext ctx) { + countPrepareEnd++; + } + + @Override + public void bindStart(ExecuteContext ctx) { + countBindStart++; + } + + @Override + public void bindEnd(ExecuteContext ctx) { + countBindEnd++; + } + + @Override + public void executeStart(ExecuteContext ctx) { + countExecuteStart++; + } + + @Override + public void executeEnd(ExecuteContext ctx) { + countExecuteEnd++; + } + + @Override + public void fetchStart(ExecuteContext ctx) { + countFetchStart++; + } + + @Override + public void resultStart(ExecuteContext ctx) { + countResultStart++; + } + + @Override + public void recordStart(ExecuteContext ctx) { + countRecordStart++; + } + + @Override + public void recordEnd(ExecuteContext ctx) { + countRecordEnd++; + } + + @Override + public void resultEnd(ExecuteContext ctx) { + countResultEnd++; + } + + @Override + public void fetchEnd(ExecuteContext ctx) { + countFetchEnd++; + } + + @Override + public void exception(ExecuteContext ctx) { + countException++; + } + + @Override + public void end(ExecuteContext ctx) { + countEnd++; + } + } } diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 7f0a539c40..55dd6ff5ff 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -1758,6 +1758,11 @@ public abstract class jOOQAbstractTest< new ExecuteListenerTests(this).testExecuteListenerOnBatchMultiple(); } + @Test + public void testExecuteListenerFetchLazyTest() throws Exception { + new ExecuteListenerTests(this).testExecuteListenerFetchLazyTest(); + } + @Test public void testRenderNameStyle() throws Exception { new RenderAndBindTests(this).testRenderNameStyle(); diff --git a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java index 501c24b903..830bb232d9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java @@ -145,7 +145,13 @@ class CursorImpl implements Cursor { @Override public final R fetchOne() { - return iterator().next(); + Result result = fetch(1); + + if (result.size() == 1) { + return result.get(0); + } + + return null; } @Override @@ -160,7 +166,7 @@ class CursorImpl implements Cursor { ctx.result(result); listener.resultStart(ctx); - for (int i = 0; i < number && ((record = fetchOne()) != null); i++) { + for (int i = 0; i < number && ((record = iterator().next()) != null); i++) { result.addRecord(record); }