Skip to content

Commit 36af0c8

Browse files
authored
Added temporaryStorage option to WASQLiteOpenFactory. (#419)
1 parent 7e23d65 commit 36af0c8

File tree

5 files changed

+133
-115
lines changed

5 files changed

+133
-115
lines changed

.changeset/tasty-birds-lay.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@powersync/web': minor
3+
---
4+
5+
Added `temporaryStorage` option to `WebSQLOpenFactoryOptions`. The `temp_store` value will now defaults to "MEMORY".

demos/vue-supabase-todolist/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@
3535
"vite-plugin-top-level-await": "^1.4.1",
3636
"vite-plugin-vuetify": "^2.0.3",
3737
"vite-plugin-wasm": "^3.3.0",
38-
"vue-tsc": "^2.0.6"
38+
"vue-tsc": "2.0.6"
3939
}
4040
}

packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Logger, { type ILogger } from 'js-logger';
1414
import type { DBFunctionsInterface, OpenDB } from '../../../shared/types';
1515
import { _openDB } from '../../../shared/open-db';
1616
import { getWorkerDatabaseOpener, resolveWorkerDatabasePortFactory } from '../../../worker/db/open-worker-database';
17-
import { ResolvedWebSQLOpenOptions, resolveWebSQLFlags, WebSQLFlags } from '../web-sql-flags';
17+
import { ResolvedWebSQLOpenOptions, resolveWebSQLFlags, TemporaryStorageOption, WebSQLFlags } from '../web-sql-flags';
1818
import { getNavigatorLocks } from '../../../shared/navigator';
1919

2020
/**
@@ -32,6 +32,8 @@ export interface WASQLiteDBAdapterOptions extends Omit<PowerSyncOpenFactoryOptio
3232
workerPort?: MessagePort;
3333

3434
worker?: string | URL | ((options: ResolvedWebSQLOpenOptions) => Worker | SharedWorker);
35+
36+
temporaryStorage?: TemporaryStorageOption;
3537
}
3638

3739
/**
@@ -86,6 +88,8 @@ export class WASQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
8688
this.logger.warn('Multiple tabs are not enabled in this browser');
8789
}
8890

91+
const tempStoreQuery = `PRAGMA temp_store = ${this.options.temporaryStorage ?? TemporaryStorageOption.MEMORY};`;
92+
8993
if (useWebWorker) {
9094
const optionsDbWorker = this.options.worker;
9195

@@ -103,6 +107,7 @@ export class WASQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
103107
: getWorkerDatabaseOpener(this.options.dbFilename, enableMultiTabs, optionsDbWorker);
104108

105109
this.methods = await dbOpener(this.options.dbFilename);
110+
await this.methods!.execute(tempStoreQuery);
106111
this.methods.registerOnTableChange(
107112
Comlink.proxy((event) => {
108113
this.iterateListeners((cb) => cb.tablesUpdated?.(event));
@@ -112,6 +117,7 @@ export class WASQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
112117
return;
113118
}
114119
this.methods = await _openDB(this.options.dbFilename, { useWebWorker: false });
120+
await this.methods!.execute(tempStoreQuery);
115121
this.methods.registerOnTableChange((event) => {
116122
this.iterateListeners((cb) => cb.tablesUpdated?.(event));
117123
});

packages/web/src/db/adapters/web-sql-flags.ts

+11
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ export interface ResolvedWebSQLOpenOptions extends SQLOpenOptions {
4242
flags: ResolvedWebSQLFlags;
4343
}
4444

45+
export enum TemporaryStorageOption {
46+
MEMORY = 'memory',
47+
FILESYSTEM = 'file'
48+
}
49+
4550
/**
4651
* Options for opening a Web SQL connection
4752
*/
@@ -55,6 +60,12 @@ export interface WebSQLOpenFactoryOptions extends SQLOpenOptions {
5560
* or a factory method that returns a worker.
5661
*/
5762
worker?: string | URL | ((options: ResolvedWebSQLOpenOptions) => Worker | SharedWorker);
63+
64+
/**
65+
* Where to store SQLite temporary files. Defaults to 'MEMORY'.
66+
* Setting this to `FILESYSTEM` can cause issues with larger queries or datasets.
67+
*/
68+
temporaryStorage?: TemporaryStorageOption;
5869
}
5970

6071
export function isServerSide() {

0 commit comments

Comments
 (0)