@@ -24,27 +24,32 @@ internal suspend fun SQLite3Driver.withSchema(schema: SqlSchema? = null) = this.
2424class SQLite3Driver internal constructor(private val db : Sqlite3 .Database ) : SqlDriver {
2525 private val listeners = mutableMapOf<String , MutableSet <Query .Listener >>()
2626 private val statements = mutableMapOf<Int , Sqlite3 .Statement >()
27- private var transaction: Transacter . Transaction ? = null
27+ private var transaction: Transaction ? = null
2828
29- private inner class Transaction (
29+ internal inner class Transaction (
3030 override val enclosingTransaction : Transacter .Transaction ? ,
3131 ) : Transacter.Transaction() {
3232 override fun endTransaction (successful : Boolean ): QueryResult <Unit > = QueryResult .AsyncValue {
3333 if (enclosingTransaction == null ) {
3434 val sql = if (successful) " END TRANSACTION" else " ROLLBACK TRANSACTION"
3535 suspendCoroutine { cont ->
36- val callback: (Any ) -> Unit = { self ->
36+ val callback: (Any? ) -> Unit = { self ->
3737 if (self !is Throwable ) {
3838 cont.resume(self as Sqlite3 .Statement )
3939 } else {
4040 cont.resumeWithException(SQLite3Exception (self))
4141 }
4242 }
43- db.run (sql, callback)
43+ db.exec (sql, callback)
4444 }
4545 }
46- transaction = enclosingTransaction
46+ transaction = this
4747 }
48+
49+ /* *
50+ * Use for tests only.
51+ */
52+ internal fun _endTransactionForTests (successful : Boolean ) = endTransaction(successful)
4853 }
4954
5055 private fun createOrGetStatement (identifier : Int? , sql : String ): Sqlite3 .Statement {
@@ -104,14 +109,14 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
104109 this .transaction = transaction
105110 if (enclosing == null ) {
106111 suspendCoroutine { cont ->
107- val callback: (Any ) -> Unit = { self ->
108- if (self !is Throwable ) {
109- cont.resume(self as Sqlite3 . Statement )
112+ val callback: (Any? ) -> Unit = {
113+ if (it == null || it !is Throwable ) {
114+ cont.resume(it )
110115 } else {
111- cont.resumeWithException(SQLite3Exception (self ))
116+ cont.resumeWithException(SQLite3Exception (it ))
112117 }
113118 }
114- db.run (" BEGIN TRANSACTION" , callback)
119+ db.exec (" BEGIN TRANSACTION" , callback)
115120 }
116121 }
117122
@@ -120,6 +125,9 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
120125
121126 override fun currentTransaction (): Transacter .Transaction ? = transaction
122127
128+ internal fun _endTransactionForTests (successful : Boolean ) = transaction?._endTransactionForTests (successful)
129+
130+
123131 override fun addListener (listener : Query .Listener , queryKeys : Array <String >) {
124132 queryKeys.forEach {
125133 listeners.getOrPut(it) { mutableSetOf () }.add(listener)
@@ -153,10 +161,11 @@ class SQLite3Driver internal constructor(private val db: Sqlite3.Database) : Sql
153161 binders(bound)
154162 suspendCoroutine { cont ->
155163 val callback: (Any? ) -> Unit = {
156- if (it is Throwable )
157- cont.resumeWithException(it)
158- else
164+ if (it == null || it !is Throwable ) {
159165 cont.resume(it)
166+ } else {
167+ cont.resumeWithException(it)
168+ }
160169 }
161170 bind(bound.parameters.toTypedArray(), callback)
162171 }
0 commit comments