11// @ts -ignore
22import { FacadeVFS } from '@journeyapps/wa-sqlite/src/FacadeVFS.js' ;
33import * as VFS from '@journeyapps/wa-sqlite/src/VFS.js' ;
4- import { emptyWalState , WalIndexChange , WriteAheadBuffers , WriteAheadState } from './shared.js' ;
4+ import { emptyWalState , WalIndexChange , WalOverlayEntry , WriteAheadBuffers , WriteAheadState } from './shared.js' ;
55
66const mainDbSentinel = Symbol ( ) ;
77
@@ -10,7 +10,7 @@ export class InMemoryWriteAheadLog extends FacadeVFS {
1010 #files = new Map < string , LocalFile | typeof mainDbSentinel > ( ) ;
1111
1212 #tx: WriteAheadTransaction | undefined = undefined ;
13- #newOverlayPagesToSendToMainTab = new Map < number , number > ( ) ;
13+ #newOverlayPagesToSendToMainTab = new Map < number , WalOverlayEntry > ( ) ;
1414
1515 writeAheadState : WriteAheadState = emptyWalState ( ) ;
1616
@@ -23,7 +23,7 @@ export class InMemoryWriteAheadLog extends FacadeVFS {
2323 }
2424
2525 takeChanges ( ) : WalIndexChange {
26- const added : number [ ] = [ ] ;
26+ const added : ( number | WalOverlayEntry ) [ ] = [ ] ;
2727 this . #newOverlayPagesToSendToMainTab. forEach ( ( v , k ) => {
2828 added . push ( k ) ;
2929 added . push ( v ) ;
@@ -40,7 +40,7 @@ export class InMemoryWriteAheadLog extends FacadeVFS {
4040
4141 jAccess ( zName : string , _pFlags : number , pResOut : DataView ) {
4242 const file = this . #files. get ( zName ) ;
43- pResOut . setInt32 ( 0 , file ? 1 : 0 , true ) ;
43+ pResOut . setInt32 ( 0 , file != null ? 1 : 0 , true ) ;
4444 return VFS . SQLITE_OK ;
4545 }
4646
@@ -97,7 +97,12 @@ export class InMemoryWriteAheadLog extends FacadeVFS {
9797 const page = overlay . get ( offset < 100 ? 0 : offset ) ;
9898
9999 if ( page != null ) {
100- const source = new Uint8Array ( this . buffers . writeAheadLog , offset < 100 ? page + offset : page , readableBytes ) ;
100+ const pageOffset = page . logOffset ;
101+ const source = new Uint8Array (
102+ this . buffers . writeAheadLog ,
103+ offset < 100 ? pageOffset + offset : pageOffset ,
104+ readableBytes
105+ ) ;
101106 data . set ( source ) ;
102107 } else {
103108 // Page is not in WAL overlay, read directly from underlying in-memory buffer.
@@ -114,7 +119,7 @@ export class InMemoryWriteAheadLog extends FacadeVFS {
114119 }
115120 }
116121
117- if ( endOffset < data . byteLength ) {
122+ if ( readableBytes < data . byteLength ) {
118123 data . fill ( 0 , readableBytes ) ; // Fill rest with zeroes.
119124 return VFS . SQLITE_IOERR_SHORT_READ ;
120125 }
@@ -179,6 +184,15 @@ export class InMemoryWriteAheadLog extends FacadeVFS {
179184 return VFS . SQLITE_OK ;
180185 }
181186
187+ jDelete ( name : string ) {
188+ if ( name === '/database' ) {
189+ return VFS . SQLITE_IOERR_DELETE ;
190+ }
191+
192+ this . #files. delete ( name ) ;
193+ return VFS . SQLITE_OK ;
194+ }
195+
182196 jDeviceCharacteristics ( ) : number {
183197 return VFS . SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | VFS . SQLITE_IOCAP_BATCH_ATOMIC ;
184198 }
@@ -208,17 +222,17 @@ export class InMemoryWriteAheadLog extends FacadeVFS {
208222 #commit( tx : WriteAheadTransaction ) {
209223 this . writeAheadState . walEnd = tx . walEndOffset ;
210224 this . writeAheadState . fileSize = tx . fileSize ;
211- tx . changedPages . forEach ( ( walOffset , databaseOffset ) => {
212- this . #newOverlayPagesToSendToMainTab. set ( databaseOffset , walOffset ) ;
213- this . writeAheadState . overlay . set ( databaseOffset , walOffset ) ;
225+ tx . changedPages . forEach ( ( walEntry , databaseOffset ) => {
226+ this . #newOverlayPagesToSendToMainTab. set ( databaseOffset , walEntry ) ;
227+ this . writeAheadState . overlay . set ( databaseOffset , walEntry ) ;
214228 } ) ;
215229 }
216230}
217231
218232class WriteAheadTransaction {
219233 walEndOffset : number ;
220234 fileSize : number ;
221- changedPages = new Map < number , number > ( ) ;
235+ changedPages = new Map < number , WalOverlayEntry > ( ) ;
222236
223237 constructor (
224238 endOffset : number ,
@@ -241,7 +255,7 @@ class WriteAheadTransaction {
241255 new Uint8Array ( wal , currentEnd , data . length ) . set ( data ) ;
242256
243257 this . walEndOffset = newEnd ;
244- this . changedPages . set ( offset , currentEnd ) ;
258+ this . changedPages . set ( offset , { logOffset : currentEnd , size : data . length } ) ;
245259 return true ;
246260 }
247261
0 commit comments