@powersync/web 2.1.1 → 2.2.0
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/dist/index.react_native_web.js +212 -92
- package/dist/index.react_native_web.js.map +1 -1
- package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +1 -1
- package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -1
- package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +1 -1
- package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -1
- package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +1 -1
- package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js +2 -0
- package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js.map +1 -0
- package/dist/worker/mc-wa-sqlite-DDFgWP93.js.map +1 -1
- package/dist/worker/mc-wa-sqlite-async-lGclTjKJ.js.map +1 -1
- package/dist/worker/wa-sqlite-B0tZMM0j.js.map +1 -1
- package/dist/worker/wa-sqlite-async-CM6BmfRh.js.map +1 -1
- package/dist/worker/worker.js +1 -1
- package/dist/worker/worker.js.map +1 -1
- package/lib/db/PowerSyncDatabase.js +16 -11
- package/lib/db/PowerSyncDatabase.js.map +1 -1
- package/lib/db/adapters/AsyncWebAdapter.js +4 -55
- package/lib/db/adapters/AsyncWebAdapter.js.map +1 -1
- package/lib/db/adapters/acquireFromPool.d.ts +7 -0
- package/lib/db/adapters/acquireFromPool.js +60 -0
- package/lib/db/adapters/acquireFromPool.js.map +1 -0
- package/lib/db/adapters/memory-pool/client.d.ts +70 -0
- package/lib/db/adapters/memory-pool/client.js +269 -0
- package/lib/db/adapters/memory-pool/client.js.map +1 -0
- package/lib/db/adapters/memory-pool/shared.d.ts +51 -0
- package/lib/db/adapters/memory-pool/shared.js +16 -0
- package/lib/db/adapters/memory-pool/shared.js.map +1 -0
- package/lib/db/adapters/memory-pool/vfs.d.ts +19 -0
- package/lib/db/adapters/memory-pool/vfs.js +247 -0
- package/lib/db/adapters/memory-pool/vfs.js.map +1 -0
- package/lib/db/adapters/memory-pool/worker.d.ts +1 -0
- package/lib/db/adapters/memory-pool/worker.js +45 -0
- package/lib/db/adapters/memory-pool/worker.js.map +1 -0
- package/lib/db/adapters/options.d.ts +7 -0
- package/lib/db/adapters/options.js.map +1 -1
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.d.ts +8 -0
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js +56 -5
- package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -1
- package/lib/db/adapters/wa-sqlite/StatementCache.d.ts +16 -0
- package/lib/db/adapters/wa-sqlite/StatementCache.js +44 -0
- package/lib/db/adapters/wa-sqlite/StatementCache.js.map +1 -0
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +7 -4
- package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -1
- package/lib/worker/db/MultiDatabaseServer.d.ts +1 -2
- package/lib/worker/db/MultiDatabaseServer.js +28 -17
- package/lib/worker/db/MultiDatabaseServer.js.map +1 -1
- package/package.json +13 -6
- package/src/db/PowerSyncDatabase.ts +18 -11
- package/src/db/adapters/AsyncWebAdapter.ts +13 -61
- package/src/db/adapters/acquireFromPool.ts +73 -0
- package/src/db/adapters/memory-pool/client.ts +367 -0
- package/src/db/adapters/memory-pool/shared.ts +79 -0
- package/src/db/adapters/memory-pool/vfs.ts +293 -0
- package/src/db/adapters/memory-pool/worker.ts +53 -0
- package/src/db/adapters/options.ts +8 -0
- package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +71 -6
- package/src/db/adapters/wa-sqlite/StatementCache.ts +50 -0
- package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +17 -5
- package/src/worker/db/MultiDatabaseServer.ts +29 -21
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +0 -2
- package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function emptyWalState() {
|
|
2
|
+
return { fileSize: 0, walEnd: 0, overlay: new Map() };
|
|
3
|
+
}
|
|
4
|
+
export function applyWalChanges(state, changes) {
|
|
5
|
+
state.fileSize = changes.fileSize;
|
|
6
|
+
state.walEnd = changes.walEnd;
|
|
7
|
+
if (changes.cleared) {
|
|
8
|
+
state.overlay.clear();
|
|
9
|
+
}
|
|
10
|
+
for (let i = 0; i < changes.added.length; i += 2) {
|
|
11
|
+
const dbOffset = changes.added[i];
|
|
12
|
+
const walEntry = changes.added[i + 1];
|
|
13
|
+
state.overlay.set(dbOffset, walEntry);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/db/adapters/memory-pool/shared.ts"],"names":[],"mappings":"AA6DA,MAAM,UAAU,aAAa;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAsB,EAAE,OAAuB;IAC7E,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE9B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAoB,CAAC;QACzD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FacadeVFS } from '@journeyapps/wa-sqlite/src/FacadeVFS.js';
|
|
2
|
+
import { WalIndexChange, WriteAheadBuffers, WriteAheadState } from './shared.js';
|
|
3
|
+
export declare class InMemoryWriteAheadLog extends FacadeVFS {
|
|
4
|
+
#private;
|
|
5
|
+
readonly buffers: WriteAheadBuffers;
|
|
6
|
+
writeAheadState: WriteAheadState;
|
|
7
|
+
constructor(module: any, buffers: WriteAheadBuffers);
|
|
8
|
+
takeChanges(): WalIndexChange;
|
|
9
|
+
jAccess(zName: string, _pFlags: number, pResOut: DataView): 0;
|
|
10
|
+
jOpen(zName: string | null, fileId: number, flags: number, pOutFlags: DataView): number;
|
|
11
|
+
jClose(fileid: number): 0;
|
|
12
|
+
jRead(fileId: number, data: Uint8Array, offset: number): 0 | 522;
|
|
13
|
+
jWrite(fileId: number, data: Uint8Array, offset: number): number;
|
|
14
|
+
jTruncate(fileid: number, size: number): number;
|
|
15
|
+
jFileSize(fileid: number, pSize64: DataView): 0;
|
|
16
|
+
jDelete(name: string): 0 | 2570;
|
|
17
|
+
jDeviceCharacteristics(): number;
|
|
18
|
+
jFileControl(fileid: number, op: number): 0 | 12;
|
|
19
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
import { FacadeVFS } from '@journeyapps/wa-sqlite/src/FacadeVFS.js';
|
|
3
|
+
import * as VFS from '@journeyapps/wa-sqlite/src/VFS.js';
|
|
4
|
+
import { emptyWalState } from './shared.js';
|
|
5
|
+
const mainDbSentinel = Symbol();
|
|
6
|
+
export class InMemoryWriteAheadLog extends FacadeVFS {
|
|
7
|
+
buffers;
|
|
8
|
+
// The main /database file is the only file for which we create a write-ahead log. All other files (including the
|
|
9
|
+
// journal) are local-only.
|
|
10
|
+
#openedFiles = new Map();
|
|
11
|
+
#files = new Map();
|
|
12
|
+
#tx = undefined;
|
|
13
|
+
#newOverlayPagesToSendToMainTab = new Map();
|
|
14
|
+
writeAheadState = emptyWalState();
|
|
15
|
+
constructor(module, buffers) {
|
|
16
|
+
super('InMemoryWriteAheadLog', module);
|
|
17
|
+
this.buffers = buffers;
|
|
18
|
+
this.#files.set('/database', mainDbSentinel);
|
|
19
|
+
}
|
|
20
|
+
takeChanges() {
|
|
21
|
+
const added = [];
|
|
22
|
+
this.#newOverlayPagesToSendToMainTab.forEach((v, k) => {
|
|
23
|
+
added.push(k);
|
|
24
|
+
added.push(v);
|
|
25
|
+
});
|
|
26
|
+
this.#newOverlayPagesToSendToMainTab.clear();
|
|
27
|
+
return {
|
|
28
|
+
cleared: false,
|
|
29
|
+
walEnd: this.writeAheadState.walEnd,
|
|
30
|
+
fileSize: this.writeAheadState.fileSize,
|
|
31
|
+
added
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
jAccess(zName, _pFlags, pResOut) {
|
|
35
|
+
const file = this.#files.get(zName);
|
|
36
|
+
pResOut.setInt32(0, file != null ? 1 : 0, true);
|
|
37
|
+
return VFS.SQLITE_OK;
|
|
38
|
+
}
|
|
39
|
+
jOpen(zName, fileId, flags, pOutFlags) {
|
|
40
|
+
if (flags & VFS.SQLITE_OPEN_MAIN_DB) {
|
|
41
|
+
this.#openedFiles.set(fileId, mainDbSentinel);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Treat all other files, including the mostly unused journal as temporary.
|
|
45
|
+
zName ??= `tmp-${crypto.randomUUID()}`;
|
|
46
|
+
const existing = this.#files.get(zName);
|
|
47
|
+
if (existing != null) {
|
|
48
|
+
this.#openedFiles.set(fileId, existing);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
if (!(flags & VFS.SQLITE_OPEN_CREATE)) {
|
|
52
|
+
return VFS.SQLITE_IOERR;
|
|
53
|
+
}
|
|
54
|
+
const newFile = new LocalFile(zName);
|
|
55
|
+
newFile.deleteOnClose = (flags & VFS.SQLITE_OPEN_DELETEONCLOSE) != 0;
|
|
56
|
+
this.#openedFiles.set(fileId, newFile);
|
|
57
|
+
this.#files.set(zName, newFile);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
pOutFlags.setInt32(0, flags, true);
|
|
61
|
+
return VFS.SQLITE_OK;
|
|
62
|
+
}
|
|
63
|
+
jClose(fileid) {
|
|
64
|
+
const file = this.#openedFiles.get(fileid);
|
|
65
|
+
this.#openedFiles.delete(fileid);
|
|
66
|
+
if (file != mainDbSentinel && file.deleteOnClose) {
|
|
67
|
+
this.#files.delete(file.name);
|
|
68
|
+
}
|
|
69
|
+
return VFS.SQLITE_OK;
|
|
70
|
+
}
|
|
71
|
+
jRead(fileId, data, offset) {
|
|
72
|
+
const file = this.#openedFiles.get(fileId);
|
|
73
|
+
let endOffset;
|
|
74
|
+
let readableBytes;
|
|
75
|
+
if (file == mainDbSentinel) {
|
|
76
|
+
const { fileSize, overlay } = this.writeAheadState;
|
|
77
|
+
const startOffset = Math.min(offset, fileSize);
|
|
78
|
+
endOffset = Math.min(fileSize, offset + data.byteLength);
|
|
79
|
+
readableBytes = endOffset - startOffset;
|
|
80
|
+
// Try reading from the write-ahead overlay first. A read on the database file is always a complete page, except
|
|
81
|
+
// when reading from the 100-byte header.
|
|
82
|
+
const page = overlay.get(offset < 100 ? 0 : offset);
|
|
83
|
+
if (page != null) {
|
|
84
|
+
const pageOffset = page.logOffset;
|
|
85
|
+
const source = new Uint8Array(this.buffers.writeAheadLog, offset < 100 ? pageOffset + offset : pageOffset, readableBytes);
|
|
86
|
+
data.set(source);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Page is not in WAL overlay, read directly from underlying in-memory buffer.
|
|
90
|
+
data.set(new Uint8Array(this.buffers.database, startOffset, readableBytes));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const fileSize = file.size;
|
|
95
|
+
const startOffset = Math.min(offset, fileSize);
|
|
96
|
+
endOffset = Math.min(fileSize, offset + data.byteLength);
|
|
97
|
+
readableBytes = endOffset - startOffset;
|
|
98
|
+
if (readableBytes > 0) {
|
|
99
|
+
data.set(new Uint8Array(file.buffer, startOffset, readableBytes));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (readableBytes < data.byteLength) {
|
|
103
|
+
data.fill(0, readableBytes); // Fill rest with zeroes.
|
|
104
|
+
return VFS.SQLITE_IOERR_SHORT_READ;
|
|
105
|
+
}
|
|
106
|
+
return VFS.SQLITE_OK;
|
|
107
|
+
}
|
|
108
|
+
jWrite(fileId, data, offset) {
|
|
109
|
+
const file = this.#openedFiles.get(fileId);
|
|
110
|
+
// wa-sqlite passes a proxy instead of a real Uint8Array.
|
|
111
|
+
const actualBuffer = data.subarray();
|
|
112
|
+
if (file === mainDbSentinel) {
|
|
113
|
+
// Write to the write-ahead overlay.
|
|
114
|
+
let didWrite = false;
|
|
115
|
+
if (this.#tx != null) {
|
|
116
|
+
didWrite = this.#tx.appendPage(offset, actualBuffer);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const tx = new WriteAheadTransaction(this.writeAheadState.walEnd, this.writeAheadState.fileSize, this.buffers);
|
|
120
|
+
didWrite = tx.appendPage(offset, actualBuffer);
|
|
121
|
+
this.#commit(tx);
|
|
122
|
+
}
|
|
123
|
+
return didWrite ? VFS.SQLITE_OK : VFS.SQLITE_FULL;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const writeLength = data.length;
|
|
127
|
+
const endOffset = offset + writeLength;
|
|
128
|
+
if (endOffset > file.buffer.byteLength) {
|
|
129
|
+
const didGrow = file.growBuffer(endOffset);
|
|
130
|
+
if (!didGrow) {
|
|
131
|
+
return VFS.SQLITE_FULL;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
new Uint8Array(file.buffer, offset, writeLength).set(actualBuffer);
|
|
135
|
+
file.size = Math.max(file.size, endOffset);
|
|
136
|
+
return VFS.SQLITE_OK;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
jTruncate(fileid, size) {
|
|
140
|
+
const file = this.#openedFiles.get(fileid);
|
|
141
|
+
if (file === mainDbSentinel) {
|
|
142
|
+
this.writeAheadState.fileSize = Math.min(this.writeAheadState.fileSize, size);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
file.size = Math.min(size, file.size);
|
|
146
|
+
}
|
|
147
|
+
return VFS.SQLITE_OK;
|
|
148
|
+
}
|
|
149
|
+
jFileSize(fileid, pSize64) {
|
|
150
|
+
const file = this.#openedFiles.get(fileid);
|
|
151
|
+
if (file === mainDbSentinel) {
|
|
152
|
+
pSize64.setBigInt64(0, BigInt(this.writeAheadState.fileSize), true);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
pSize64.setBigInt64(0, BigInt(file.size), true);
|
|
156
|
+
}
|
|
157
|
+
return VFS.SQLITE_OK;
|
|
158
|
+
}
|
|
159
|
+
jDelete(name) {
|
|
160
|
+
if (name === '/database') {
|
|
161
|
+
return VFS.SQLITE_IOERR_DELETE;
|
|
162
|
+
}
|
|
163
|
+
this.#files.delete(name);
|
|
164
|
+
return VFS.SQLITE_OK;
|
|
165
|
+
}
|
|
166
|
+
jDeviceCharacteristics() {
|
|
167
|
+
return VFS.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | VFS.SQLITE_IOCAP_BATCH_ATOMIC;
|
|
168
|
+
}
|
|
169
|
+
jFileControl(fileid, op) {
|
|
170
|
+
const file = this.#openedFiles.get(fileid);
|
|
171
|
+
if (file !== mainDbSentinel)
|
|
172
|
+
return VFS.SQLITE_NOTFOUND;
|
|
173
|
+
switch (op) {
|
|
174
|
+
case VFS.SQLITE_FCNTL_BEGIN_ATOMIC_WRITE:
|
|
175
|
+
this.#tx = new WriteAheadTransaction(this.writeAheadState.walEnd, this.writeAheadState.fileSize, this.buffers);
|
|
176
|
+
break;
|
|
177
|
+
case VFS.SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE:
|
|
178
|
+
this.#tx = undefined;
|
|
179
|
+
break;
|
|
180
|
+
case VFS.SQLITE_FCNTL_COMMIT_ATOMIC_WRITE:
|
|
181
|
+
this.#commit(this.#tx);
|
|
182
|
+
this.#tx = undefined;
|
|
183
|
+
break;
|
|
184
|
+
default:
|
|
185
|
+
return VFS.SQLITE_NOTFOUND;
|
|
186
|
+
}
|
|
187
|
+
return VFS.SQLITE_OK;
|
|
188
|
+
}
|
|
189
|
+
#commit(tx) {
|
|
190
|
+
this.writeAheadState.walEnd = tx.walEndOffset;
|
|
191
|
+
this.writeAheadState.fileSize = tx.fileSize;
|
|
192
|
+
tx.changedPages.forEach((walEntry, databaseOffset) => {
|
|
193
|
+
this.#newOverlayPagesToSendToMainTab.set(databaseOffset, walEntry);
|
|
194
|
+
this.writeAheadState.overlay.set(databaseOffset, walEntry);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
class WriteAheadTransaction {
|
|
199
|
+
buffers;
|
|
200
|
+
walEndOffset;
|
|
201
|
+
fileSize;
|
|
202
|
+
changedPages = new Map();
|
|
203
|
+
constructor(endOffset, fileSize, buffers) {
|
|
204
|
+
this.buffers = buffers;
|
|
205
|
+
this.walEndOffset = endOffset;
|
|
206
|
+
this.fileSize = fileSize;
|
|
207
|
+
}
|
|
208
|
+
appendPage(offset, data) {
|
|
209
|
+
const currentEnd = this.walEndOffset;
|
|
210
|
+
const newEnd = currentEnd + data.length;
|
|
211
|
+
const wal = this.buffers.writeAheadLog;
|
|
212
|
+
if (newEnd > wal.byteLength) {
|
|
213
|
+
if (!this.#growWal(wal, newEnd))
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
this.fileSize = Math.max(this.fileSize, offset + data.length);
|
|
217
|
+
new Uint8Array(wal, currentEnd, data.length).set(data);
|
|
218
|
+
this.walEndOffset = newEnd;
|
|
219
|
+
this.changedPages.set(offset, { logOffset: currentEnd, size: data.length });
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
#growWal(buffer, minSize) {
|
|
223
|
+
const newSize = Math.max(minSize, Math.min(2 * buffer.byteLength, buffer.maxByteLength));
|
|
224
|
+
if (newSize > buffer.maxByteLength) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
buffer.grow(newSize);
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
class LocalFile {
|
|
232
|
+
deleteOnClose = false;
|
|
233
|
+
name;
|
|
234
|
+
buffer = new ArrayBuffer(1024);
|
|
235
|
+
size = 0;
|
|
236
|
+
constructor(name) {
|
|
237
|
+
this.name = name;
|
|
238
|
+
}
|
|
239
|
+
growBuffer(minSize) {
|
|
240
|
+
const newSize = Math.max(minSize, 2 * this.buffer.byteLength);
|
|
241
|
+
const newBuffer = new ArrayBuffer(newSize);
|
|
242
|
+
new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));
|
|
243
|
+
this.buffer = newBuffer;
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=vfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vfs.js","sourceRoot":"","sources":["../../../../src/db/adapters/memory-pool/vfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as Comlink from 'comlink';
|
|
2
|
+
import { applyWalChanges } from './shared.js';
|
|
3
|
+
import { InMemoryWriteAheadLog } from './vfs.js';
|
|
4
|
+
import { RawSqliteConnection } from '../wa-sqlite/RawSqliteConnection.js';
|
|
5
|
+
import { WASQLiteVFS } from '../wa-sqlite/vfs.js';
|
|
6
|
+
import { TemporaryStorageOption } from '../options.js';
|
|
7
|
+
class MemoryDatabaseServer {
|
|
8
|
+
#vfs;
|
|
9
|
+
#connection;
|
|
10
|
+
async open(buffers, options) {
|
|
11
|
+
const { default: factory } = await import('@journeyapps/wa-sqlite/dist/wa-sqlite.mjs');
|
|
12
|
+
const module = await factory();
|
|
13
|
+
const vfs = (this.#vfs = new InMemoryWriteAheadLog(module, buffers));
|
|
14
|
+
const connection = new RawSqliteConnection({
|
|
15
|
+
encryptionKey: undefined,
|
|
16
|
+
vfs: WASQLiteVFS.InMemoryVfs,
|
|
17
|
+
// Unused, since we register our own VFS. Only needed to satisfy the type.
|
|
18
|
+
temporaryStorage: TemporaryStorageOption.MEMORY,
|
|
19
|
+
cacheSizeKb: 50 * 1024,
|
|
20
|
+
preparedStatementsCache: 0,
|
|
21
|
+
...options,
|
|
22
|
+
// The rest of these options is not overridable: The VFS handles /database reads and writes in a special way and
|
|
23
|
+
// there can only be one database per buffers instance.
|
|
24
|
+
filename: '/database',
|
|
25
|
+
readonly: false
|
|
26
|
+
});
|
|
27
|
+
await connection.initWithModule(module, vfs);
|
|
28
|
+
this.#connection = connection;
|
|
29
|
+
}
|
|
30
|
+
async updateWalState(overlay) {
|
|
31
|
+
const currentState = this.#vfs.writeAheadState;
|
|
32
|
+
applyWalChanges(currentState, overlay);
|
|
33
|
+
}
|
|
34
|
+
async executeRaw(query, params) {
|
|
35
|
+
return await this.#connection.execute(query, params);
|
|
36
|
+
}
|
|
37
|
+
async executeBatch(query, params) {
|
|
38
|
+
return await this.#connection.executeBatch(query, params);
|
|
39
|
+
}
|
|
40
|
+
async takeWalChanges() {
|
|
41
|
+
return this.#vfs.takeChanges();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
Comlink.expose(new MemoryDatabaseServer());
|
|
45
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/db/adapters/memory-pool/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,eAAe,EAAqD,MAAM,aAAa,CAAC;AAEjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAA4C,MAAM,qCAAqC,CAAC;AACpH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,oBAAoB;IACxB,IAAI,CAAyB;IAC7B,WAAW,CAAuB;IAElC,KAAK,CAAC,IAAI,CAAC,OAA0B,EAAE,OAA4C;QACjF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;QACvF,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAErE,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC;YACzC,aAAa,EAAE,SAAS;YACxB,GAAG,EAAE,WAAW,CAAC,WAAW;YAC5B,0EAA0E;YAC1E,gBAAgB,EAAE,sBAAsB,CAAC,MAAM;YAC/C,WAAW,EAAE,EAAE,GAAG,IAAI;YACtB,uBAAuB,EAAE,CAAC;YAC1B,GAAG,OAAO;YACV,gHAAgH;YAChH,uDAAuD;YACvD,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,MAAM,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAuB;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;QAC/C,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,MAA0B;QACxD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,MAAe;QAC/C,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;CACF;AAED,OAAO,CAAC,MAAM,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC"}
|
|
@@ -76,6 +76,13 @@ export interface WebSpecificOpenOptions {
|
|
|
76
76
|
* A worker will be initialized if none is provided
|
|
77
77
|
*/
|
|
78
78
|
workerPort?: MessagePort | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* If set to a value greater than zero, the worker will cache prepared statements to avoid preparing them every time
|
|
81
|
+
* a query runs.
|
|
82
|
+
*
|
|
83
|
+
* Defaults to 0 (disabling the cache).
|
|
84
|
+
*/
|
|
85
|
+
preparedStatementsCache?: number;
|
|
79
86
|
}
|
|
80
87
|
export interface ResolvedWebSQLOpenOptions extends SQLOpenOptions, WebSpecificOpenOptions {
|
|
81
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/db/adapters/options.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/db/adapters/options.ts"],"names":[],"mappings":"AAwGA,MAAM,CAAN,IAAY,sBAGX;AAHD,WAAY,sBAAsB;IAChC,2CAAiB,CAAA;IACjB,6CAAmB,CAAA;AACrB,CAAC,EAHW,sBAAsB,KAAtB,sBAAsB,QAGjC"}
|
|
@@ -18,6 +18,10 @@ export interface RawWaSqliteDatabaseOptions {
|
|
|
18
18
|
encryptionKey: string | undefined;
|
|
19
19
|
temporaryStorage: TemporaryStorageOption;
|
|
20
20
|
cacheSizeKb: number;
|
|
21
|
+
/**
|
|
22
|
+
* The amount of prepared statements to cache, or 0 to disable caching.
|
|
23
|
+
*/
|
|
24
|
+
preparedStatementsCache: number;
|
|
21
25
|
}
|
|
22
26
|
/**
|
|
23
27
|
* A small wrapper around WA-sqlite to help with opening databases and running statements by preparing them internally.
|
|
@@ -28,13 +32,16 @@ export interface RawWaSqliteDatabaseOptions {
|
|
|
28
32
|
export declare class RawSqliteConnection {
|
|
29
33
|
readonly options: RawWaSqliteDatabaseOptions;
|
|
30
34
|
private _sqliteAPI;
|
|
35
|
+
private sqlite3_stmt_isexplain;
|
|
31
36
|
/**
|
|
32
37
|
* The `sqlite3*` connection pointer.
|
|
33
38
|
*/
|
|
34
39
|
private db;
|
|
40
|
+
private statementCache;
|
|
35
41
|
constructor(options: RawWaSqliteDatabaseOptions);
|
|
36
42
|
get isOpen(): boolean;
|
|
37
43
|
init(): Promise<void>;
|
|
44
|
+
initWithModule(module: any, vfs: any): Promise<void>;
|
|
38
45
|
private openSQLiteAPI;
|
|
39
46
|
requireSqlite(): SQLiteAPI;
|
|
40
47
|
/**
|
|
@@ -52,4 +59,5 @@ export declare class RawSqliteConnection {
|
|
|
52
59
|
executeRaw(sql: string, bindings?: any[]): Promise<RawResultSet[]>;
|
|
53
60
|
private stepThroughStatement;
|
|
54
61
|
close(): Promise<void>;
|
|
62
|
+
private cachedStatements;
|
|
55
63
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Factory as WaSqliteFactory, SQLITE_ROW } from '@journeyapps/wa-sqlite';
|
|
2
2
|
import { loadModuleAndVfs } from './vfs.js';
|
|
3
3
|
import { maxPathNameLength } from '../resolveAndValidateOptions.js';
|
|
4
|
+
import { PreparedStatementCache } from './StatementCache.js';
|
|
4
5
|
/**
|
|
5
6
|
* A small wrapper around WA-sqlite to help with opening databases and running statements by preparing them internally.
|
|
6
7
|
*
|
|
@@ -10,18 +11,26 @@ import { maxPathNameLength } from '../resolveAndValidateOptions.js';
|
|
|
10
11
|
export class RawSqliteConnection {
|
|
11
12
|
options;
|
|
12
13
|
_sqliteAPI = null;
|
|
14
|
+
sqlite3_stmt_isexplain;
|
|
13
15
|
/**
|
|
14
16
|
* The `sqlite3*` connection pointer.
|
|
15
17
|
*/
|
|
16
18
|
db = 0;
|
|
19
|
+
statementCache;
|
|
17
20
|
constructor(options) {
|
|
18
21
|
this.options = options;
|
|
22
|
+
this.statementCache =
|
|
23
|
+
options.preparedStatementsCache > 0 ? new PreparedStatementCache(options.preparedStatementsCache) : null;
|
|
19
24
|
}
|
|
20
25
|
get isOpen() {
|
|
21
26
|
return this.db != 0;
|
|
22
27
|
}
|
|
23
28
|
async init() {
|
|
24
|
-
const
|
|
29
|
+
const { module, vfs } = await loadModuleAndVfs(this.options);
|
|
30
|
+
await this.initWithModule(module, vfs);
|
|
31
|
+
}
|
|
32
|
+
async initWithModule(module, vfs) {
|
|
33
|
+
const api = (this._sqliteAPI = await this.openSQLiteAPI(module, vfs));
|
|
25
34
|
this.db = await api.open_v2(this.options.filename, this.options.readonly ? 1 /* SQLITE_OPEN_READONLY */ : 6 /* SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE */);
|
|
26
35
|
await this.executeRaw(`PRAGMA temp_store = ${this.options.temporaryStorage};`);
|
|
27
36
|
if (this.options.encryptionKey) {
|
|
@@ -31,9 +40,9 @@ export class RawSqliteConnection {
|
|
|
31
40
|
await this.executeRaw(`PRAGMA cache_size = -${this.options.cacheSizeKb};`);
|
|
32
41
|
await this.executeRaw(`SELECT powersync_update_hooks('install');`);
|
|
33
42
|
}
|
|
34
|
-
async openSQLiteAPI() {
|
|
35
|
-
const { module, vfs } = await loadModuleAndVfs(this.options);
|
|
43
|
+
async openSQLiteAPI(module, vfs) {
|
|
36
44
|
vfs.mxPathname = maxPathNameLength;
|
|
45
|
+
this.sqlite3_stmt_isexplain = module.cwrap('sqlite3_stmt_isexplain', 'int', ['int']);
|
|
37
46
|
const sqlite3 = WaSqliteFactory(module);
|
|
38
47
|
sqlite3.vfs_register(vfs, true);
|
|
39
48
|
/**
|
|
@@ -101,7 +110,7 @@ export class RawSqliteConnection {
|
|
|
101
110
|
async executeRaw(sql, bindings) {
|
|
102
111
|
const results = [];
|
|
103
112
|
const api = this.requireSqlite();
|
|
104
|
-
for await (const stmt of
|
|
113
|
+
for await (const stmt of this.cachedStatements(api, sql)) {
|
|
105
114
|
let columns;
|
|
106
115
|
const rs = await this.stepThroughStatement(api, stmt, bindings ?? [], columns);
|
|
107
116
|
columns = rs.columnNames;
|
|
@@ -138,9 +147,51 @@ export class RawSqliteConnection {
|
|
|
138
147
|
}
|
|
139
148
|
async close() {
|
|
140
149
|
if (this.isOpen) {
|
|
141
|
-
|
|
150
|
+
const api = this.requireSqlite();
|
|
151
|
+
if (this.statementCache) {
|
|
152
|
+
for (const stmt of this.statementCache.drain()) {
|
|
153
|
+
await api.finalize(stmt);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
await api.close(this.db);
|
|
142
157
|
this.db = 0;
|
|
143
158
|
}
|
|
144
159
|
}
|
|
160
|
+
async *cachedStatements(api, sql) {
|
|
161
|
+
{
|
|
162
|
+
const existing = this.statementCache?.lookup(sql);
|
|
163
|
+
if (existing != null) {
|
|
164
|
+
yield existing;
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const inner = api.statements(this.db, sql, { unscoped: true });
|
|
169
|
+
const preparedStatements = [];
|
|
170
|
+
try {
|
|
171
|
+
for await (const stmt of inner) {
|
|
172
|
+
preparedStatements.push(stmt);
|
|
173
|
+
yield stmt;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
// We can only cache statements if the sql text corresponds to a single statement, otherwise it's not clear what
|
|
178
|
+
// portion of the original sql text to use as a key.
|
|
179
|
+
if (preparedStatements.length === 1 && this.statementCache) {
|
|
180
|
+
const stmt = preparedStatements[0];
|
|
181
|
+
// Don't cache EXPLAIN statements, their result becomes invalid after schema changes.
|
|
182
|
+
if (this.sqlite3_stmt_isexplain(stmt) == 0) {
|
|
183
|
+
const evicted = this.statementCache.addStatement(sql, stmt);
|
|
184
|
+
if (evicted != null) {
|
|
185
|
+
await api.finalize(evicted);
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// We're not caching statements, so finalize them.
|
|
191
|
+
for (const stmt of preparedStatements) {
|
|
192
|
+
await api.finalize(stmt);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
145
196
|
}
|
|
146
197
|
//# sourceMappingURL=RawSqliteConnection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RawSqliteConnection.js","sourceRoot":"","sources":["../../../../src/db/adapters/wa-sqlite/RawSqliteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"RawSqliteConnection.js","sourceRoot":"","sources":["../../../../src/db/adapters/wa-sqlite/RawSqliteConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare class PreparedStatementCache {
|
|
2
|
+
#private;
|
|
3
|
+
constructor(size: number);
|
|
4
|
+
/**
|
|
5
|
+
* Attempts to look up the cached sql statement, if it's currently cached.
|
|
6
|
+
*/
|
|
7
|
+
lookup(sql: string): number | null;
|
|
8
|
+
/**
|
|
9
|
+
* Adds a new statement into the cache.
|
|
10
|
+
*
|
|
11
|
+
* If that exceeds the target size of the statement cache, returns an old statement to evict.
|
|
12
|
+
* The caller is responsible for freeing that statement.
|
|
13
|
+
*/
|
|
14
|
+
addStatement(sql: string, statement: number): number | null;
|
|
15
|
+
drain(): number[];
|
|
16
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export class PreparedStatementCache {
|
|
2
|
+
#size;
|
|
3
|
+
// Note that Map preserves insertion order, which allows using it as an LRU
|
|
4
|
+
// cache (with the first element being the first element to evict).
|
|
5
|
+
#statements = new Map();
|
|
6
|
+
constructor(size) {
|
|
7
|
+
this.#size = size;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Attempts to look up the cached sql statement, if it's currently cached.
|
|
11
|
+
*/
|
|
12
|
+
lookup(sql) {
|
|
13
|
+
const foundStatement = this.#statements.get(sql);
|
|
14
|
+
if (foundStatement != null) {
|
|
15
|
+
// Delete and re-insert to move to the end (most-recently-used position).
|
|
16
|
+
this.#statements.delete(sql);
|
|
17
|
+
this.#statements.set(sql, foundStatement);
|
|
18
|
+
return foundStatement;
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Adds a new statement into the cache.
|
|
24
|
+
*
|
|
25
|
+
* If that exceeds the target size of the statement cache, returns an old statement to evict.
|
|
26
|
+
* The caller is responsible for freeing that statement.
|
|
27
|
+
*/
|
|
28
|
+
addStatement(sql, statement) {
|
|
29
|
+
this.#statements.set(sql, statement);
|
|
30
|
+
if (this.#statements.size > this.#size) {
|
|
31
|
+
for (const [k, v] of this.#statements.entries()) {
|
|
32
|
+
this.#statements.delete(k);
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
drain() {
|
|
39
|
+
const values = [...this.#statements.values()];
|
|
40
|
+
this.#statements.clear();
|
|
41
|
+
return values;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=StatementCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatementCache.js","sourceRoot":"","sources":["../../../../src/db/adapters/wa-sqlite/StatementCache.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sBAAsB;IACxB,KAAK,CAAS;IACvB,2EAA2E;IAC3E,mEAAmE;IAC1D,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,YAAY,IAAY;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,yEAAyE;YACzE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAC1C,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAW,EAAE,SAAiB;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -49,7 +49,7 @@ export class WASQLiteOpenFactory {
|
|
|
49
49
|
return this.openAdapter();
|
|
50
50
|
}
|
|
51
51
|
async openConnection() {
|
|
52
|
-
const { enableMultiTabs, useWebWorker, vfs, dbFilename, encryptionKey, temporaryStorage, cacheSizeKb } = this.options;
|
|
52
|
+
const { enableMultiTabs, useWebWorker, vfs, dbFilename, encryptionKey, temporaryStorage, cacheSizeKb, preparedStatementsCache } = this.options;
|
|
53
53
|
if (!enableMultiTabs) {
|
|
54
54
|
this.logger.log({ level: LogLevels.warn, message: 'Multiple tabs are not enabled in this browser' });
|
|
55
55
|
}
|
|
@@ -63,7 +63,9 @@ export class WASQLiteOpenFactory {
|
|
|
63
63
|
vfs,
|
|
64
64
|
encryptionKey,
|
|
65
65
|
temporaryStorage,
|
|
66
|
-
cacheSizeKb
|
|
66
|
+
cacheSizeKb,
|
|
67
|
+
// TODO: Enable prepared statement cache by default?
|
|
68
|
+
preparedStatementsCache: preparedStatementsCache ?? 0
|
|
67
69
|
};
|
|
68
70
|
}
|
|
69
71
|
if (useWebWorker) {
|
|
@@ -112,10 +114,11 @@ export class WASQLiteOpenFactory {
|
|
|
112
114
|
// This VFS supports concurrent reads, so we can open additional workers to host read-only connections for
|
|
113
115
|
// concurrent reads / writes.
|
|
114
116
|
const additionalReadersCount = this.options.additionalReaders ?? 1;
|
|
117
|
+
const additionalReaderPromises = [];
|
|
115
118
|
for (let i = 0; i < additionalReadersCount; i++) {
|
|
116
|
-
|
|
117
|
-
additionalReaders.push(reader);
|
|
119
|
+
additionalReaderPromises.push(openDatabaseWorker(true));
|
|
118
120
|
}
|
|
121
|
+
additionalReaders.push(...(await Promise.all(additionalReaderPromises)));
|
|
119
122
|
}
|
|
120
123
|
}
|
|
121
124
|
else {
|