@livestore/wa-sqlite 0.4.0-dev.22 → 0.4.0-dev.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -36
- package/dist/README.md +13 -13
- package/dist/fts5/wa-sqlite.mjs +1 -1
- package/dist/fts5/wa-sqlite.node.mjs +1 -1
- package/dist/fts5/wa-sqlite.node.wasm +0 -0
- package/dist/fts5/wa-sqlite.wasm +0 -0
- package/dist/wa-sqlite-async.mjs +1 -1
- package/dist/wa-sqlite-async.wasm +0 -0
- package/dist/wa-sqlite-jspi.mjs +1 -1
- package/dist/wa-sqlite-jspi.wasm +0 -0
- package/dist/wa-sqlite.mjs +1 -1
- package/dist/wa-sqlite.node.mjs +1 -1
- package/dist/wa-sqlite.node.wasm +0 -0
- package/dist/wa-sqlite.wasm +0 -0
- package/package.json +40 -29
- package/src/FacadeVFS.js +252 -261
- package/src/VFS.js +84 -85
- package/src/WebLocksMixin.js +357 -351
- package/src/examples/AccessHandlePoolVFS.js +185 -194
- package/src/examples/IDBBatchAtomicVFS.js +429 -409
- package/src/examples/IDBMirrorVFS.js +402 -409
- package/src/examples/MemoryAsyncVFS.js +32 -37
- package/src/examples/MemoryVFS.js +71 -75
- package/src/examples/OPFSAdaptiveVFS.js +206 -206
- package/src/examples/OPFSAnyContextVFS.js +141 -140
- package/src/examples/OPFSCoopSyncVFS.js +297 -299
- package/src/examples/OPFSPermutedVFS.js +529 -540
- package/src/examples/README.md +27 -15
- package/src/examples/tag.js +27 -27
- package/src/sqlite-api.js +910 -941
- package/src/sqlite-constants.js +246 -232
- package/src/types/globals.d.ts +52 -52
- package/src/types/index.d.ts +586 -576
- package/test/AccessHandlePoolVFS.test.js +21 -21
- package/test/IDBBatchAtomicVFS.test.js +69 -69
- package/test/IDBMirrorVFS.test.js +21 -21
- package/test/MemoryAsyncVFS.test.js +21 -21
- package/test/MemoryVFS.test.js +21 -21
- package/test/OPFSAdaptiveVFS.test.js +21 -21
- package/test/OPFSAnyContextVFS.test.js +21 -21
- package/test/OPFSCoopSyncVFS.test.js +21 -21
- package/test/OPFSPermutedVFS.test.js +21 -21
- package/test/TestContext.js +44 -41
- package/test/WebLocksMixin.test.js +369 -360
- package/test/api.test.js +23 -23
- package/test/api_exec.js +72 -61
- package/test/api_misc.js +53 -54
- package/test/api_statements.js +271 -279
- package/test/callbacks.test.js +492 -478
- package/test/data/idbv5.json +1135 -1
- package/test/sql.test.js +30 -30
- package/test/sql_0001.js +49 -33
- package/test/sql_0002.js +55 -34
- package/test/sql_0003.js +85 -49
- package/test/sql_0004.js +76 -47
- package/test/sql_0005.js +60 -44
- package/test/test-worker.js +171 -163
- package/test/vfs_xAccess.js +1 -2
- package/test/vfs_xClose.js +50 -49
- package/test/vfs_xOpen.js +73 -72
- package/test/vfs_xRead.js +31 -31
- package/test/vfs_xWrite.js +30 -29
package/test/sql.test.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { sql_0001 } from './sql_0001.js'
|
|
2
|
+
import { sql_0002 } from './sql_0002.js'
|
|
3
|
+
import { sql_0003 } from './sql_0003.js'
|
|
4
|
+
import { sql_0004 } from './sql_0004.js'
|
|
5
|
+
import { sql_0005 } from './sql_0005.js'
|
|
6
|
+
import { TestContext } from './TestContext.js'
|
|
7
7
|
|
|
8
|
-
const ALL_BUILDS = ['default', 'asyncify', 'jspi']
|
|
9
|
-
const ASYNC_BUILDS = ['asyncify', 'jspi']
|
|
8
|
+
const ALL_BUILDS = ['default', 'asyncify', 'jspi']
|
|
9
|
+
const ASYNC_BUILDS = ['asyncify', 'jspi']
|
|
10
10
|
|
|
11
11
|
// Not all browsers support JSPI yet.
|
|
12
|
-
const supportsJSPI = await TestContext.supportsJSPI()
|
|
12
|
+
const supportsJSPI = await TestContext.supportsJSPI()
|
|
13
13
|
|
|
14
14
|
/** @type {Map<string, string[]>} */
|
|
15
15
|
const CONFIGS = new Map([
|
|
@@ -23,42 +23,42 @@ const CONFIGS = new Map([
|
|
|
23
23
|
['OPFSAdaptiveVFS', ASYNC_BUILDS],
|
|
24
24
|
['OPFSAnyContextVFS', ASYNC_BUILDS],
|
|
25
25
|
['OPFSPermutedVFS', ASYNC_BUILDS],
|
|
26
|
-
])
|
|
26
|
+
])
|
|
27
27
|
|
|
28
|
-
const DISALLOWS_PAGE_SIZE_CHANGE = ['IDBBatchAtomicVFS', 'IDBMirrorVFS', 'OPFSPermutedVFS', 'FLOOR']
|
|
29
|
-
const NOT_PERSISTENT = ['', 'MemoryVFS', 'MemoryAsyncVFS']
|
|
30
|
-
const SINGLE_CONNECTION = ['', 'MemoryVFS', 'MemoryAsyncVFS', 'AccessHandlePoolVFS']
|
|
28
|
+
const DISALLOWS_PAGE_SIZE_CHANGE = new Set(['IDBBatchAtomicVFS', 'IDBMirrorVFS', 'OPFSPermutedVFS', 'FLOOR'])
|
|
29
|
+
const NOT_PERSISTENT = new Set(['', 'MemoryVFS', 'MemoryAsyncVFS'])
|
|
30
|
+
const SINGLE_CONNECTION = new Set(['', 'MemoryVFS', 'MemoryAsyncVFS', 'AccessHandlePoolVFS'])
|
|
31
31
|
|
|
32
|
-
describe('SQL', function() {
|
|
32
|
+
describe('SQL', function () {
|
|
33
33
|
for (const [config, builds] of CONFIGS) {
|
|
34
|
-
describe(config, function() {
|
|
34
|
+
describe(config, function () {
|
|
35
35
|
for (const build of builds) {
|
|
36
36
|
// Skip JSPI tests if the browser does not support it.
|
|
37
|
-
if (build === 'jspi' && !supportsJSPI) continue
|
|
37
|
+
if (build === 'jspi' && !supportsJSPI) continue
|
|
38
38
|
|
|
39
|
-
describe(build, function() {
|
|
40
|
-
sqlSpecs(build, config)
|
|
41
|
-
})
|
|
39
|
+
describe(build, function () {
|
|
40
|
+
sqlSpecs(build, config)
|
|
41
|
+
})
|
|
42
42
|
}
|
|
43
|
-
})
|
|
43
|
+
})
|
|
44
44
|
}
|
|
45
|
-
})
|
|
45
|
+
})
|
|
46
46
|
|
|
47
47
|
function sqlSpecs(build, config) {
|
|
48
|
-
const context = new TestContext({ build, config })
|
|
48
|
+
const context = new TestContext({ build, config })
|
|
49
49
|
|
|
50
|
-
sql_0001(context)
|
|
51
|
-
sql_0002(context)
|
|
52
|
-
if (!DISALLOWS_PAGE_SIZE_CHANGE.
|
|
50
|
+
sql_0001(context)
|
|
51
|
+
sql_0002(context)
|
|
52
|
+
if (!DISALLOWS_PAGE_SIZE_CHANGE.has(config)) {
|
|
53
53
|
// These tests change the page size.
|
|
54
|
-
sql_0003(context)
|
|
54
|
+
sql_0003(context)
|
|
55
55
|
}
|
|
56
|
-
if (!NOT_PERSISTENT.
|
|
56
|
+
if (!NOT_PERSISTENT.has(config)) {
|
|
57
57
|
// These tests require persistent storage.
|
|
58
|
-
sql_0004(context)
|
|
58
|
+
sql_0004(context)
|
|
59
59
|
}
|
|
60
|
-
if (!SINGLE_CONNECTION.
|
|
60
|
+
if (!SINGLE_CONNECTION.has(config)) {
|
|
61
61
|
// These tests require multiple connections.
|
|
62
|
-
sql_0005(context)
|
|
62
|
+
sql_0005(context)
|
|
63
63
|
}
|
|
64
64
|
}
|
package/test/sql_0001.js
CHANGED
|
@@ -1,49 +1,65 @@
|
|
|
1
|
-
import * as Comlink from 'comlink'
|
|
1
|
+
import * as Comlink from 'comlink'
|
|
2
2
|
|
|
3
3
|
export function sql_0001(context) {
|
|
4
|
-
describe('sql_0001', function() {
|
|
5
|
-
let proxy, sqlite3, db
|
|
6
|
-
beforeEach(async function() {
|
|
7
|
-
proxy = await context.create()
|
|
8
|
-
sqlite3 = proxy.sqlite3
|
|
9
|
-
db = await sqlite3.open_v2('demo')
|
|
10
|
-
})
|
|
4
|
+
describe('sql_0001', function () {
|
|
5
|
+
let proxy, sqlite3, db
|
|
6
|
+
beforeEach(async function () {
|
|
7
|
+
proxy = await context.create()
|
|
8
|
+
sqlite3 = proxy.sqlite3
|
|
9
|
+
db = await sqlite3.open_v2('demo')
|
|
10
|
+
})
|
|
11
11
|
|
|
12
|
-
afterEach(async function() {
|
|
13
|
-
await sqlite3.close(db)
|
|
14
|
-
await context.destroy(proxy)
|
|
15
|
-
})
|
|
12
|
+
afterEach(async function () {
|
|
13
|
+
await sqlite3.close(db)
|
|
14
|
+
await context.destroy(proxy)
|
|
15
|
+
})
|
|
16
16
|
|
|
17
|
-
it('should rollback a transaction', async function() {
|
|
18
|
-
let count
|
|
19
|
-
await sqlite3.exec(
|
|
17
|
+
it('should rollback a transaction', async function () {
|
|
18
|
+
let count
|
|
19
|
+
await sqlite3.exec(
|
|
20
|
+
db,
|
|
21
|
+
`
|
|
20
22
|
CREATE TABLE foo (x PRIMARY KEY);
|
|
21
23
|
INSERT INTO foo VALUES ('foo'), ('bar'), ('baz');
|
|
22
24
|
SELECT COUNT(*) FROM foo;
|
|
23
|
-
`,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
count
|
|
27
|
-
|
|
25
|
+
`,
|
|
26
|
+
Comlink.proxy((row) => (count = row[0])),
|
|
27
|
+
)
|
|
28
|
+
expect(count).toBe(3)
|
|
29
|
+
|
|
30
|
+
count = undefined
|
|
31
|
+
await sqlite3.exec(
|
|
32
|
+
db,
|
|
33
|
+
`
|
|
28
34
|
BEGIN TRANSACTION;
|
|
29
35
|
WITH numbers(n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM numbers LIMIT 100)
|
|
30
36
|
INSERT INTO foo SELECT * FROM numbers;
|
|
31
37
|
SELECT COUNT(*) FROM foo;
|
|
32
|
-
`,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
count
|
|
36
|
-
|
|
38
|
+
`,
|
|
39
|
+
Comlink.proxy((row) => (count = row[0])),
|
|
40
|
+
)
|
|
41
|
+
expect(count).toBe(103)
|
|
42
|
+
|
|
43
|
+
count = undefined
|
|
44
|
+
await sqlite3.exec(
|
|
45
|
+
db,
|
|
46
|
+
`
|
|
37
47
|
ROLLBACK;
|
|
38
48
|
SELECT COUNT(*) FROM foo;
|
|
39
|
-
`,
|
|
40
|
-
|
|
49
|
+
`,
|
|
50
|
+
Comlink.proxy((row) => (count = row[0])),
|
|
51
|
+
)
|
|
52
|
+
expect(count).toBe(3)
|
|
41
53
|
|
|
42
|
-
let checkStatus
|
|
43
|
-
await sqlite3.exec(
|
|
54
|
+
let checkStatus
|
|
55
|
+
await sqlite3.exec(
|
|
56
|
+
db,
|
|
57
|
+
`
|
|
44
58
|
PRAGMA integrity_check;
|
|
45
|
-
`,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
59
|
+
`,
|
|
60
|
+
Comlink.proxy((row) => (checkStatus = row[0])),
|
|
61
|
+
)
|
|
62
|
+
expect(checkStatus).toBe('ok')
|
|
63
|
+
})
|
|
64
|
+
})
|
|
49
65
|
}
|
package/test/sql_0002.js
CHANGED
|
@@ -1,52 +1,73 @@
|
|
|
1
|
-
import * as Comlink from 'comlink'
|
|
1
|
+
import * as Comlink from 'comlink'
|
|
2
2
|
|
|
3
3
|
export function sql_0002(context) {
|
|
4
|
-
describe('sql_0002', function() {
|
|
5
|
-
let proxy, sqlite3, db
|
|
6
|
-
beforeEach(async function() {
|
|
7
|
-
proxy = await context.create()
|
|
8
|
-
sqlite3 = proxy.sqlite3
|
|
9
|
-
db = await sqlite3.open_v2('demo')
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
afterEach(async function() {
|
|
13
|
-
await sqlite3.close(db)
|
|
14
|
-
await context.destroy(proxy)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('should vacuum to minimize page count', async function() {
|
|
18
|
-
await sqlite3.exec(
|
|
4
|
+
describe('sql_0002', function () {
|
|
5
|
+
let proxy, sqlite3, db
|
|
6
|
+
beforeEach(async function () {
|
|
7
|
+
proxy = await context.create()
|
|
8
|
+
sqlite3 = proxy.sqlite3
|
|
9
|
+
db = await sqlite3.open_v2('demo')
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
afterEach(async function () {
|
|
13
|
+
await sqlite3.close(db)
|
|
14
|
+
await context.destroy(proxy)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it('should vacuum to minimize page count', async function () {
|
|
18
|
+
await sqlite3.exec(
|
|
19
|
+
db,
|
|
20
|
+
`
|
|
19
21
|
CREATE TABLE t AS
|
|
20
22
|
WITH numbers(n) AS
|
|
21
23
|
(SELECT 1 UNION ALL SELECT n + 1 FROM numbers LIMIT 10000)
|
|
22
24
|
SELECT n FROM numbers;
|
|
23
|
-
|
|
25
|
+
`,
|
|
26
|
+
)
|
|
24
27
|
|
|
25
|
-
let nPagesBeforeVacuum
|
|
26
|
-
await sqlite3.exec(
|
|
28
|
+
let nPagesBeforeVacuum
|
|
29
|
+
await sqlite3.exec(
|
|
30
|
+
db,
|
|
31
|
+
`
|
|
27
32
|
PRAGMA page_count;
|
|
28
|
-
`,
|
|
33
|
+
`,
|
|
34
|
+
Comlink.proxy((row) => (nPagesBeforeVacuum = row[0])),
|
|
35
|
+
)
|
|
29
36
|
|
|
30
|
-
await sqlite3.exec(
|
|
37
|
+
await sqlite3.exec(
|
|
38
|
+
db,
|
|
39
|
+
`
|
|
31
40
|
DELETE FROM t WHERE sqrt(n) != floor(sqrt(n));
|
|
32
|
-
|
|
41
|
+
`,
|
|
42
|
+
)
|
|
33
43
|
|
|
34
|
-
await sqlite3.exec(
|
|
44
|
+
await sqlite3.exec(
|
|
45
|
+
db,
|
|
46
|
+
`
|
|
35
47
|
VACUUM;
|
|
36
|
-
|
|
48
|
+
`,
|
|
49
|
+
)
|
|
37
50
|
|
|
38
|
-
let nPagesAfterVacuum
|
|
39
|
-
await sqlite3.exec(
|
|
51
|
+
let nPagesAfterVacuum
|
|
52
|
+
await sqlite3.exec(
|
|
53
|
+
db,
|
|
54
|
+
`
|
|
40
55
|
PRAGMA page_count;
|
|
41
|
-
`,
|
|
56
|
+
`,
|
|
57
|
+
Comlink.proxy((row) => (nPagesAfterVacuum = row[0])),
|
|
58
|
+
)
|
|
42
59
|
|
|
43
|
-
expect(nPagesAfterVacuum).toBeLessThan(nPagesBeforeVacuum)
|
|
60
|
+
expect(nPagesAfterVacuum).toBeLessThan(nPagesBeforeVacuum)
|
|
44
61
|
|
|
45
|
-
let checkStatus
|
|
46
|
-
await sqlite3.exec(
|
|
62
|
+
let checkStatus
|
|
63
|
+
await sqlite3.exec(
|
|
64
|
+
db,
|
|
65
|
+
`
|
|
47
66
|
PRAGMA integrity_check;
|
|
48
|
-
`,
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
67
|
+
`,
|
|
68
|
+
Comlink.proxy((row) => (checkStatus = row[0])),
|
|
69
|
+
)
|
|
70
|
+
expect(checkStatus).toBe('ok')
|
|
71
|
+
})
|
|
72
|
+
})
|
|
52
73
|
}
|
package/test/sql_0003.js
CHANGED
|
@@ -1,83 +1,119 @@
|
|
|
1
|
-
import * as Comlink from 'comlink'
|
|
1
|
+
import * as Comlink from 'comlink'
|
|
2
2
|
|
|
3
3
|
export function sql_0003(context) {
|
|
4
|
-
describe('sql_0003', function() {
|
|
5
|
-
let proxy, sqlite3, db
|
|
6
|
-
beforeEach(async function() {
|
|
7
|
-
proxy = await context.create()
|
|
8
|
-
sqlite3 = proxy.sqlite3
|
|
9
|
-
db = await sqlite3.open_v2('demo')
|
|
10
|
-
})
|
|
4
|
+
describe('sql_0003', function () {
|
|
5
|
+
let proxy, sqlite3, db
|
|
6
|
+
beforeEach(async function () {
|
|
7
|
+
proxy = await context.create()
|
|
8
|
+
sqlite3 = proxy.sqlite3
|
|
9
|
+
db = await sqlite3.open_v2('demo')
|
|
10
|
+
})
|
|
11
11
|
|
|
12
|
-
afterEach(async function() {
|
|
13
|
-
await sqlite3.close(db)
|
|
14
|
-
await context.destroy(proxy)
|
|
15
|
-
})
|
|
12
|
+
afterEach(async function () {
|
|
13
|
+
await sqlite3.close(db)
|
|
14
|
+
await context.destroy(proxy)
|
|
15
|
+
})
|
|
16
16
|
|
|
17
|
-
it('should vacuum to decrease page size', async function() {
|
|
18
|
-
await sqlite3.exec(
|
|
17
|
+
it('should vacuum to decrease page size', async function () {
|
|
18
|
+
await sqlite3.exec(
|
|
19
|
+
db,
|
|
20
|
+
`
|
|
19
21
|
PRAGMA page_size=8192;
|
|
20
22
|
CREATE TABLE t AS
|
|
21
23
|
WITH numbers(n) AS
|
|
22
24
|
(SELECT 1 UNION ALL SELECT n + 1 FROM numbers LIMIT 10000)
|
|
23
25
|
SELECT n FROM numbers;
|
|
24
|
-
|
|
26
|
+
`,
|
|
27
|
+
)
|
|
25
28
|
|
|
26
|
-
let pageSizeBeforeVacuum
|
|
27
|
-
await sqlite3.exec(
|
|
29
|
+
let pageSizeBeforeVacuum
|
|
30
|
+
await sqlite3.exec(
|
|
31
|
+
db,
|
|
32
|
+
`
|
|
28
33
|
PRAGMA page_size;
|
|
29
|
-
`,
|
|
30
|
-
|
|
34
|
+
`,
|
|
35
|
+
Comlink.proxy((row) => (pageSizeBeforeVacuum = row[0])),
|
|
36
|
+
)
|
|
37
|
+
expect(pageSizeBeforeVacuum).toBe(8192)
|
|
31
38
|
|
|
32
|
-
await sqlite3.exec(
|
|
39
|
+
await sqlite3.exec(
|
|
40
|
+
db,
|
|
41
|
+
`
|
|
33
42
|
PRAGMA page_size=4096;
|
|
34
43
|
VACUUM;
|
|
35
|
-
|
|
44
|
+
`,
|
|
45
|
+
)
|
|
36
46
|
|
|
37
|
-
let pageSizeAfterVacuum
|
|
38
|
-
await sqlite3.exec(
|
|
47
|
+
let pageSizeAfterVacuum
|
|
48
|
+
await sqlite3.exec(
|
|
49
|
+
db,
|
|
50
|
+
`
|
|
39
51
|
PRAGMA page_size;
|
|
40
|
-
`,
|
|
41
|
-
|
|
52
|
+
`,
|
|
53
|
+
Comlink.proxy((row) => (pageSizeAfterVacuum = row[0])),
|
|
54
|
+
)
|
|
55
|
+
expect(pageSizeAfterVacuum).toBe(4096)
|
|
42
56
|
|
|
43
|
-
let checkStatus
|
|
44
|
-
await sqlite3.exec(
|
|
57
|
+
let checkStatus
|
|
58
|
+
await sqlite3.exec(
|
|
59
|
+
db,
|
|
60
|
+
`
|
|
45
61
|
PRAGMA integrity_check;
|
|
46
|
-
`,
|
|
47
|
-
|
|
48
|
-
|
|
62
|
+
`,
|
|
63
|
+
Comlink.proxy((row) => (checkStatus = row[0])),
|
|
64
|
+
)
|
|
65
|
+
expect(checkStatus).toBe('ok')
|
|
66
|
+
})
|
|
49
67
|
|
|
50
|
-
it('should vacuum to increase page size', async function() {
|
|
51
|
-
await sqlite3.exec(
|
|
68
|
+
it('should vacuum to increase page size', async function () {
|
|
69
|
+
await sqlite3.exec(
|
|
70
|
+
db,
|
|
71
|
+
`
|
|
52
72
|
PRAGMA page_size=8192;
|
|
53
73
|
CREATE TABLE t AS
|
|
54
74
|
WITH numbers(n) AS
|
|
55
75
|
(SELECT 1 UNION ALL SELECT n + 1 FROM numbers LIMIT 10000)
|
|
56
76
|
SELECT n FROM numbers;
|
|
57
|
-
|
|
77
|
+
`,
|
|
78
|
+
)
|
|
58
79
|
|
|
59
|
-
let pageSizeBeforeVacuum
|
|
60
|
-
await sqlite3.exec(
|
|
80
|
+
let pageSizeBeforeVacuum
|
|
81
|
+
await sqlite3.exec(
|
|
82
|
+
db,
|
|
83
|
+
`
|
|
61
84
|
PRAGMA page_size;
|
|
62
|
-
`,
|
|
63
|
-
|
|
85
|
+
`,
|
|
86
|
+
Comlink.proxy((row) => (pageSizeBeforeVacuum = row[0])),
|
|
87
|
+
)
|
|
88
|
+
expect(pageSizeBeforeVacuum).toBe(8192)
|
|
64
89
|
|
|
65
|
-
await sqlite3.exec(
|
|
90
|
+
await sqlite3.exec(
|
|
91
|
+
db,
|
|
92
|
+
`
|
|
66
93
|
PRAGMA page_size=16384;
|
|
67
94
|
VACUUM;
|
|
68
|
-
|
|
95
|
+
`,
|
|
96
|
+
)
|
|
69
97
|
|
|
70
|
-
let pageSizeAfterVacuum
|
|
71
|
-
await sqlite3.exec(
|
|
98
|
+
let pageSizeAfterVacuum
|
|
99
|
+
await sqlite3.exec(
|
|
100
|
+
db,
|
|
101
|
+
`
|
|
72
102
|
PRAGMA page_size;
|
|
73
|
-
`,
|
|
74
|
-
|
|
103
|
+
`,
|
|
104
|
+
Comlink.proxy((row) => (pageSizeAfterVacuum = row[0])),
|
|
105
|
+
)
|
|
106
|
+
expect(pageSizeAfterVacuum).toBe(16384)
|
|
75
107
|
|
|
76
|
-
let checkStatus
|
|
77
|
-
await sqlite3.exec(
|
|
108
|
+
let checkStatus
|
|
109
|
+
await sqlite3.exec(
|
|
110
|
+
db,
|
|
111
|
+
`
|
|
78
112
|
PRAGMA integrity_check;
|
|
79
|
-
`,
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
113
|
+
`,
|
|
114
|
+
Comlink.proxy((row) => (checkStatus = row[0])),
|
|
115
|
+
)
|
|
116
|
+
expect(checkStatus).toBe('ok')
|
|
117
|
+
})
|
|
118
|
+
})
|
|
83
119
|
}
|
package/test/sql_0004.js
CHANGED
|
@@ -1,81 +1,110 @@
|
|
|
1
|
-
import * as Comlink from 'comlink'
|
|
1
|
+
import * as Comlink from 'comlink'
|
|
2
2
|
|
|
3
3
|
export function sql_0004(context) {
|
|
4
|
-
const cleanup = []
|
|
5
|
-
beforeEach(async function() {
|
|
6
|
-
cleanup.splice(0)
|
|
7
|
-
})
|
|
4
|
+
const cleanup = []
|
|
5
|
+
beforeEach(async function () {
|
|
6
|
+
cleanup.splice(0)
|
|
7
|
+
})
|
|
8
8
|
|
|
9
|
-
afterEach(async function() {
|
|
9
|
+
afterEach(async function () {
|
|
10
10
|
for (const fn of cleanup) {
|
|
11
|
-
await fn()
|
|
11
|
+
await fn()
|
|
12
12
|
}
|
|
13
|
-
})
|
|
13
|
+
})
|
|
14
14
|
|
|
15
|
-
describe('sql_0004', function() {
|
|
16
|
-
it('should recover after crash', async function() {
|
|
17
|
-
const proxyA = await context.create()
|
|
15
|
+
describe('sql_0004', function () {
|
|
16
|
+
it('should recover after crash', async function () {
|
|
17
|
+
const proxyA = await context.create()
|
|
18
18
|
try {
|
|
19
|
-
const sqlite3 = proxyA.sqlite3
|
|
20
|
-
const db = await sqlite3.open_v2('demo')
|
|
21
|
-
await sqlite3.exec(
|
|
19
|
+
const sqlite3 = proxyA.sqlite3
|
|
20
|
+
const db = await sqlite3.open_v2('demo')
|
|
21
|
+
await sqlite3.exec(
|
|
22
|
+
db,
|
|
23
|
+
`
|
|
22
24
|
PRAGMA cache_size=0;
|
|
23
25
|
CREATE TABLE t(x);
|
|
24
26
|
INSERT INTO t VALUES (1), (2), (3);
|
|
25
|
-
|
|
27
|
+
`,
|
|
28
|
+
)
|
|
26
29
|
|
|
27
|
-
let sum
|
|
28
|
-
await sqlite3.exec(
|
|
30
|
+
let sum
|
|
31
|
+
await sqlite3.exec(
|
|
32
|
+
db,
|
|
33
|
+
`
|
|
29
34
|
SELECT sum(x) FROM t;
|
|
30
|
-
`,
|
|
31
|
-
|
|
35
|
+
`,
|
|
36
|
+
Comlink.proxy((row) => (sum = row[0])),
|
|
37
|
+
)
|
|
38
|
+
expect(sum).toBe(6)
|
|
32
39
|
|
|
33
|
-
let check
|
|
34
|
-
await sqlite3.exec(
|
|
40
|
+
let check
|
|
41
|
+
await sqlite3.exec(
|
|
42
|
+
db,
|
|
43
|
+
`
|
|
35
44
|
PRAGMA integrity_check;
|
|
36
|
-
`,
|
|
37
|
-
|
|
45
|
+
`,
|
|
46
|
+
Comlink.proxy((row) => (check = row[0])),
|
|
47
|
+
)
|
|
48
|
+
expect(check).toBe('ok')
|
|
38
49
|
|
|
39
50
|
// Begin a transaction but don't commit it.
|
|
40
|
-
await sqlite3.exec(
|
|
51
|
+
await sqlite3.exec(
|
|
52
|
+
db,
|
|
53
|
+
`
|
|
41
54
|
BEGIN TRANSACTION;
|
|
42
55
|
WITH RECURSIVE cnt(x) AS
|
|
43
56
|
(SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 10000)
|
|
44
57
|
INSERT INTO t SELECT * FROM cnt;
|
|
45
|
-
|
|
58
|
+
`,
|
|
59
|
+
)
|
|
46
60
|
} finally {
|
|
47
|
-
await context.destroy(proxyA)
|
|
61
|
+
await context.destroy(proxyA)
|
|
48
62
|
}
|
|
49
63
|
|
|
50
|
-
await new Promise(resolve => setTimeout(resolve, 250))
|
|
64
|
+
await new Promise((resolve) => setTimeout(resolve, 250))
|
|
51
65
|
|
|
52
|
-
const proxyB = await context.create({ reset: false })
|
|
66
|
+
const proxyB = await context.create({ reset: false })
|
|
53
67
|
try {
|
|
54
|
-
const sqlite3 = proxyB.sqlite3
|
|
55
|
-
const db = await sqlite3.open_v2('demo')
|
|
68
|
+
const sqlite3 = proxyB.sqlite3
|
|
69
|
+
const db = await sqlite3.open_v2('demo')
|
|
56
70
|
|
|
57
|
-
let sum
|
|
58
|
-
await sqlite3.exec(
|
|
71
|
+
let sum
|
|
72
|
+
await sqlite3.exec(
|
|
73
|
+
db,
|
|
74
|
+
`
|
|
59
75
|
SELECT sum(x) FROM t;
|
|
60
|
-
`,
|
|
61
|
-
|
|
76
|
+
`,
|
|
77
|
+
Comlink.proxy((row) => (sum = row[0])),
|
|
78
|
+
)
|
|
79
|
+
expect(sum).toBe(6)
|
|
62
80
|
|
|
63
|
-
let check
|
|
64
|
-
await sqlite3.exec(
|
|
81
|
+
let check
|
|
82
|
+
await sqlite3.exec(
|
|
83
|
+
db,
|
|
84
|
+
`
|
|
65
85
|
PRAGMA integrity_check;
|
|
66
|
-
`,
|
|
67
|
-
|
|
86
|
+
`,
|
|
87
|
+
Comlink.proxy((row) => (check = row[0])),
|
|
88
|
+
)
|
|
89
|
+
expect(check).toBe('ok')
|
|
68
90
|
|
|
69
|
-
await sqlite3.exec(
|
|
91
|
+
await sqlite3.exec(
|
|
92
|
+
db,
|
|
93
|
+
`
|
|
70
94
|
INSERT INTO t VALUES (4), (5);
|
|
71
|
-
|
|
72
|
-
|
|
95
|
+
`,
|
|
96
|
+
)
|
|
97
|
+
await sqlite3.exec(
|
|
98
|
+
db,
|
|
99
|
+
`
|
|
73
100
|
SELECT sum(x) FROM t;
|
|
74
|
-
`,
|
|
75
|
-
|
|
101
|
+
`,
|
|
102
|
+
Comlink.proxy((row) => (sum = row[0])),
|
|
103
|
+
)
|
|
104
|
+
expect(sum).toBe(15)
|
|
76
105
|
} finally {
|
|
77
|
-
await context.destroy(proxyB)
|
|
106
|
+
await context.destroy(proxyB)
|
|
78
107
|
}
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
}
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
}
|