| 130 | } |
| 131 | |
| 132 | export class TauriSQLiteDriver implements SQLiteDriver { |
| 133 | private readonly database: TauriSQLiteDatabaseLike |
| 134 | private queue: Promise<void> = Promise.resolve() |
| 135 | private nextSavepointId = 1 |
| 136 | |
| 137 | constructor(options: TauriSQLiteDriverOptions) { |
| 138 | if (!isTauriSQLiteDatabaseLike(options.database)) { |
| 139 | throw new InvalidPersistedCollectionConfigError( |
| 140 | `Tauri SQLite database object must provide execute/select methods`, |
| 141 | ) |
| 142 | } |
| 143 | |
| 144 | this.database = options.database |
| 145 | } |
| 146 | |
| 147 | async exec(sql: string): Promise<void> { |
| 148 | await this.enqueue(async () => { |
| 149 | await this.executeStatement(sql) |
| 150 | }) |
| 151 | } |
| 152 | |
| 153 | async query<TRow>( |
| 154 | sql: string, |
| 155 | params: ReadonlyArray<unknown> = [], |
| 156 | ): Promise<ReadonlyArray<TRow>> { |
| 157 | return this.enqueue(async () => { |
| 158 | const rows = await this.database.select<ReadonlyArray<TRow>>( |
| 159 | convertSqlitePlaceholdersToTauri(sql), |
| 160 | params.length > 0 ? [...params] : undefined, |
| 161 | ) |
| 162 | return normalizeQueryRows<TRow>(rows, sql) |
| 163 | }) |
| 164 | } |
| 165 | |
| 166 | async run(sql: string, params: ReadonlyArray<unknown> = []): Promise<void> { |
| 167 | await this.enqueue(async () => { |
| 168 | await this.executeStatement(sql, params) |
| 169 | }) |
| 170 | } |
| 171 | |
| 172 | async transaction<TReturn>( |
| 173 | fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>, |
| 174 | ): Promise<TReturn> { |
| 175 | assertTransactionCallbackHasDriverArg(fn) |
| 176 | return this.transactionWithDriver(fn) |
| 177 | } |
| 178 | |
| 179 | async transactionWithDriver<TReturn>( |
| 180 | fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>, |
| 181 | ): Promise<TReturn> { |
| 182 | return this.enqueue(async () => { |
| 183 | await this.executeStatement(`BEGIN IMMEDIATE`) |
| 184 | const transactionDriver = this.createTransactionDriver() |
| 185 | |
| 186 | try { |
| 187 | const result = await fn(transactionDriver) |
| 188 | await this.executeStatement(`COMMIT`) |
| 189 | return result |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…