可发送的SQLite语句

3b6akqbq  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(156)

我正在用Swift编写自己的SQLite Package 器,我想知道SQLite语句是否可以设置为Sendable,或者将其设置为actor是否更好。

import SQLite

struct Statement: Sendable {
    private(set) var handle: OpaquePointer?

    init(sql: String, connection: OpaquePointer) {
        sqlite3_prepare_v2(connection, sql, -1, &handle, nil)
    }

    public func finalize() {
        guard let handle else { return }
        sqlite3_finalize(handle)
    }
}

// Resulting in
let connection: OpaquePointer = ...
let statement = Statement(sql: "", connection: connection)
statement.finalize()

或使用执行元实现

import SQLite3

actor Statement {
    private(set) var handle: OpaquePointer?

    init(sql: String, connection: OpaquePointer) {
        sqlite3_prepare_v2(connection, sql, -1, &handle, nil)
    }

    public func finalize() {
        guard let handle else { return }
        sqlite3_finalize(handle)
    }
}

// Resulting in
let connection: OpaquePointer = ...
let statement = Statement(sql: "", connection: connection)
await statement.finalize()

我最感兴趣的是SendableOpaquePointer有何影响,以及actor实现是否可能解决OpaquePointer的潜在问题。SQLite语法让我相信它是“按引用传递”的,即使我假设语句可以或应该“按值传递”,因此我使用了struct Statement: Sendable协议。我只是不确定这是否会奏效。

ars1skjm

ars1skjm1#

根据定义,OpaquePointer是引用类型(因为它是C指针)。
关于通过参与者提供同步,SQLite有三个threading modes,iOS的默认设置是从多个线程使用数据库连接是安全的,但不能同时使用。所以,是的,你会想要用一个演员。

相关问题