@@ -25,16 +25,30 @@ private fun initSqlite3Database(
25
25
internal suspend fun SQLite3Driver.withSchema (schema : SqlSchema <QueryResult .AsyncValue <Unit >>? = null) =
26
26
this .also { schema?.create(it)?.await() }
27
27
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
+
28
41
class SQLite3Driver internal constructor(private val db : Sqlite3 .Database ) : SqlDriver {
29
42
private val listeners = mutableMapOf<String , MutableSet <Query .Listener >>()
30
- private val statements = mutableMapOf<Int , Sqlite3 .Statement >()
31
43
private var transaction: Transaction ? = null
32
44
33
45
internal inner class Transaction (
34
46
override val enclosingTransaction : Transacter .Transaction ? ,
35
47
) : Transacter.Transaction() {
48
+ internal val statements = mutableMapOf<Int , Sqlite3 .Statement >()
36
49
override fun endTransaction (successful : Boolean ): QueryResult <Unit > = QueryResult .AsyncValue {
37
50
if (enclosingTransaction == null ) {
51
+ statements.onEach { it.value.finalizeSuspending() }
38
52
val sql = if (successful) " END TRANSACTION" else " ROLLBACK TRANSACTION"
39
53
suspendCoroutine<Any ?> { cont ->
40
54
val callback: (Any? ) -> Unit = {
@@ -73,9 +87,9 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
73
87
val res = if (identifier == null ) {
74
88
preparedStatement
75
89
} else {
76
- statements.getOrPut(identifier) {
90
+ transaction?. statements? .getOrPut(identifier) {
77
91
return @getOrPut preparedStatement
78
- }
92
+ } ? : preparedStatement
79
93
}
80
94
return res
81
95
}
@@ -96,6 +110,9 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
96
110
}
97
111
statement.run (callback)
98
112
}
113
+ if (transaction == null ) {
114
+ statement.finalizeSuspending()
115
+ }
99
116
return @AsyncValue 0
100
117
}
101
118
@@ -138,21 +155,6 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
138
155
139
156
internal fun _endTransactionForTests (successful : Boolean ) = transaction?._endTransactionForTests (successful)
140
157
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
-
156
158
override fun addListener (vararg queryKeys : String , listener : Query .Listener ) {
157
159
queryKeys.forEach {
158
160
listeners.getOrPut(it) { mutableSetOf () }.add(listener)
0 commit comments