|
1 |
| -import sysPath from 'path' |
| 1 | +import sysPath from 'node:path' |
2 | 2 | import tmp from 'tmp-promise'
|
3 | 3 | import SQLite, {sql, valToSql} from './SQLite'
|
4 | 4 |
|
@@ -108,7 +108,7 @@ describe('SQLite', () => {
|
108 | 108 | await extraDb.exec('UPDATE t SET v=v+1 WHERE id=1')
|
109 | 109 | await extraDb.close()
|
110 | 110 | }
|
111 |
| - const Ps = [] |
| 111 | + const Ps: Promise<void>[] = [] |
112 | 112 | for (let i = 0; i < 10; i++) {
|
113 | 113 | Ps.push(openClose())
|
114 | 114 | }
|
@@ -319,13 +319,51 @@ describe('SQLite', () => {
|
319 | 319 | await expect(db.userVersion()).resolves.toBe(5)
|
320 | 320 | })
|
321 | 321 |
|
| 322 | + test.only('concurrent userVersion()', async () => { |
| 323 | + const dir = await tmp.dir({unsafeCleanup: true, prefix: 'sqlite-test-'}) |
| 324 | + const {path} = dir |
| 325 | + const file = sysPath.join(path, 'db') |
| 326 | + const db1 = new SQLite({file}) |
| 327 | + const db2 = new SQLite({file}) |
| 328 | + try { |
| 329 | + const p1 = db1.userVersion() |
| 330 | + const p2 = db2.userVersion() |
| 331 | + expect(await Promise.all([p1, p2])).toEqual([0, 0]) |
| 332 | + await db1.userVersion(5) |
| 333 | + expect(await Promise.all([db1.userVersion(), db2.userVersion()])).toEqual( |
| 334 | + [5, 5] |
| 335 | + ) |
| 336 | + |
| 337 | + let writer, waiter |
| 338 | + const writerP = new Promise(r => (writer = r)) |
| 339 | + const waiterP = new Promise(r => (waiter = r)) |
| 340 | + |
| 341 | + const db1Done = db1.__withTransaction(async () => { |
| 342 | + await db1.userVersion(10) |
| 343 | + writer() |
| 344 | + await waiterP |
| 345 | + }) |
| 346 | + |
| 347 | + await writerP |
| 348 | + expect(await db1.userVersion()).toBe(10) |
| 349 | + expect(await db2.userVersion()).toBe(5) |
| 350 | + waiter!() |
| 351 | + await db1Done |
| 352 | + expect(await db2.userVersion()).toBe(10) |
| 353 | + } finally { |
| 354 | + await db1.close() |
| 355 | + await db2.close() |
| 356 | + await dir.cleanup() |
| 357 | + } |
| 358 | + }) |
| 359 | + |
322 | 360 | test('.each()', async () => {
|
323 | 361 | const db = new SQLite()
|
324 | 362 | await db.exec(
|
325 | 363 | `CREATE TABLE foo(hi NUMBER); INSERT INTO foo VALUES (42),(43);`
|
326 | 364 | )
|
327 | 365 | for (let i = 0; i < 100; i++) await db.run('INSERT INTO FOO VALUES(?)', i)
|
328 |
| - const arr = [] |
| 366 | + const arr: number[] = [] |
329 | 367 | let flag = false
|
330 | 368 | await db.each(`SELECT * FROM foo`, ({hi}) => {
|
331 | 369 | // it should wait until db.each is done
|
|
0 commit comments