import anorm._
import anorm.ParameterValue
import anorm.SqlQuery
/**
* Hack for Oracle to extract inserted id's
*/
object OracleAnorm {
private def defaultParser: RowParser[Row] = RowParser(row => Success(row))
implicit def sqlToOracleSimple(sql: SqlQuery): OracleSimpleSql[Row] = new OracleSimpleSql(sql, Nil, defaultParser)
def OracleSQL(stmt: String) = Sql.sql(stmt)
}
case class OracleSimpleSql[T](sql: SqlQuery,
params: Seq[(String, ParameterValue[_])],
defaultParser: RowParser[T])
extends Sql {
def on1(args: (Any, ParameterValue[_])*): OracleSimpleSql[T] = this.copy(params = (this.params) ++ args.map {
case (s: Symbol, v) => (s.name, v) case (k, v) => (k.toString, v)
})
def onParams(args: ParameterValue[_]*): OracleSimpleSql[T] = this.copy(params = (this.params) ++ sql.argsInitialOrder.zip(args))
def list()(implicit connection: java.sql.Connection): Seq[T] = as(defaultParser*)
def single()(implicit connection: java.sql.Connection): T = as(ResultSetParser.single(defaultParser))
def singleOpt()(implicit connection: java.sql.Connection): Option[T] = as(ResultSetParser.singleOpt(defaultParser))
def getFilledStatement(connection: java.sql.Connection, getGeneratedKeys: Boolean = false) = {
// hack for oracle as it does not support Statement.RETURN_GENERATED_KEYS
val s = if (getGeneratedKeys) connection.prepareStatement(sql.query, Array(1))
else connection.prepareStatement(sql.query)
sql.queryTimeout.foreach(timeout => s.setQueryTimeout(timeout))
val argsMap = Map(params: _*)
sql.argsInitialOrder.map(argsMap)
.zipWithIndex
.map(_.swap)
.foldLeft(s)((s, e) => { e._2.set(s, e._1 + 1); s })
}
def using[U](p: RowParser[U]): OracleSimpleSql[U] = OracleSimpleSql(sql, params, p)
def withQueryTimeout(seconds: Option[Int]): OracleSimpleSql[T] = this.copy(sql = sql.withQueryTimeout(seconds))
}