@@ -43,21 +43,20 @@ final class KotlinPowerSyncDatabaseImpl: PowerSyncDatabaseProtocol {
4343
4444 func connect(
4545 connector: PowerSyncBackendConnector ,
46- crudThrottleMs: Int64 = 1000 ,
47- retryDelayMs: Int64 = 5000 ,
48- params: JsonParam = [ : ]
46+ options: ConnectOptions ?
4947 ) async throws {
5048 let connectorAdapter = PowerSyncBackendConnectorAdapter (
5149 swiftBackendConnector: connector,
5250 db: self
5351 )
5452
53+ let resolvedOptions = options ?? ConnectOptions ( )
54+
5555 try await kotlinDatabase. connect (
5656 connector: connectorAdapter,
57- crudThrottleMs: crudThrottleMs,
58- retryDelayMs: retryDelayMs,
59- // We map to basic values and use NSNull to avoid SKIEE thinking the values must be of Any type
60- params: params. mapValues { $0. toValue ( ) ?? NSNull ( ) }
57+ crudThrottleMs: resolvedOptions. crudThrottleMs,
58+ retryDelayMs: resolvedOptions. retryDelayMs,
59+ params: resolvedOptions. params. mapValues { $0. toKotlinMap ( ) }
6160 )
6261 }
6362
@@ -93,6 +92,7 @@ final class KotlinPowerSyncDatabaseImpl: PowerSyncDatabaseProtocol {
9392 )
9493 }
9594
95+ @discardableResult
9696 func execute( sql: String , parameters: [ Any ? ] ? ) async throws -> Int64 {
9797 try await writeTransaction { ctx in
9898 try ctx. execute (
@@ -280,58 +280,85 @@ final class KotlinPowerSyncDatabaseImpl: PowerSyncDatabaseProtocol {
280280 func writeLock< R> (
281281 callback: @escaping ( any ConnectionContext ) throws -> R
282282 ) async throws -> R {
283- return try safeCast (
284- await kotlinDatabase. writeLock (
285- callback: LockCallback (
286- callback: callback
287- )
288- ) ,
289- to: R . self
290- )
283+ return try await wrapPowerSyncException {
284+ try safeCast (
285+ await kotlinDatabase. writeLock (
286+ callback: LockCallback (
287+ callback: callback
288+ )
289+ ) ,
290+ to: R . self
291+ )
292+ }
291293 }
292294
293295 func writeTransaction< R> (
294296 callback: @escaping ( any Transaction ) throws -> R
295297 ) async throws -> R {
296- return try safeCast (
297- await kotlinDatabase. writeTransaction (
298- callback: TransactionCallback (
299- callback: callback
300- )
301- ) ,
302- to: R . self
303- )
298+ return try await wrapPowerSyncException {
299+ try safeCast (
300+ await kotlinDatabase. writeTransaction (
301+ callback: TransactionCallback (
302+ callback: callback
303+ )
304+ ) ,
305+ to: R . self
306+ )
307+ }
304308 }
305309
306310 func readLock< R> (
307311 callback: @escaping ( any ConnectionContext ) throws -> R
308312 )
309313 async throws -> R
310314 {
311- return try safeCast (
312- await kotlinDatabase. readLock (
313- callback: LockCallback (
314- callback: callback
315- )
316- ) ,
317- to: R . self
318- )
315+ return try await wrapPowerSyncException {
316+ try safeCast (
317+ await kotlinDatabase. readLock (
318+ callback: LockCallback (
319+ callback: callback
320+ )
321+ ) ,
322+ to: R . self
323+ )
324+ }
319325 }
320326
321327 func readTransaction< R> (
322328 callback: @escaping ( any Transaction ) throws -> R
323329 ) async throws -> R {
324- return try safeCast (
325- await kotlinDatabase. readTransaction (
326- callback: TransactionCallback (
327- callback: callback
328- )
329- ) ,
330- to: R . self
331- )
330+ return try await wrapPowerSyncException {
331+ try safeCast (
332+ await kotlinDatabase. readTransaction (
333+ callback: TransactionCallback (
334+ callback: callback
335+ )
336+ ) ,
337+ to: R . self
338+ )
339+ }
332340 }
333341
334342 func close( ) async throws {
335343 try await kotlinDatabase. close ( )
336344 }
345+
346+ /// Tries to convert Kotlin PowerSyncExceptions to Swift Exceptions
347+ private func wrapPowerSyncException< R> (
348+ handler: ( ) async throws -> R )
349+ async throws -> R
350+ {
351+ do {
352+ return try await handler ( )
353+ } catch {
354+ // Try and parse errors back from the Kotlin side
355+
356+ if let mapperError = SqlCursorError . fromDescription ( error. localizedDescription) {
357+ throw mapperError
358+ }
359+
360+ // Throw remaining errors as-is
361+ throw error
362+ }
363+ }
337364}
0 commit comments