in exposed-r2dbc/src/main/kotlin/org/jetbrains/exposed/v1/r2dbc/R2dbcTransaction.kt [252:280]
suspend fun <T, R> exec(stmt: SuspendExecutable<T, *>, body: suspend Statement<T>.(T) -> R): R? {
@OptIn(InternalApi::class)
return withTransactionContext(this) {
statementCount++
val start = System.nanoTime()
val answer = stmt.executeIn(this@R2dbcTransaction)
val delta = (System.nanoTime() - start).let { TimeUnit.NANOSECONDS.toMillis(it) }
val lazySQL = lazy(LazyThreadSafetyMode.NONE) {
answer.second.map { it.sql(this@R2dbcTransaction) }.distinct().joinToString()
}
duration += delta
if (debug) {
statements.append(describeStatement(delta, lazySQL.value))
statementStats.getOrPut(lazySQL.value) { 0 to 0L }.let { (count, time) ->
statementStats[lazySQL.value] = (count + 1) to (time + delta)
}
}
if (delta > (warnLongQueriesDuration ?: Long.MAX_VALUE)) {
exposedLogger.warn("Long query: ${describeStatement(delta, lazySQL.value)}", LongQueryException())
}
answer.first?.let { stmt.statement.body(it) }
}
}