Skip to content

Commit 2c582a1

Browse files
committed
VFS improvements.
1 parent 20a67ca commit 2c582a1

File tree

5 files changed

+35
-16
lines changed

5 files changed

+35
-16
lines changed

ext/serdes/serdes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (sliceVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, e
5959
}
6060

6161
func (sliceVFS) Delete(name string, dirSync bool) error {
62-
// notest // OPEN_MEMORY
62+
// notest // no journals to delete
6363
return sqlite3.IOERR_DELETE
6464
}
6565

ext/serdes/serdes_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func Test_wal(t *testing.T) {
2929

3030
compareDBs(t, data, walDB)
3131

32-
err = serdes.Deserialize(db, "main", walDB)
32+
err = serdes.Deserialize(db, "temp", walDB)
3333
if err != nil {
3434
t.Fatal(err)
3535
}

util/vfsutil/slice.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,26 @@ func (*SliceFile) Close() error { return nil }
6969
func (*SliceFile) Sync(flags vfs.SyncFlag) error { return nil }
7070

7171
// Lock implements [vfs.File].
72-
func (*SliceFile) Lock(lock vfs.LockLevel) error { return nil }
72+
func (*SliceFile) Lock(lock vfs.LockLevel) error {
73+
// notest // not concurrency safe
74+
return sqlite3.IOERR_LOCK
75+
}
7376

7477
// Unlock implements [vfs.File].
75-
func (*SliceFile) Unlock(lock vfs.LockLevel) error { return nil }
78+
func (*SliceFile) Unlock(lock vfs.LockLevel) error {
79+
// notest // not concurrency safe
80+
return sqlite3.IOERR_UNLOCK
81+
}
7682

7783
// CheckReservedLock implements [vfs.File].
7884
func (*SliceFile) CheckReservedLock() (bool, error) {
79-
// notest // OPEN_MEMORY
85+
// notest // not concurrency safe
8086
return false, sqlite3.IOERR_CHECKRESERVEDLOCK
8187
}
8288

8389
// SectorSize implements [vfs.File].
8490
func (*SliceFile) SectorSize() int {
85-
// notest // IOCAP_POWERSAFE_OVERWRITE
91+
// notest // safe default
8692
return 0
8793
}
8894

util/vfsutil/wrap.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ func UnwrapFile[T vfs.File](f vfs.File) (_ T, _ bool) {
2222
}
2323
}
2424

25+
// WrapOpen helps wrap [vfs.VFS].
26+
func WrapOpen(f vfs.VFS, name string, flags vfs.OpenFlag) (file vfs.File, _ vfs.OpenFlag, err error) {
27+
if f, ok := f.(vfs.VFSFilename); name == "" && ok {
28+
return f.OpenFilename(nil, flags)
29+
}
30+
return f.Open(name, flags)
31+
}
32+
2533
// WrapOpenFilename helps wrap [vfs.VFSFilename].
2634
func WrapOpenFilename(f vfs.VFS, name *vfs.Filename, flags vfs.OpenFlag) (file vfs.File, _ vfs.OpenFlag, err error) {
2735
if f, ok := f.(vfs.VFSFilename); ok {

vfs/readervfs/reader.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ package readervfs
33
import (
44
"github.com/ncruces/go-sqlite3"
55
"github.com/ncruces/go-sqlite3/util/ioutil"
6+
"github.com/ncruces/go-sqlite3/util/vfsutil"
67
"github.com/ncruces/go-sqlite3/vfs"
78
)
89

910
type readerVFS struct{}
1011

1112
func (readerVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, error) {
13+
// Temp journals, as used by the sorter, use SliceFile.
14+
if flags&vfs.OPEN_TEMP_JOURNAL != 0 {
15+
return &vfsutil.SliceFile{}, flags | vfs.OPEN_MEMORY, nil
16+
}
17+
// Refuse to open all other file types.
1218
if flags&vfs.OPEN_MAIN_DB == 0 {
13-
// notest
1419
return nil, flags, sqlite3.CANTOPEN
1520
}
1621
readerMtx.RLock()
@@ -22,12 +27,12 @@ func (readerVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag,
2227
}
2328

2429
func (readerVFS) Delete(name string, dirSync bool) error {
25-
// notest
30+
// notest // IOCAP_IMMUTABLE
2631
return sqlite3.IOERR_DELETE
2732
}
2833

2934
func (readerVFS) Access(name string, flag vfs.AccessFlag) (bool, error) {
30-
// notest
35+
// notest // IOCAP_IMMUTABLE
3136
return false, sqlite3.IOERR_ACCESS
3237
}
3338

@@ -42,37 +47,37 @@ func (readerFile) Close() error {
4247
}
4348

4449
func (readerFile) WriteAt(b []byte, off int64) (n int, err error) {
45-
// notest
50+
// notest // IOCAP_IMMUTABLE
4651
return 0, sqlite3.IOERR_WRITE
4752
}
4853

4954
func (readerFile) Truncate(size int64) error {
50-
// notest
55+
// notest // IOCAP_IMMUTABLE
5156
return sqlite3.IOERR_TRUNCATE
5257
}
5358

5459
func (readerFile) Sync(flag vfs.SyncFlag) error {
55-
// notest
60+
// notest // IOCAP_IMMUTABLE
5661
return sqlite3.IOERR_FSYNC
5762
}
5863

5964
func (readerFile) Lock(lock vfs.LockLevel) error {
60-
// notest
65+
// notest // IOCAP_IMMUTABLE
6166
return sqlite3.IOERR_LOCK
6267
}
6368

6469
func (readerFile) Unlock(lock vfs.LockLevel) error {
65-
// notest
70+
// notest // IOCAP_IMMUTABLE
6671
return sqlite3.IOERR_UNLOCK
6772
}
6873

6974
func (readerFile) CheckReservedLock() (bool, error) {
70-
// notest
75+
// notest // IOCAP_IMMUTABLE
7176
return false, sqlite3.IOERR_CHECKRESERVEDLOCK
7277
}
7378

7479
func (readerFile) SectorSize() int {
75-
// notest
80+
// notest // IOCAP_IMMUTABLE
7681
return 0
7782
}
7883

0 commit comments

Comments
 (0)