@@ -25,16 +25,30 @@ private fun initSqlite3Database(
2525internal suspend fun SQLite3Driver.withSchema (schema : SqlSchema <QueryResult .AsyncValue <Unit >>? = null) =
2626 this .also { schema?.create(it)?.await() }
2727
28+ internal suspend fun (Sqlite3 .Statement ).finalizeSuspending() {
29+ suspendCoroutine<Any ?> { cont ->
30+ val callback: (err: Error ? ) -> Unit = {
31+ if (it == null ) {
32+ cont.resume(it)
33+ } else {
34+ cont.resumeWithException(SQLite3JsException (it))
35+ }
36+ }
37+ finalize(callback)
38+ }
39+ }
40+
2841class SQLite3Driver internal constructor(private val db : Sqlite3 .Database ) : SqlDriver {
2942 private val listeners = mutableMapOf<String , MutableSet <Query .Listener >>()
30- private val statements = mutableMapOf<Int , Sqlite3 .Statement >()
3143 private var transaction: Transaction ? = null
3244
3345 internal inner class Transaction (
3446 override val enclosingTransaction : Transacter .Transaction ? ,
3547 ) : Transacter.Transaction() {
48+ internal val statements = mutableMapOf<Int , Sqlite3 .Statement >()
3649 override fun endTransaction (successful : Boolean ): QueryResult <Unit > = QueryResult .AsyncValue {
3750 if (enclosingTransaction == null ) {
51+ statements.onEach { it.value.finalizeSuspending() }
3852 val sql = if (successful) " END TRANSACTION" else " ROLLBACK TRANSACTION"
3953 suspendCoroutine<Any ?> { cont ->
4054 val callback: (Any? ) -> Unit = {
@@ -73,9 +87,9 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
7387 val res = if (identifier == null ) {
7488 preparedStatement
7589 } else {
76- statements.getOrPut(identifier) {
90+ transaction?. statements? .getOrPut(identifier) {
7791 return @getOrPut preparedStatement
78- }
92+ } ? : preparedStatement
7993 }
8094 return res
8195 }
@@ -96,6 +110,9 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
96110 }
97111 statement.run (callback)
98112 }
113+ if (transaction == null ) {
114+ statement.finalizeSuspending()
115+ }
99116 return @AsyncValue 0
100117 }
101118
@@ -138,21 +155,6 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
138155
139156 internal fun _endTransactionForTests (successful : Boolean ) = transaction?._endTransactionForTests (successful)
140157
141- internal suspend fun _finalizeAllStatements () {
142- statements.onEach { statement ->
143- suspendCoroutine<Any ?> { cont ->
144- val callback: (err: Error ? ) -> Unit = {
145- if (it == null ) {
146- cont.resume(it)
147- } else {
148- cont.resumeWithException(SQLite3JsException (it))
149- }
150- }
151- statement.value.finalize(callback)
152- }
153- }
154- }
155-
156158 override fun addListener (vararg queryKeys : String , listener : Query .Listener ) {
157159 queryKeys.forEach {
158160 listeners.getOrPut(it) { mutableSetOf () }.add(listener)
0 commit comments