All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalaquery.ResultSetInvoker.scala Maven / Gradle / Ivy

package org.scalaquery

import java.sql.{PreparedStatement, ResultSet}
import org.scalaquery.session._
import org.scalaquery.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: Session): ResultSet

  protected def extractValue(rs: PositionedResult): R

  def foreach(param: Unit, f: R => Unit, maxRows: Int)(implicit session: Session) {
    createPR(session) map { rs =>
      try {
        var count = 0
        while(rs.next && (maxRows == 0 || count < maxRows)) {
          f(extractValue(rs))
          count += 1
        }
      } finally { rs.close() }
    }
  }

  def elements(param: Unit)(implicit session: Session): CloseableIterator[R] = {
    createPR(session) map { rs =>
      new ReadAheadIterator[R] with CloseableIterator[R] {
        def close() = rs.close()
        protected def fetchNext() = {
          if(rs.next) Some(extractValue(rs))
          else { close(); None }
        }
      }
    } getOrElse CloseableIterator.empty
  }

  private[this] def createPR(session: Session) =
    Option(createResultSet(session)) map { new PositionedResult(_) { def close() = rs.close() } }
}

object ResultSetInvoker {
  def apply[R](f: Session => ResultSet)(implicit conv: PositionedResult => R): UnitInvoker[R] = new ResultSetInvoker[R] {
    def createResultSet(session: Session) = f(session)
    def extractValue(pr: PositionedResult) = conv (pr)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy