-
Notifications
You must be signed in to change notification settings - Fork 513
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
commonize WebWorkerDriver. rename
createWebWorkerDriver()
to `creat…
…eDefaultWebWorkerDriver()`. remove unnecessary `jsCommon` group from web-worker-driver.
- Loading branch information
Showing
41 changed files
with
624 additions
and
475 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
141 changes: 141 additions & 0 deletions
141
...-worker-driver/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/WebWorkerDriver.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
package app.cash.sqldelight.driver.worker | ||
|
||
import app.cash.sqldelight.Query | ||
import app.cash.sqldelight.Transacter | ||
import app.cash.sqldelight.db.QueryResult | ||
import app.cash.sqldelight.db.SqlCursor | ||
import app.cash.sqldelight.db.SqlDriver | ||
import app.cash.sqldelight.db.SqlPreparedStatement | ||
import app.cash.sqldelight.driver.worker.api.WorkerAction | ||
import app.cash.sqldelight.driver.worker.api.WorkerActions | ||
import app.cash.sqldelight.driver.worker.api.WorkerResultWithRowCount | ||
import app.cash.sqldelight.driver.worker.api.WorkerWrapperRequest | ||
import app.cash.sqldelight.driver.worker.expected.JsWorkerSqlCursor | ||
import app.cash.sqldelight.driver.worker.expected.JsWorkerSqlPreparedStatement | ||
import app.cash.sqldelight.driver.worker.expected.Worker | ||
import app.cash.sqldelight.driver.worker.expected.checkWorkerResults | ||
|
||
/** | ||
* A [SqlDriver] implementation for interacting with SQL databases running in a Web Worker. | ||
* | ||
* This driver is dialect-agnostic and is instead dependent on the Worker script's implementation | ||
* to handle queries and send results back from the Worker. | ||
* | ||
* @property worker The Worker running a SQL implementation that this driver communicates with. | ||
* @see [WebWorkerDriver.fromScriptUrl] | ||
*/ | ||
class WebWorkerDriver(private val worker: Worker) : SqlDriver { | ||
private val listeners = mutableMapOf<String, MutableSet<Query.Listener>>() | ||
private var messageCounter = 0 | ||
private var transaction: Transacter.Transaction? = null | ||
private val wrapper = WorkerWrapper(worker) | ||
|
||
override fun <R> executeQuery( | ||
identifier: Int?, | ||
sql: String, | ||
mapper: (SqlCursor) -> QueryResult<R>, | ||
parameters: Int, | ||
binders: (SqlPreparedStatement.() -> Unit)?, | ||
): QueryResult<R> { | ||
val bound = JsWorkerSqlPreparedStatement() | ||
binders?.invoke(bound) | ||
|
||
return QueryResult.AsyncValue { | ||
val response = wrapper.sendMessage( | ||
action = WorkerActions.exec, | ||
sql = sql, | ||
statement = bound, | ||
) | ||
|
||
return@AsyncValue mapper(JsWorkerSqlCursor(checkWorkerResults(response.result))).await() | ||
} | ||
} | ||
|
||
override fun execute( | ||
identifier: Int?, | ||
sql: String, | ||
parameters: Int, | ||
binders: (SqlPreparedStatement.() -> Unit)?, | ||
): QueryResult<Long> { | ||
val bound = JsWorkerSqlPreparedStatement() | ||
binders?.invoke(bound) | ||
|
||
return QueryResult.AsyncValue { | ||
val response = wrapper.sendMessage( | ||
action = WorkerActions.exec, | ||
sql = sql, | ||
statement = bound, | ||
) | ||
checkWorkerResults(response.result) | ||
return@AsyncValue response.rowCount | ||
} | ||
} | ||
|
||
override fun addListener(vararg queryKeys: String, listener: Query.Listener) { | ||
queryKeys.forEach { | ||
listeners.getOrPut(it) { mutableSetOf() }.add(listener) | ||
} | ||
} | ||
|
||
override fun removeListener(vararg queryKeys: String, listener: Query.Listener) { | ||
queryKeys.forEach { | ||
listeners[it]?.remove(listener) | ||
} | ||
} | ||
|
||
override fun notifyListeners(vararg queryKeys: String) { | ||
queryKeys.flatMap { listeners[it].orEmpty() } | ||
.distinct() | ||
.forEach(Query.Listener::queryResultsChanged) | ||
} | ||
|
||
override fun close() = wrapper.terminate() | ||
|
||
override fun newTransaction(): QueryResult<Transacter.Transaction> = QueryResult.AsyncValue { | ||
val enclosing = transaction | ||
val transaction = Transaction(enclosing) | ||
this.transaction = transaction | ||
if (enclosing == null) { | ||
wrapper.sendMessage(WorkerActions.beginTransaction) | ||
} | ||
|
||
return@AsyncValue transaction | ||
} | ||
|
||
override fun currentTransaction(): Transacter.Transaction? = transaction | ||
|
||
private inner class Transaction( | ||
override val enclosingTransaction: Transacter.Transaction?, | ||
) : Transacter.Transaction() { | ||
override fun endTransaction(successful: Boolean): QueryResult<Unit> = QueryResult.AsyncValue { | ||
if (enclosingTransaction == null) { | ||
if (successful) { | ||
wrapper.sendMessage(WorkerActions.endTransaction) | ||
} else { | ||
wrapper.sendMessage(WorkerActions.rollbackTransaction) | ||
} | ||
} | ||
transaction = enclosingTransaction | ||
} | ||
} | ||
|
||
private suspend fun WorkerWrapper.sendMessage( | ||
action: WorkerAction, | ||
sql: String? = null, | ||
statement: JsWorkerSqlPreparedStatement? = null, | ||
): WorkerResultWithRowCount { | ||
val id = messageCounter++ | ||
|
||
println("beforeExecute") | ||
|
||
return execute( | ||
WorkerWrapperRequest( | ||
id = id, | ||
action = action, | ||
sql = sql, | ||
statement = statement, | ||
), | ||
) | ||
} | ||
|
||
} |
File renamed without changes.
13 changes: 13 additions & 0 deletions
13
...eb-worker-driver/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/WorkerWrapper.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package app.cash.sqldelight.driver.worker | ||
|
||
import app.cash.sqldelight.driver.worker.api.WorkerResultWithRowCount | ||
import app.cash.sqldelight.driver.worker.api.WorkerWrapperRequest | ||
import app.cash.sqldelight.driver.worker.expected.Worker | ||
|
||
internal expect class WorkerWrapper(worker: Worker) { | ||
suspend fun execute( | ||
request: WorkerWrapperRequest, | ||
): WorkerResultWithRowCount | ||
|
||
fun terminate() | ||
} |
File renamed without changes.
3 changes: 3 additions & 0 deletions
3
...worker-driver/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/api/WorkerResult.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
package app.cash.sqldelight.driver.worker.api | ||
|
||
internal expect interface WorkerResult |
6 changes: 6 additions & 0 deletions
6
...r/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/api/WorkerResultWithRowCount.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package app.cash.sqldelight.driver.worker.api | ||
|
||
internal interface WorkerResultWithRowCount { | ||
val result: WorkerResult | ||
val rowCount: Long | ||
} |
28 changes: 28 additions & 0 deletions
28
...river/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/api/WorkerWrapperRequest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package app.cash.sqldelight.driver.worker.api | ||
|
||
import app.cash.sqldelight.driver.worker.expected.JsWorkerSqlPreparedStatement | ||
|
||
/** | ||
* Messages sent by the SQLDelight driver to the worker. | ||
*/ | ||
internal data class WorkerWrapperRequest( | ||
/** | ||
* A unique identifier used to identify responses to this message | ||
* @see WorkerResponse.id | ||
*/ | ||
val id: Int, | ||
/** | ||
* The action that the worker should run. | ||
* @see WorkerAction | ||
*/ | ||
val action: WorkerAction, | ||
/** | ||
* The SQL to execute | ||
*/ | ||
var sql: String?, | ||
|
||
/** | ||
* SQL parameters to bind to the given [sql] | ||
*/ | ||
var statement: JsWorkerSqlPreparedStatement?, | ||
) |
5 changes: 5 additions & 0 deletions
5
...er/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/expected/CheckWorkerResults.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package app.cash.sqldelight.driver.worker.expected | ||
|
||
import app.cash.sqldelight.driver.worker.api.WorkerResult | ||
|
||
internal expect fun checkWorkerResults(results: WorkerResult?): WorkerResult |
6 changes: 6 additions & 0 deletions
6
...ver/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/expected/JsWorkerSqlCursor.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package app.cash.sqldelight.driver.worker.expected | ||
|
||
import app.cash.sqldelight.db.SqlCursor | ||
import app.cash.sqldelight.driver.worker.api.WorkerResult | ||
|
||
internal expect class JsWorkerSqlCursor(result: WorkerResult) : SqlCursor |
5 changes: 5 additions & 0 deletions
5
...monMain/kotlin/app/cash/sqldelight/driver/worker/expected/JsWorkerSqlPreparedStatement.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package app.cash.sqldelight.driver.worker.expected | ||
|
||
import app.cash.sqldelight.db.SqlPreparedStatement | ||
|
||
internal expect class JsWorkerSqlPreparedStatement() : SqlPreparedStatement |
3 changes: 3 additions & 0 deletions
3
...-worker-driver/src/commonMain/kotlin/app/cash/sqldelight/driver/worker/expected/Worker.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
package app.cash.sqldelight.driver.worker.expected | ||
|
||
expect class Worker |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.