in exposed-r2dbc/src/main/kotlin/org/jetbrains/exposed/v1/r2dbc/mappers/ArrayTypeMapper.kt [27:73]
override fun setValue(
statement: Statement,
dialect: DatabaseDialect,
typeMapping: R2dbcTypeMapping,
columnType: IColumnType<*>,
value: Any?,
index: Int
): Boolean {
if (columnType !is ArrayColumnType<*, *>) return false
if (value == null) {
statement.bindNull(index - 1, columnType.arrayDeclaration())
return true
}
if (value !is Array<*>) return false
// Special handling for arrays containing date/time types
if (columnType.delegate is IDateColumnType && dialect !is PostgreSQLDialect) {
// Convert java.sql.Date and java.sql.Timestamp to LocalDate/LocalDateTime/String
// as R2DBC drivers may not support these types directly in arrays
val convertedArray = value.map { element ->
when (element) {
is java.sql.Date -> element.toLocalDate()
is java.sql.Timestamp -> element.toLocalDateTime()
else -> element
}
}.toTypedArray()
val convertedValue = Parameters.`in`(R2dbcType.COLLECTION, convertedArray)
statement.bind(index - 1, convertedValue)
return true
}
if (dialect !is PostgreSQLDialect) {
val convertedValue = Parameters.`in`(R2dbcType.COLLECTION, value)
statement.bind(index - 1, convertedValue)
return true
}
val result = when (val dimension = columnType.dimensions) {
1 -> mapPgArray(dialect, typeMapping, columnType, value)
else -> error("Unsupported array dimension: $dimension. https://github.com/pgjdbc/r2dbc-postgresql#data-type-mapping")
}
statement.bind(index - 1, result)
return true
}