suspend fun exec()

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) }
        }
    }