/
ResultSetInvoker.scala
35 lines (29 loc) · 1.21 KB
/
ResultSetInvoker.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package scala.slick.jdbc
import java.sql.ResultSet
import scala.slick.util.CloseableIterator
/**
* An invoker which calls a function to retrieve a ResultSet. This can be used
* for reading information from a java.sql.DatabaseMetaData object which has
* many methods that return ResultSets.
*
* For convenience, if the function returns null, this is treated like an
* empty ResultSet.
*/
abstract class ResultSetInvoker[+R] extends UnitInvokerMixin[R] { self =>
protected def createResultSet(session: JdbcBackend#Session): ResultSet
def iteratorTo(param: Unit, maxRows: Int)(implicit session: JdbcBackend#Session): CloseableIterator[R] = {
val rs = createResultSet(session)
if(rs eq null) CloseableIterator.empty
else new PositionedResultIterator[R](rs, maxRows) {
def closeUnderlying() = rs.close()
def extractValue() = self.extractValue(this)
}
}
protected def extractValue(pr: PositionedResult): R
}
object ResultSetInvoker {
def apply[R](f: JdbcBackend#Session => ResultSet)(implicit conv: PositionedResult => R): UnitInvoker[R] = new ResultSetInvoker[R] {
def createResultSet(session: JdbcBackend#Session) = f(session)
def extractValue(pr: PositionedResult) = conv (pr)
}
}