dave08
07/28/2024, 9:51 AMdave08
07/28/2024, 9:51 AM@OptIn(ExperimentalSerializationApi::class)
class JasyncResultSetDecoder(
val resultSet: ResultSet,
) : AbstractDecoder() {
private var elementIndex = -1
private var rowIndex = -1
override val serializersModule = EmptySerializersModule()
override fun decodeValue(): Any {
return resultSet[rowIndex][elementIndex]
?: error("Error decoding row $rowIndex, $elementIndex in ${resultSet.joinToString { it.joinToString() }}")
}
override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
if (elementIndex == descriptor.elementsCount -1) return CompositeDecoder.DECODE_DONE
return ++elementIndex
}
override fun decodeNotNullMark(): Boolean = resultSet[rowIndex][elementIndex] != null
fun nextRow(): Boolean {
elementIndex = -1
return ++rowIndex < resultSet.size
}
}
@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> decodeFromResultSet(resultSet: ResultSet): List<T> {
val decoder = JasyncResultSetDecoder(resultSet)
val deserializer = T::class.serializer()
return buildList {
while (decoder.nextRow()) {
add(deserializer.deserialize(decoder))
}
}
}
dave08
07/28/2024, 10:23 AMResultSet
derives from List<RowData>
, or should I have made a decoder only for RowData, and handled the ResultSet differently?