From e33b56a86387716f80546a08bfc111ad3015000e Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sat, 11 May 2013 11:14:46 +0200 Subject: [PATCH] [#2265] Let UpdatableRecord.refresh() use ResultSet, if available --- .../test/_/testcases/KeepResultSetTests.java | 58 +++++++++++++------ .../org/jooq/impl/UpdatableRecordImpl.java | 30 +++++++--- 2 files changed, 61 insertions(+), 27 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/KeepResultSetTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/KeepResultSetTests.java index 97513b6d6d..ede4058730 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/KeepResultSetTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/KeepResultSetTests.java @@ -121,7 +121,7 @@ extends BaseTest b2 = create.select().from(TBook().getName()).keepResultSet(KEEP_AFTER_FETCH).fetch(); - Record r = b2.get(0); + Result b2 = create.selectFrom(TBook()).keepResultSet(KEEP_AFTER_FETCH).fetch(); + B r = b2.get(0); assertNotNull(b2.resultSet()); assertNotNull(r.resultSet()); testFailUpdateRow(b2.resultSet()); - // Changing a TITLE has no effect - r.setValue(TBook_TITLE(), "XX"); - r.setValue(TBook_AUTHOR_ID(), 15); - assertEquals("XX", r.getValue(TBook_TITLE())); - assertEquals(15, (int) r.getValue(TBook_AUTHOR_ID())); - assertTrue(r.changed()); - assertFalse(r.original().equals(r)); + testModifiedBook1(r); B dbBook = getBook(1); assertEquals(BOOK_TITLES.get(0), dbBook.getValue(TBook_TITLE())); assertEquals(BOOK_AUTHOR_IDS.get(0), dbBook.getValue(TBook_AUTHOR_ID())); @@ -205,14 +214,27 @@ extends BaseTest c1 = create.select().from(TBook().getName()).keepResultSet(KEEP_AFTER_FETCH).fetchLazy(); assertFalse(c1.closesAfterFetch()); diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java index 0d42b89371..7dc295179e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java @@ -336,17 +336,29 @@ public class UpdatableRecordImpl> extends TableReco @Override public final void refresh(Field... f) { - SelectQuery select = create().selectQuery(); - select.addSelect(f); - select.addFrom(getTable()); - Utils.addConditions(select, this, getPrimaryKey().getFieldsArray()); - - if (select.execute() == 1) { - AbstractRecord record = (AbstractRecord) select.getResult().get(0); - setValues(f, record); + if (rs != null) { + super.refresh(f); } else { - throw new InvalidResultException("Exactly one row expected for refresh. Record does not exist in database."); + + // [#2265] Even if rs was previously closed, re-fetch a new ResultSet + // and assign it to this record, if requested. + SelectQuery select = create().selectQuery(); + select.addSelect(f); + select.addFrom(getTable()); + select.keepResultSet(keepResultSetMode); + Utils.addConditions(select, this, getPrimaryKey().getFieldsArray()); + + if (select.execute() == 1) { + AbstractRecord record = (AbstractRecord) select.getResult().get(0); + setValues(f, record); + + rs = record.rs; + rsIndex = record.rsIndex; + } + else { + throw new InvalidResultException("Exactly one row expected for refresh. Record does not exist in database."); + } } }