diff --git a/package-lock.json b/package-lock.json index f123a74..e848a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,20 @@ { "name": "@sqlite.org/sqlite-wasm", - "version": "3.51.2-build5", + "version": "3.51.2-build6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@sqlite.org/sqlite-wasm", - "version": "3.51.2-build5", + "version": "3.51.2-build6", "license": "Apache-2.0", "devDependencies": { - "@types/node": "^25.0.10", + "@types/node": "^25.1.0", "@vitest/browser": "^4.0.18", "@vitest/browser-playwright": "^4.0.18", - "happy-dom": "^20.3.9", + "happy-dom": "^20.4.0", "http-server": "github:vapier/http-server", - "lefthook": "2.0.15", + "lefthook": "2.0.16", "playwright": "^1.58.0", "prettier": "^3.8.1", "prettier-plugin-jsdoc": "^1.8.0", @@ -1326,9 +1326,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz", + "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==", "dev": true, "license": "MIT", "dependencies": { @@ -1388,7 +1388,6 @@ "integrity": "sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.0.18", "@vitest/mocker": "4.0.18", @@ -2074,12 +2073,11 @@ } }, "node_modules/happy-dom": { - "version": "20.3.9", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.3.9.tgz", - "integrity": "sha512-OIoj0PcK2JaxQuANHxWkxFRSNXAuSgO1vCzCT66KItE0W/ieZLG+/iW8OetlxB+F9EaPB7DoFYKAubFG1f4Mvw==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.4.0.tgz", + "integrity": "sha512-RDeQm3dT9n0A5f/TszjUmNCLEuPnMGv3Tv4BmNINebz/h17PA6LMBcxJ5FrcqltNBMh9jA/8ufgDdBYUdBt+eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", @@ -2235,9 +2233,9 @@ } }, "node_modules/lefthook": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-2.0.15.tgz", - "integrity": "sha512-sl5rePO6UUOLKp6Ci+MMKOc86zicBaPUCvSw2Cq4gCAgTmxpxhIjhz7LOu2ObYerVRPpTq3gvzPTjI71UotjnA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-2.0.16.tgz", + "integrity": "sha512-ABs3M5V9c4nqxFnZO509HXuQTu8GM8hmqc9ruV0acQ81yKlxEq70MRoYP5Z1dr5le326X8vA5qj3arJA36yE3A==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2245,22 +2243,22 @@ "lefthook": "bin/index.js" }, "optionalDependencies": { - "lefthook-darwin-arm64": "2.0.15", - "lefthook-darwin-x64": "2.0.15", - "lefthook-freebsd-arm64": "2.0.15", - "lefthook-freebsd-x64": "2.0.15", - "lefthook-linux-arm64": "2.0.15", - "lefthook-linux-x64": "2.0.15", - "lefthook-openbsd-arm64": "2.0.15", - "lefthook-openbsd-x64": "2.0.15", - "lefthook-windows-arm64": "2.0.15", - "lefthook-windows-x64": "2.0.15" + "lefthook-darwin-arm64": "2.0.16", + "lefthook-darwin-x64": "2.0.16", + "lefthook-freebsd-arm64": "2.0.16", + "lefthook-freebsd-x64": "2.0.16", + "lefthook-linux-arm64": "2.0.16", + "lefthook-linux-x64": "2.0.16", + "lefthook-openbsd-arm64": "2.0.16", + "lefthook-openbsd-x64": "2.0.16", + "lefthook-windows-arm64": "2.0.16", + "lefthook-windows-x64": "2.0.16" } }, "node_modules/lefthook-darwin-arm64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-2.0.15.tgz", - "integrity": "sha512-ygAqG/NzOgY9bEiqeQtiOmCRTtp9AmOd3eyrpEaSrRB9V9f3RHRgWDrWbde9BiHSsCzcbeY9/X2NuKZ69eUsNA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-2.0.16.tgz", + "integrity": "sha512-kjVHkD7rfPa7M0aKJSx/yatdV9uC6o3cJyzM9zk7cg5HD7alSwchFalgF/P0w6nt7C02rAUx8C05qiWCDWaKeA==", "cpu": [ "arm64" ], @@ -2272,9 +2270,9 @@ ] }, "node_modules/lefthook-darwin-x64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-2.0.15.tgz", - "integrity": "sha512-3wA30CzdSL5MFKD6dk7v8BMq7ScWQivpLbmIn3Pv67AaBavN57N/hcdGqOFnDDFI5WazVwDY7UqDfMIk5HZjEA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-2.0.16.tgz", + "integrity": "sha512-tbJ0mdT49DNRLqknro0BvWrYNC23TTcqBJFQnQ32pq1/H9B87bTNKvKKAtogp/saxfHUzkIq1i3twZlBZ3G3Xw==", "cpu": [ "x64" ], @@ -2286,9 +2284,9 @@ ] }, "node_modules/lefthook-freebsd-arm64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-2.0.15.tgz", - "integrity": "sha512-FbYBBLVbX8BjdO+icN1t/pC3TOW3FAvTKv/zggBKNihv6jHNn/3s/0j2xIS0k0Pw9oOE7MVmEni3qp2j5vqHrQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-2.0.16.tgz", + "integrity": "sha512-wa1KFD5tSUhw3tuetVef/BCSxbbmS7auTDNdoLx3WFeuN5RS15woSN9+E8GPGOOY1g2HCsgdLrhrexEomulfjQ==", "cpu": [ "arm64" ], @@ -2300,9 +2298,9 @@ ] }, "node_modules/lefthook-freebsd-x64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-2.0.15.tgz", - "integrity": "sha512-udHMjh1E8TfC0Z7Y249XZMATJOyj1Jxlj9JoEinkoBvAsePFKDEQg5teuXuTGhjsHYpqVekfSvLNNfHKUUbbjw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-2.0.16.tgz", + "integrity": "sha512-UXowfn2e94AwNk9UuoePRK+qiF15jZsssiyA15VK5GTtxpn6Sn+Z2QFciofxJczXXxM4abaf7qgx2OoJBt32VA==", "cpu": [ "x64" ], @@ -2314,9 +2312,9 @@ ] }, "node_modules/lefthook-linux-arm64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-2.0.15.tgz", - "integrity": "sha512-1HAPmdYhfcOlubv63sTnWtW2rFuC+kT1MvC3JvdrS5V6zrOImbBSnYZMJX/Dd3w4pm0x2ZJb9T+uef8a0jUQkg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-2.0.16.tgz", + "integrity": "sha512-U355elz4Z0AHSVqxfcglN09TGR86ov/GtYlliDknci2mmz6EWLiD3dTYnqJiwa4dYxqmuCDc/DvAL9rgb3YJiQ==", "cpu": [ "arm64" ], @@ -2328,9 +2326,9 @@ ] }, "node_modules/lefthook-linux-x64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-2.0.15.tgz", - "integrity": "sha512-Pho87mlNFH47zc4fPKzQSp8q9sWfIFW/KMMZfx/HZNmX25aUUTOqMyRwaXxtdAo/hNJ9FX4JeuZWq9Y3iyM5VA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-2.0.16.tgz", + "integrity": "sha512-7eAvBeWGAgjOKZ23OQbjJINLPImDIuDeX8dXOfk+aI6IFt2X6KCzRkp+ASUvGQtrPuNZQZT43EhW0/1jZU14ZQ==", "cpu": [ "x64" ], @@ -2342,9 +2340,9 @@ ] }, "node_modules/lefthook-openbsd-arm64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-2.0.15.tgz", - "integrity": "sha512-pet03Edlj1QeFUgxcIK1xu8CeZA+ejYplvPgdfe//69+vQFGSDaEx3H2mVx8RqzWfmMbijM2/WfkZXR2EVw3bw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-2.0.16.tgz", + "integrity": "sha512-Fcd+E17ZkWGnRSQINb5gf+rNy2So5PYn5mBljiC31dl+TgWM8Wy46mSEGveHo7lKCO3q+DkmHIa50Qm58G03AQ==", "cpu": [ "arm64" ], @@ -2356,9 +2354,9 @@ ] }, "node_modules/lefthook-openbsd-x64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-2.0.15.tgz", - "integrity": "sha512-i+a364CcSAeIO5wQzLMHsthHt/v6n3XwhKmRq/VBzPOUv9KutNeF55yCE/6lvuvzwxpdEfBjh6cXPERC0yp98w==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-2.0.16.tgz", + "integrity": "sha512-uL5nOkz8eBtQHped0/tB5X8clZ5kfnyjQrv1fpKbGAjeFHI2J+GmRqcn6Awq2IeuBbQvkyV6jDjpATyHBp5mCA==", "cpu": [ "x64" ], @@ -2370,9 +2368,9 @@ ] }, "node_modules/lefthook-windows-arm64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-2.0.15.tgz", - "integrity": "sha512-69u5GdVOT4QIxc2TK5ce0cTXLzwB55Pk9ZnnJNFf1XsyZTGcg9bUWYYTyD12CIIXbVTa0RVXIIrbU9UgP8O1AQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-2.0.16.tgz", + "integrity": "sha512-U61bNWzD6Vd2kjuJ7b4voPfTQ4mlBFOyTpCU3k/h0YjpKDQEFT1T5fDKkDothdnw/JVDSgrclIcfAY7Jyr/UIg==", "cpu": [ "arm64" ], @@ -2384,9 +2382,9 @@ ] }, "node_modules/lefthook-windows-x64": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-2.0.15.tgz", - "integrity": "sha512-/zYEndCUgj8XK+4wvLYLRk3AcfKU6zWf2GHx+tcZ4K2bLaQdej4m+OqmQsVpUlF8N2tN9hfwlj1D50uz75LUuQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-2.0.16.tgz", + "integrity": "sha512-dCHi2+hebhPI0LQUGRNjPMsGRyXhrTN3Y/b8M4HO8KVyGamKB3Yemf67ya81tZopDkxNVy5XUBXLYWKGhnAfLQ==", "cpu": [ "x64" ], @@ -3107,7 +3105,6 @@ "integrity": "sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright-core": "1.58.0" }, @@ -3193,7 +3190,6 @@ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -3228,7 +3224,6 @@ "integrity": "sha512-Q3NLegA9XM6usW+dYQRG1g9uEHiYUzcCVBJDJ7yMcWRqVU9LYZUWdqbwMZfmTCFC5PZLQpLAmhvRcQRl3exqkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@publint/pack": "^0.1.3", "package-manager-detector": "^1.6.0", @@ -3300,7 +3295,6 @@ "integrity": "sha512-M3AeZjYE6UclblEf531Hch0WfVC/NOL43Cc+WdF3J50kk5/fvouHhDumSGTh0oRjbZ8C4faaVr5r6Nx1xMqDGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@oxc-project/types": "=0.110.0", "@rolldown/pluginutils": "1.0.0-rc.1" @@ -3733,7 +3727,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3828,7 +3821,6 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -3919,7 +3911,6 @@ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", diff --git a/package.json b/package.json index 268d7d2..1ff39ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sqlite.org/sqlite-wasm", - "version": "3.51.2-build5", + "version": "3.51.2-build6", "description": "SQLite Wasm conveniently wrapped as an ES Module.", "type": "module", "repository": { @@ -63,12 +63,12 @@ "node": ">=22" }, "devDependencies": { - "@types/node": "^25.0.10", + "@types/node": "^25.1.0", "@vitest/browser": "^4.0.18", "@vitest/browser-playwright": "^4.0.18", - "happy-dom": "^20.3.9", + "happy-dom": "^20.4.0", "http-server": "github:vapier/http-server", - "lefthook": "2.0.15", + "lefthook": "2.0.16", "playwright": "^1.58.0", "prettier": "^3.8.1", "prettier-plugin-jsdoc": "^1.8.0", diff --git a/src/__tests__/sqlite3-kvvfs.browser.test.js b/src/__tests__/sqlite3-kvvfs.browser.test.js new file mode 100644 index 0000000..5886ea0 --- /dev/null +++ b/src/__tests__/sqlite3-kvvfs.browser.test.js @@ -0,0 +1,104 @@ +import { expect, test, describe } from 'vitest'; +import sqlite3InitModule from '../bin/sqlite3-bundler-friendly.mjs'; + +describe('kvvfs', () => { + test('kvvfs basic sanity check (browser)', async () => { + const sqlite3 = await sqlite3InitModule(); + const { kvvfs } = sqlite3; + + expect(kvvfs).toBeDefined(); + expect(kvvfs.exists('.')).toBe(true); + + if (typeof window !== 'undefined' && window.localStorage) { + expect(kvvfs.exists('local')).toBe(true); + } + if (typeof window !== 'undefined' && window.sessionStorage) { + expect(kvvfs.exists('session')).toBe(true); + } + + const db = new sqlite3.oo1.DB('file:temp?vfs=kvvfs', 'c'); + try { + db.exec('CREATE TABLE t(a,b); INSERT INTO t(a,b) VALUES(1,2),(3,4);'); + const rows = db.selectArrays('SELECT * FROM t ORDER BY a'); + expect(rows).toEqual([ + [1, 2], + [3, 4], + ]); + + const size = kvvfs.estimateSize('temp'); + expect(size).toBeGreaterThan(0); + } finally { + db.close(); + } + }); + + test('kvvfs persistence check (session storage)', async () => { + const sqlite3 = await sqlite3InitModule(); + const { kvvfs } = sqlite3; + + const dbName = 'file:persisTest?vfs=kvvfs'; + + // Clean up if it already exists + kvvfs.unlink('persisTest'); + + let db = new sqlite3.oo1.DB(dbName, 'c'); + try { + db.exec('CREATE TABLE t(a); INSERT INTO t(a) VALUES(100);'); + } finally { + db.close(); + } + + // Re-open + db = new sqlite3.oo1.DB(dbName, 'c'); + try { + const val = db.selectValue('SELECT a FROM t'); + expect(val).toBe(100); + } finally { + db.close(); + kvvfs.unlink('persisTest'); + } + }); + + test('kvvfs utility methods', async () => { + const sqlite3 = await sqlite3InitModule(); + const { kvvfs } = sqlite3; + + const name = 'utilTest'; + const dbName = `file:${name}?vfs=kvvfs`; + + kvvfs.unlink(name); + const db = new sqlite3.oo1.DB(dbName, 'c'); + try { + db.exec('CREATE TABLE t(a); INSERT INTO t(a) VALUES(1);'); + + const size = kvvfs.estimateSize(name); + expect(size).toBeGreaterThan(0); + + expect(kvvfs.exists(name)).toBe(true); + } finally { + db.close(); + kvvfs.unlink(name); + expect(kvvfs.exists(name)).toBe(false); + } + }); + + test('repro issue 146: kvvfs xFileControl [TypeError: Cannot read properties of undefined (reading "disablePageSizeChange")]', async () => { + const sqlite3 = await sqlite3InitModule(); + const db = new sqlite3.oo1.DB('file:repro146?vfs=kvvfs', 'c'); + + try { + // Trigger xFileControl with SQLITE_FCNTL_PRAGMA for page_size + db.exec('PRAGMA page_size;'); + + db.exec('PRAGMA page_size = 4096;'); + + db.exec('VACUUM;'); + + // If en error occurred, it would have happened by this point + expect(true).toBeTruthy(); + } finally { + db.close(); + sqlite3.kvvfs.unlink('repro146'); + } + }); +}); diff --git a/src/bin/sqlite3-bundler-friendly.mjs b/src/bin/sqlite3-bundler-friendly.mjs index 1b7c738..0b99fc3 100644 --- a/src/bin/sqlite3-bundler-friendly.mjs +++ b/src/bin/sqlite3-bundler-friendly.mjs @@ -29,7 +29,7 @@ ** ** SQLITE_VERSION "3.52.0" ** SQLITE_VERSION_NUMBER 3052000 -** SQLITE_SOURCE_ID "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41" +** SQLITE_SOURCE_ID "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e" ** ** Emscripten SDK: 5.0.0 */ @@ -4745,7 +4745,7 @@ Module.runSQLite3PostLoadInit = async function( ** ** SQLITE_VERSION "3.52.0" ** SQLITE_VERSION_NUMBER 3052000 -** SQLITE_SOURCE_ID "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41" +** SQLITE_SOURCE_ID "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e" ** ** Emscripten SDK: 5.0.0 */ @@ -6920,7 +6920,7 @@ globalThis.sqlite3ApiBootstrap.defaultConfig = Object.create(null); */ globalThis.sqlite3ApiBootstrap.sqlite3 = undefined; globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ - sqlite3.version = {"libVersion": "3.52.0", "libVersionNumber": 3052000, "sourceId": "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41","downloadVersion": 3520000,"scm":{ "sha3-256": "8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41","branch": "trunk","tags": "","datetime": "2026-01-25T15:18:31.737Z"}}; + sqlite3.version = {"libVersion": "3.52.0", "libVersionNumber": 3052000, "sourceId": "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e","downloadVersion": 3520000,"scm":{ "sha3-256": "407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e","branch": "trunk","tags": "","datetime": "2026-01-30T06:37:34.096Z"}}; }); /** 2022-07-08 @@ -16924,7 +16924,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ util.assert(h, "Missing KVVfsFile handle"); kvvfs?.log?.xFileControl && debug("xFileControl",h,'op =',opId); if( opId===capi.SQLITE_FCNTL_PRAGMA - && kvvfs.internal.disablePageSizeChange ){ + && kvvfsInternal.disablePageSizeChange ){ /* pArg== length-3 (char**) */ //const argv = wasm.cArgvToJs(3, pArg); // the easy way const zName = wasm.peekPtr(wasm.ptr.add(pArg, wasm.ptr.size)); diff --git a/src/bin/sqlite3-node.mjs b/src/bin/sqlite3-node.mjs index f32e446..ddcfbc1 100644 --- a/src/bin/sqlite3-node.mjs +++ b/src/bin/sqlite3-node.mjs @@ -29,7 +29,7 @@ ** ** SQLITE_VERSION "3.52.0" ** SQLITE_VERSION_NUMBER 3052000 -** SQLITE_SOURCE_ID "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41" +** SQLITE_SOURCE_ID "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e" ** ** Emscripten SDK: 5.0.0 */ @@ -4803,7 +4803,7 @@ Module.runSQLite3PostLoadInit = async function( ** ** SQLITE_VERSION "3.52.0" ** SQLITE_VERSION_NUMBER 3052000 -** SQLITE_SOURCE_ID "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41" +** SQLITE_SOURCE_ID "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e" ** ** Emscripten SDK: 5.0.0 */ @@ -6978,7 +6978,7 @@ globalThis.sqlite3ApiBootstrap.defaultConfig = Object.create(null); */ globalThis.sqlite3ApiBootstrap.sqlite3 = undefined; globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ - sqlite3.version = {"libVersion": "3.52.0", "libVersionNumber": 3052000, "sourceId": "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41","downloadVersion": 3520000,"scm":{ "sha3-256": "8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41","branch": "trunk","tags": "","datetime": "2026-01-25T15:18:31.737Z"}}; + sqlite3.version = {"libVersion": "3.52.0", "libVersionNumber": 3052000, "sourceId": "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e","downloadVersion": 3520000,"scm":{ "sha3-256": "407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e","branch": "trunk","tags": "","datetime": "2026-01-30T06:37:34.096Z"}}; }); /** 2022-07-08 @@ -16982,7 +16982,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ util.assert(h, "Missing KVVfsFile handle"); kvvfs?.log?.xFileControl && debug("xFileControl",h,'op =',opId); if( opId===capi.SQLITE_FCNTL_PRAGMA - && kvvfs.internal.disablePageSizeChange ){ + && kvvfsInternal.disablePageSizeChange ){ /* pArg== length-3 (char**) */ //const argv = wasm.cArgvToJs(3, pArg); // the easy way const zName = wasm.peekPtr(wasm.ptr.add(pArg, wasm.ptr.size)); diff --git a/src/bin/sqlite3.mjs b/src/bin/sqlite3.mjs index 2f621d7..900dc64 100644 --- a/src/bin/sqlite3.mjs +++ b/src/bin/sqlite3.mjs @@ -29,7 +29,7 @@ ** ** SQLITE_VERSION "3.52.0" ** SQLITE_VERSION_NUMBER 3052000 -** SQLITE_SOURCE_ID "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41" +** SQLITE_SOURCE_ID "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e" ** ** Emscripten SDK: 5.0.0 */ @@ -360,7 +360,7 @@ function updateMemoryViews() { function initMemory() { - + if (Module['wasmMemory']) { wasmMemory = Module['wasmMemory']; @@ -618,7 +618,7 @@ async function createWasm() { var addOnPreRun = (cb) => onPreRuns.push(cb); - + /** * @param {number} ptr * @param {string} type @@ -640,7 +640,7 @@ async function createWasm() { var noExitRuntime = true; - + /** * @param {number} ptr * @param {number} value @@ -818,14 +818,14 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { * @return {string} */ var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { - + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); - + return UTF8Decoder.decode(heapOrArray.buffer ? heapOrArray.subarray(idx, endPtr) : new Uint8Array(heapOrArray.slice(idx, endPtr))); }; - + var FS_stdin_getChar_buffer = []; - + var lengthBytesUTF8 = (str) => { var len = 0; for (var i = 0; i < str.length; ++i) { @@ -846,13 +846,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return len; }; - + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { // Parameter maxBytesToWrite is not optional. Negative values, 0, null, // undefined and false each don't write out any bytes. if (!(maxBytesToWrite > 0)) return 0; - + var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. for (var i = 0; i < str.length; ++i) { @@ -1054,10 +1054,10 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, }, }; - - + + var zeroMemory = (ptr, size) => HEAPU8.fill(0, ptr, ptr + size); - + var alignMemory = (size, alignment) => { return Math.ceil(size / alignment) * alignment; }; @@ -1135,7 +1135,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. - node.contents = null; + node.contents = null; } else if (FS.isLink(node.mode)) { node.node_ops = MEMFS.ops_table.link.node; node.stream_ops = MEMFS.ops_table.link.stream; @@ -1302,11 +1302,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (buffer.buffer === HEAP8.buffer) { canOwn = false; } - + if (!length) return 0; var node = stream.node; node.mtime = node.ctime = Date.now(); - + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? if (canOwn) { node.contents = buffer.subarray(offset, offset + length); @@ -1321,7 +1321,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return length; } } - + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. MEMFS.expandFileStorage(node, position+length); if (node.contents.subarray && buffer.subarray) { @@ -1389,7 +1389,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, }, }; - + var FS_modeStringToFlags = (str) => { var flagModes = { 'r': 0, @@ -1405,36 +1405,36 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return flags; }; - + var FS_getMode = (canRead, canWrite) => { var mode = 0; if (canRead) mode |= 292 | 73; if (canWrite) mode |= 146; return mode; }; - - + + var asyncLoad = async (url) => { var arrayBuffer = await readAsync(url); return new Uint8Array(arrayBuffer); }; - - + + var FS_createDataFile = (...args) => FS.createDataFile(...args); - + var getUniqueRunDependency = (id) => { return id; }; - + var runDependencies = 0; - - + + var dependenciesFulfilled = null; var removeRunDependency = (id) => { runDependencies--; - + Module['monitorRunDependencies']?.(runDependencies); - + if (runDependencies == 0) { if (dependenciesFulfilled) { var callback = dependenciesFulfilled; @@ -1445,17 +1445,17 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }; var addRunDependency = (id) => { runDependencies++; - + Module['monitorRunDependencies']?.(runDependencies); - + }; - - + + var preloadPlugins = []; var FS_handledByPreloadPlugin = async (byteArray, fullname) => { // Ensure plugins are ready. if (typeof Browser != 'undefined') Browser.init(); - + for (var plugin of preloadPlugins) { if (plugin['canHandle'](fullname)) { return plugin['handle'](byteArray, fullname); @@ -1471,13 +1471,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname addRunDependency(dep); - + try { var byteArray = url; if (typeof url == 'string') { byteArray = await asyncLoad(url); } - + byteArray = await FS_handledByPreloadPlugin(byteArray, fullname); preFinish?.(); if (!dontCreateFile) { @@ -1589,31 +1589,31 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { throw new FS.ErrnoError(44); } opts.follow_mount ??= true - + if (!PATH.isAbs(path)) { path = FS.cwd() + '/' + path; } - + // limit max consecutive symlinks to 40 (SYMLOOP_MAX). linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) { // split the absolute path var parts = path.split('/').filter((p) => !!p); - + // start at the root var current = FS.root; var current_path = '/'; - + for (var i = 0; i < parts.length; i++) { var islast = (i === parts.length-1); if (islast && opts.parent) { // stop resolving break; } - + if (parts[i] === '.') { continue; } - + if (parts[i] === '..') { current_path = PATH.dirname(current_path); if (FS.isRoot(current)) { @@ -1627,7 +1627,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } continue; } - + current_path = PATH.join2(current_path, parts[i]); try { current = FS.lookupNode(current, parts[i]); @@ -1640,12 +1640,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } throw e; } - + // jump to the mount's root node if this is a mountpoint if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) { current = current.mounted.root; } - + // by default, lookupPath will not follow a symlink if it is the final path component. // setting opts.follow = true will override this behavior. if (FS.isLink(current.mode) && (!islast || opts.follow)) { @@ -1678,7 +1678,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, hashName(parentid, name) { var hash = 0; - + for (var i = 0; i < name.length; i++) { hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; } @@ -1721,9 +1721,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, createNode(parent, name, mode, rdev) { var node = new FS.FSNode(parent, name, mode, rdev); - + FS.hashAddNode(node); - + return node; }, destroyNode(node) { @@ -1858,7 +1858,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, getStream:(fd) => FS.streams[fd], createStream(stream, fd = -1) { - + // clone it, so we can return an instance of FSStream stream = Object.assign(new FS.FSStream(), stream); if (fd == -1) { @@ -1905,15 +1905,15 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { getMounts(mount) { var mounts = []; var check = [mount]; - + while (check.length) { var m = check.pop(); - + mounts.push(m); - + check.push(...m.mounts); } - + return mounts; }, syncfs(populate, callback) { @@ -1921,21 +1921,21 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { callback = populate; populate = false; } - + FS.syncFSRequests++; - + if (FS.syncFSRequests > 1) { err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); } - + var mounts = FS.getMounts(FS.root.mount); var completed = 0; - + function doCallback(errCode) { FS.syncFSRequests--; return callback(errCode); } - + function done(errCode) { if (errCode) { if (!done.errored) { @@ -1948,7 +1948,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { doCallback(null); } }; - + // sync all mounts for (var mount of mounts) { if (mount.type.syncfs) { @@ -1962,77 +1962,77 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var root = mountpoint === '/'; var pseudo = !mountpoint; var node; - + if (root && FS.root) { throw new FS.ErrnoError(10); } else if (!root && !pseudo) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - + mountpoint = lookup.path; // use the absolute path node = lookup.node; - + if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10); } - + if (!FS.isDir(node.mode)) { throw new FS.ErrnoError(54); } } - + var mount = { type, opts, mountpoint, mounts: [] }; - + // create a root node for the fs var mountRoot = type.mount(mount); mountRoot.mount = mount; mount.root = mountRoot; - + if (root) { FS.root = mountRoot; } else if (node) { // set as a mountpoint node.mounted = mount; - + // add the new mount to the current mount's children if (node.mount) { node.mount.mounts.push(mount); } } - + return mountRoot; }, unmount(mountpoint) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - + if (!FS.isMountpoint(lookup.node)) { throw new FS.ErrnoError(28); } - + // destroy the nodes for this mount, and all its child mounts var node = lookup.node; var mount = node.mounted; var mounts = FS.getMounts(mount); - + for (var [hash, current] of Object.entries(FS.nameTable)) { while (current) { var next = current.name_next; - + if (mounts.includes(current.mount)) { FS.destroyNode(current); } - + current = next; } } - + // no longer a mountpoint node.mounted = null; - + // remove this mount from the child mounts var idx = node.mount.mounts.indexOf(mount); node.mount.mounts.splice(idx, 1); @@ -2084,7 +2084,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { flags: 2, namelen: 255, }; - + if (node.node_ops.statfs) { Object.assign(rtn, node.node_ops.statfs(node.mount.opts.root)); } @@ -2148,13 +2148,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var new_name = PATH.basename(new_path); // parents must exist var lookup, old_dir, new_dir; - + // let the errors from non existent directories percolate up lookup = FS.lookupPath(old_path, { parent: true }); old_dir = lookup.node; lookup = FS.lookupPath(new_path, { parent: true }); new_dir = lookup.node; - + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); // need to be part of the same mount if (old_dir.mount !== new_dir.mount) { @@ -2467,7 +2467,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } // we've already handled these, don't pass down to the underlying vfs flags &= ~(128 | 512 | 131072); - + // register the stream with the filesystem var stream = FS.createStream({ node, @@ -2741,7 +2741,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // TODO deprecate the old functionality of a single // input / output callback and that utilizes FS.createDevice // and instead require a unique set of stream ops - + // by default, we symlink the standard streams to the // default tty devices. however, if the standard streams // have been overwritten we create a unique device for @@ -2761,7 +2761,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } else { FS.symlink('/dev/tty1', '/dev/stderr'); } - + // open default streams for the stdin, stdout and stderr devices var stdin = FS.open('/dev/stdin', 0); var stdout = FS.open('/dev/stdout', 1); @@ -2769,25 +2769,25 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, staticInit() { FS.nameTable = new Array(4096); - + FS.mount(MEMFS, {}, '/'); - + FS.createDefaultDirectories(); FS.createDefaultDevices(); FS.createSpecialDirectories(); - + FS.filesystems = { 'MEMFS': MEMFS, }; }, init(input, output, error) { FS.initialized = true; - + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here input ??= Module['stdin']; output ??= Module['stdout']; error ??= Module['stderr']; - + FS.createStandardStreams(input, output, error); }, quit() { @@ -2971,27 +2971,27 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var header; var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; - + var chunkSize = 1024*1024; // Chunk size in bytes - + if (!hasByteServing) chunkSize = datalength; - + // Function to get a range from the remote URL. var doXHR = (from, to) => { if (from > to) abort("invalid range (" + from + ", " + to + ") or no bytes requested!"); if (to > datalength-1) abort("only " + datalength + " bytes available! programmer error!"); - + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - + // Some hints to the browser that we want binary data. xhr.responseType = 'arraybuffer'; if (xhr.overrideMimeType) { xhr.overrideMimeType('text/plain; charset=x-user-defined'); } - + xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status); if (xhr.response !== undefined) { @@ -3010,7 +3010,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (typeof lazyArray.chunks[chunkNum] == 'undefined') abort('doXHR failed!'); return lazyArray.chunks[chunkNum]; }); - + if (usesGzip || !datalength) { // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file @@ -3018,7 +3018,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { chunkSize = datalength; out("LazyFiles on gzip forces download of the whole file when length is accessed"); } - + this._length = datalength; this._chunkSize = chunkSize; this.lengthKnown = true; @@ -3036,7 +3036,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return this._chunkSize; } } - + if (globalThis.XMLHttpRequest) { if (!ENVIRONMENT_IS_WORKER) abort('Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'); var lazyArray = new LazyUint8Array(); @@ -3044,7 +3044,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } else { var properties = { isDevice: false, url: url }; } - + var node = FS.createFile(parent, name, properties, canRead, canWrite); // This is a total hack, but I want to get this lazy file code out of the // core of MEMFS. If we want to keep this lazy file concept I feel it should @@ -3104,9 +3104,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return node; }, }; - - - + + + /** * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the * emscripten HEAP, returns a copy of that string as a Javascript String object. @@ -3203,7 +3203,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }; function ___syscall_chmod(path, mode) { try { - + path = SYSCALLS.getStr(path); FS.chmod(path, mode); return 0; @@ -3215,7 +3215,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_faccessat(dirfd, path, amode, flags) { try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); if (amode & ~7) { @@ -3243,7 +3243,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_fchmod(fd, mode) { try { - + FS.fchmod(fd, mode); return 0; } catch (e) { @@ -3254,7 +3254,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_fchown32(fd, owner, group) { try { - + FS.fchown(fd, owner, group); return 0; } catch (e) { @@ -3270,12 +3270,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return ret; }; var syscallGetVarargP = syscallGetVarargI; - - + + function ___syscall_fcntl64(fd, cmd, varargs) { SYSCALLS.varargs = varargs; try { - + var stream = SYSCALLS.getStreamFromFD(fd); switch (cmd) { case 0: { @@ -3324,7 +3324,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_fstat64(fd, buf) { try { - + return SYSCALLS.writeStat(buf, FS.fstat(fd)); } catch (e) { if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; @@ -3333,15 +3333,15 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } var INT53_MAX = 9007199254740992; - + var INT53_MIN = -9007199254740992; var bigintToI53Checked = (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num); function ___syscall_ftruncate64(fd, length) { length = bigintToI53Checked(length); - - + + try { - + if (isNaN(length)) return -61; FS.ftruncate(fd, length); return 0; @@ -3352,13 +3352,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { ; } - + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); }; function ___syscall_getcwd(buf, size) { try { - + if (size === 0) return -28; var cwd = FS.cwd(); var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; @@ -3371,11 +3371,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } } - + function ___syscall_ioctl(fd, op, varargs) { SYSCALLS.varargs = varargs; try { - + var stream = SYSCALLS.getStreamFromFD(fd); switch (op) { case 21509: { @@ -3470,7 +3470,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_lstat64(path, buf) { try { - + path = SYSCALLS.getStr(path); return SYSCALLS.writeStat(buf, FS.lstat(path)); } catch (e) { @@ -3481,7 +3481,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_mkdirat(dirfd, path, mode) { try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); FS.mkdir(path, mode, 0); @@ -3494,7 +3494,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_newfstatat(dirfd, path, buf, flags) { try { - + path = SYSCALLS.getStr(path); var nofollow = flags & 256; var allowEmpty = flags & 4096; @@ -3507,11 +3507,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } } - + function ___syscall_openat(dirfd, path, flags, varargs) { SYSCALLS.varargs = varargs; try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); var mode = varargs ? syscallGetVarargI() : 0; @@ -3522,16 +3522,16 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } } - - + + function ___syscall_readlinkat(dirfd, path, buf, bufsize) { try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); if (bufsize <= 0) return -28; var ret = FS.readlink(path); - + var len = Math.min(bufsize, lengthBytesUTF8(ret)); var endChar = HEAP8[buf+len]; stringToUTF8(ret, buf, bufsize+1); @@ -3547,7 +3547,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_rmdir(path) { try { - + path = SYSCALLS.getStr(path); FS.rmdir(path); return 0; @@ -3559,7 +3559,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_stat64(path, buf) { try { - + path = SYSCALLS.getStr(path); return SYSCALLS.writeStat(buf, FS.stat(path)); } catch (e) { @@ -3570,7 +3570,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_unlinkat(dirfd, path, flags) { try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); if (!flags) { @@ -3590,10 +3590,10 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var readI53FromI64 = (ptr) => { return HEAPU32[((ptr)>>2)] + HEAP32[(((ptr)+(4))>>2)] * 4294967296; }; - + function ___syscall_utimensat(dirfd, path, times, flags) { try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path, true); var now = Date.now(), atime, mtime; @@ -3634,22 +3634,22 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } var isLeapYear = (year) => year%4 === 0 && (year%100 !== 0 || year%400 === 0); - + var MONTH_DAYS_LEAP_CUMULATIVE = [0,31,60,91,121,152,182,213,244,274,305,335]; - + var MONTH_DAYS_REGULAR_CUMULATIVE = [0,31,59,90,120,151,181,212,243,273,304,334]; var ydayFromDate = (date) => { var leap = isLeapYear(date.getFullYear()); var monthDaysCumulative = (leap ? MONTH_DAYS_LEAP_CUMULATIVE : MONTH_DAYS_REGULAR_CUMULATIVE); var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; // -1 since it's days since Jan 1 - + return yday; }; - + function __localtime_js(time, tmPtr) { time = bigintToI53Checked(time); - - + + var date = new Date(time*1000); HEAP32[((tmPtr)>>2)] = date.getSeconds(); HEAP32[(((tmPtr)+(4))>>2)] = date.getMinutes(); @@ -3658,11 +3658,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { HEAP32[(((tmPtr)+(16))>>2)] = date.getMonth(); HEAP32[(((tmPtr)+(20))>>2)] = date.getFullYear()-1900; HEAP32[(((tmPtr)+(24))>>2)] = date.getDay(); - + var yday = ydayFromDate(date)|0; HEAP32[(((tmPtr)+(28))>>2)] = yday; HEAP32[(((tmPtr)+(36))>>2)] = -(date.getTimezoneOffset() * 60); - + // Attention: DST is in December in South, and some regions don't have DST at all. var start = new Date(date.getFullYear(), 0, 1); var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); @@ -3672,17 +3672,17 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { ; } - - - - - + + + + + function __mmap_js(len, prot, flags, fd, offset, allocated, addr) { offset = bigintToI53Checked(offset); - - + + try { - + var stream = SYSCALLS.getStreamFromFD(fd); var res = FS.mmap(stream, len, offset, prot, flags); var ptr = res.ptr; @@ -3696,13 +3696,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { ; } - + function __munmap_js(addr, len, prot, flags, fd, offset) { offset = bigintToI53Checked(offset); - - + + try { - + var stream = SYSCALLS.getStreamFromFD(fd); if (prot & 2) { SYSCALLS.doMsync(addr, stream, len, flags, offset); @@ -3721,7 +3721,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var summer = new Date(currentYear, 6, 1); var winterOffset = winter.getTimezoneOffset(); var summerOffset = summer.getTimezoneOffset(); - + // Local standard timezone offset. Local standard time is not adjusted for // daylight savings. This code uses the fact that getTimezoneOffset returns // a greater value during Standard Time versus Daylight Saving Time (DST). @@ -3729,28 +3729,28 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // compares whether the output of the given date the same (Standard) or less // (DST). var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - + // timezone is specified as seconds west of UTC ("The external variable // `timezone` shall be set to the difference, in seconds, between // Coordinated Universal Time (UTC) and local standard time."), the same // as returned by stdTimezoneOffset. // See http://pubs.opengroup.org/onlinepubs/009695399/functions/tzset.html HEAPU32[((timezone)>>2)] = stdTimezoneOffset * 60; - + HEAP32[((daylight)>>2)] = Number(winterOffset != summerOffset); - + var extractZone = (timezoneOffset) => { // Why inverse sign? // Read here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset var sign = timezoneOffset >= 0 ? "-" : "+"; - + var absOffset = Math.abs(timezoneOffset) var hours = String(Math.floor(absOffset / 60)).padStart(2, "0"); var minutes = String(absOffset % 60).padStart(2, "0"); - + return `UTC${sign}${hours}${minutes}`; } - + var winterName = extractZone(winterOffset); var summerName = extractZone(summerOffset); if (summerOffset < winterOffset) { @@ -3764,17 +3764,17 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }; var _emscripten_get_now = () => performance.now(); - + var _emscripten_date_now = () => Date.now(); - + var nowIsMonotonic = 1; - + var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3; - + function _clock_time_get(clk_id, ignored_precision, ptime) { ignored_precision = bigintToI53Checked(ignored_precision); - - + + if (!checkWasiClock(clk_id)) { return 28; } @@ -3804,8 +3804,8 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var _emscripten_get_heap_max = () => getHeapMax(); - - + + var growMemory = (size) => { var oldHeapSize = wasmMemory.buffer.byteLength; var pages = ((size - oldHeapSize + 65535) / 65536) | 0; @@ -3825,7 +3825,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { requestedSize >>>= 0; // With multithreaded builds, races can happen (another thread might increase the size // in between), so return a failure, and let the caller retry. - + // Memory resize rules: // 1. Always increase heap size to at least the requested size, rounded up // to next page multiple. @@ -3842,14 +3842,14 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // over-eager decision to excessively reserve due to (3) above. // Hence if an allocation fails, cut down on the amount of excess // growth, in an attempt to succeed to perform a smaller allocation. - + // A limit is set for how much we can grow. We should not exceed that // (the wasm binary specifies it, so if we tried, we'd fail anyhow). var maxHeapSize = getHeapMax(); if (requestedSize > maxHeapSize) { return false; } - + // Loop through potential heap size increases. If we attempt a too eager // reservation that fails, cut down on the attempted size and reserve a // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) @@ -3857,12 +3857,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth // but limit overreserving (default to capping at +96MB overgrowth at most) overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); - + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); - + var replacement = growMemory(newSize); if (replacement) { - + return true; } } @@ -3871,7 +3871,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var ENV = { }; - + var getExecutableName = () => thisProgram || './this.program'; var getEnvStrings = () => { if (!getEnvStrings.strings) { @@ -3903,7 +3903,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return getEnvStrings.strings; }; - + var _environ_get = (__environ, environ_buf) => { var bufSize = 0; var envp = 0; @@ -3916,7 +3916,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return 0; }; - + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { var strings = getEnvStrings(); HEAPU32[((penviron_count)>>2)] = strings.length; @@ -3930,7 +3930,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function _fd_close(fd) { try { - + var stream = SYSCALLS.getStreamFromFD(fd); FS.close(stream); return 0; @@ -3942,7 +3942,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function _fd_fdstat_get(fd, pbuf) { try { - + var rightsBase = 0; var rightsInheriting = 0; var flags = 0; @@ -3983,10 +3983,10 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return ret; }; - + function _fd_read(fd, iov, iovcnt, pnum) { try { - + var stream = SYSCALLS.getStreamFromFD(fd); var num = doReadv(stream, iov, iovcnt); HEAPU32[((pnum)>>2)] = num; @@ -3997,13 +3997,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } } - + function _fd_seek(fd, offset, whence, newOffset) { offset = bigintToI53Checked(offset); - - + + try { - + if (isNaN(offset)) return 61; var stream = SYSCALLS.getStreamFromFD(fd); FS.llseek(stream, offset, whence); @@ -4019,7 +4019,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function _fd_sync(fd) { try { - + var stream = SYSCALLS.getStreamFromFD(fd); var rtn = stream.stream_ops?.fsync?.(stream); return rtn; @@ -4049,10 +4049,10 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return ret; }; - + function _fd_write(fd, iov, iovcnt, pnum) { try { - + var stream = SYSCALLS.getStreamFromFD(fd); var num = doWritev(stream, iov, iovcnt); HEAPU32[((pnum)>>2)] = num; @@ -4836,7 +4836,7 @@ Module.runSQLite3PostLoadInit = async function( ** ** SQLITE_VERSION "3.52.0" ** SQLITE_VERSION_NUMBER 3052000 -** SQLITE_SOURCE_ID "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41" +** SQLITE_SOURCE_ID "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e" ** ** Emscripten SDK: 5.0.0 */ @@ -7011,7 +7011,7 @@ globalThis.sqlite3ApiBootstrap.defaultConfig = Object.create(null); */ globalThis.sqlite3ApiBootstrap.sqlite3 = undefined; globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ - sqlite3.version = {"libVersion": "3.52.0", "libVersionNumber": 3052000, "sourceId": "2026-01-25 15:18:31 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41","downloadVersion": 3520000,"scm":{ "sha3-256": "8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41","branch": "trunk","tags": "","datetime": "2026-01-25T15:18:31.737Z"}}; + sqlite3.version = {"libVersion": "3.52.0", "libVersionNumber": 3052000, "sourceId": "2026-01-30 06:37:34 407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e","downloadVersion": 3520000,"scm":{ "sha3-256": "407724c4e80efdf93d885e95b5209a100a3f470fe0298138be57201f65f9817e","branch": "trunk","tags": "","datetime": "2026-01-30T06:37:34.096Z"}}; }); /** 2022-07-08 @@ -17015,7 +17015,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ util.assert(h, "Missing KVVfsFile handle"); kvvfs?.log?.xFileControl && debug("xFileControl",h,'op =',opId); if( opId===capi.SQLITE_FCNTL_PRAGMA - && kvvfs.internal.disablePageSizeChange ){ + && kvvfsInternal.disablePageSizeChange ){ /* pArg== length-3 (char**) */ //const argv = wasm.cArgvToJs(3, pArg); // the easy way const zName = wasm.peekPtr(wasm.ptr.add(pArg, wasm.ptr.size)); diff --git a/src/bin/sqlite3.wasm b/src/bin/sqlite3.wasm index bce84f2..28b0920 100644 Binary files a/src/bin/sqlite3.wasm and b/src/bin/sqlite3.wasm differ