relate icon indicating copy to clipboard operation
relate copied to clipboard

TupleParameter ignores how paramters insert placeholders.

Open arturaz opened this issue 7 years ago • 0 comments

For example:

Given:

case class CustomTypeParameter(str: String, sqlType: String) extends SingleParameter {
  override protected def set(statement: PreparedStatement, i: Int): Unit =
    statement.setString(i, str)

  override def appendPlaceholders(stringBuilder: StringBuilder) = {
    super.appendPlaceholders(stringBuilder)
    val _ = stringBuilder.append(s"::$sqlType")
  }
}

This code:

class TupleParameter(val params: Iterable[SingleParameter]) extends MultipleParameter {
  def appendPlaceholders(stringBuilder: StringBuilder) = {
    val length = params.size
    if(length > 0) {
      stringBuilder.append("?")
      var i = 1
      while (i < length) {
        stringBuilder.append(",?")
        i += 1
      }
    }
  }
}

produces ?, instead of ?::someSqlType.

This can be improved by

case class BetterTupleParameter(params: Iterable[SingleParameter]) extends MultipleParameter {
  def appendPlaceholders(stringBuilder: StringBuilder) = {
    var first = true
    params.foreach { param =>
      if (!first) stringBuilder.append(',')
      param.appendPlaceholders(stringBuilder)
      first = false
    }
  }
}
object BetterTupleParameter {
  implicit def fromIterable[A](
    it: Iterable[A]
  )(implicit ev: A => SingleParameter): BetterTupleParameter = 
    apply(it.map(ev))
}

arturaz avatar Mar 08 '18 13:03 arturaz