Skip to content

Commit 546dbea

Browse files
author
David Pratt
committed
Fix problem with generated keys ResultSets not being iterable.
1 parent 7118bf1 commit 546dbea

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

src/main/scala/janus/Statement.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ trait Statement {
2525
/**
2626
* Get the generated keys from the most recently executed statement.
2727
*/
28-
def generatedKeys[A](f: Traversable[Row] => A): A
28+
def generatedKeys(): Traversable[Row]
2929

3030
/**
3131
* Get the update count from the most recently executed statement.
@@ -80,7 +80,7 @@ trait PreparedStatement {
8080
/**
8181
* Get the generated keys from the most recently executed statement.
8282
*/
83-
def generatedKeys[A](f: Traversable[Row] => A): A
83+
def generatedKeys(): Traversable[Row]
8484

8585
/**
8686
* Get the update count from the most recently executed statement.
@@ -93,7 +93,7 @@ private[janus] class JdbcStatement(stmt: java.sql.Statement) extends Statement {
9393

9494
def execute(sql: String): Boolean = stmt.execute(sql)
9595

96-
def executeQuery[A](sql: String)(f: Traversable[Row] => A): A = withResultSet(stmt.executeQuery(sql), f)
96+
def executeQuery[A](sql: String)(f: Traversable[Row] => A): A = mapResultSet(stmt.executeQuery(sql), f)
9797

9898
def executeUpdate(sql: String, returnAutoGeneratedKeys: Boolean = false): Int = {
9999
val generatedParams = if (returnAutoGeneratedKeys) {
@@ -104,7 +104,7 @@ private[janus] class JdbcStatement(stmt: java.sql.Statement) extends Statement {
104104
stmt.executeUpdate(sql, generatedParams)
105105
}
106106

107-
def generatedKeys[A](f: Traversable[Row] => A): A = withResultSet(stmt.getGeneratedKeys, f)
107+
def generatedKeys() = copyResultSet(stmt.getGeneratedKeys)
108108

109109
def updateCount() = stmt.getUpdateCount
110110
}
@@ -119,7 +119,7 @@ private[janus] class JdbcPreparedStatement(ps: java.sql.PreparedStatement) exten
119119

120120
def execute(): Boolean = ps.execute()
121121

122-
def executeQuery[A](f: Traversable[Row] => A): A = withResultSet(ps.executeQuery, f)
122+
def executeQuery[A](f: Traversable[Row] => A): A = mapResultSet(ps.executeQuery, f)
123123

124124
def executeUpdate(): Int = ps.executeUpdate()
125125

@@ -159,7 +159,7 @@ private[janus] class JdbcPreparedStatement(ps: java.sql.PreparedStatement) exten
159159
}
160160
}
161161

162-
def generatedKeys[A](f: Traversable[Row] => A): A = withResultSet(ps.getGeneratedKeys, f)
162+
def generatedKeys(): Traversable[Row] = copyResultSet(ps.getGeneratedKeys)
163163

164164
def updateCount(): Int = ps.getUpdateCount
165165

src/main/scala/janus/package.scala

+24-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import collection.mutable.ArrayBuffer
12
import concurrent.ExecutionContext
23
import java.sql.ResultSet
34
import org.slf4j.LoggerFactory
@@ -35,16 +36,35 @@ package object janus {
3536

3637
private val log = LoggerFactory.getLogger("janus")
3738

38-
private[janus] def withResultSet[A](rs: ResultSet, f: Traversable[Row] => A): A = {
39-
import JdbcRow._
39+
private[janus] def copyResultSet(resultSet: java.sql.ResultSet): Traversable[Row] = {
40+
41+
val meta = Metadata(resultSet)
42+
val columnRange = 1 to meta.columns.size
43+
def data(rs: java.sql.ResultSet) = {
44+
for (i <- columnRange) yield rs.getObject(i)
45+
}
46+
47+
val rows: ArrayBuffer[Row] = new ArrayBuffer[Row]
4048
try {
41-
f(convertResultSet(rs))
49+
while(resultSet.next()) {
50+
rows.append(JdbcRow(data(resultSet), meta))
51+
}
52+
rows
53+
} finally {
54+
resultSet.close()
55+
}
56+
}
57+
58+
private[janus] def mapResultSet[A](rs: ResultSet, f: Traversable[Row] => A) = {
59+
try {
60+
val wrapped = convertResultSet(rs)
61+
f(wrapped)
4262
} finally {
4363
rs.close()
4464
}
4565
}
4666

47-
def convertResultSet(resultSet: java.sql.ResultSet): Traversable[Row] = {
67+
private def convertResultSet(resultSet: java.sql.ResultSet): Traversable[Row] = {
4868

4969
val meta = Metadata(resultSet)
5070
val columnRange = 1 to meta.columns.size
@@ -65,5 +85,4 @@ package object janus {
6585
}
6686
}
6787
}
68-
6988
}

0 commit comments

Comments
 (0)