Skip to content

Commit 30c1bcd

Browse files
committed
Serdes robustness.
1 parent 9b4002f commit 30c1bcd

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

ext/serdes/serdes.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,21 @@ import (
88
"github.com/ncruces/go-sqlite3/vfs"
99
)
1010

11+
const vfsName = "github.com/ncruces/go-sqlite3/ext/serdes.sliceVFS"
12+
1113
func init() {
1214
vfs.Register(vfsName, sliceVFS{})
1315
}
1416

17+
var fileToOpen = make(chan *sliceFile, 1)
18+
1519
// Serialize backs up a database into a byte slice.
1620
//
1721
// https://sqlite.org/c3ref/serialize.html
1822
func Serialize(db *sqlite3.Conn, schema string) ([]byte, error) {
1923
var file sliceFile
2024
fileToOpen <- &file
21-
err := db.Backup(schema, "file:db?vfs="+vfsName)
25+
err := db.Backup(schema, "file:serdes.db?vfs="+vfsName)
2226
return file.data, err
2327
}
2428

@@ -38,21 +42,21 @@ func Serialize(db *sqlite3.Conn, schema string) ([]byte, error) {
3842
// ["reader"]: https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs
3943
func Deserialize(db *sqlite3.Conn, schema string, data []byte) error {
4044
fileToOpen <- &sliceFile{data}
41-
return db.Restore(schema, "file:db?vfs="+vfsName)
45+
return db.Restore(schema, "file:serdes.db?vfs="+vfsName)
4246
}
4347

44-
var fileToOpen = make(chan *sliceFile, 1)
45-
46-
const vfsName = "github.com/ncruces/go-sqlite3/ext/deserialize.sliceVFS"
47-
4848
type sliceVFS struct{}
4949

5050
func (sliceVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, error) {
51-
if flags&vfs.OPEN_MAIN_DB == 0 {
52-
// notest // OPEN_MEMORY
51+
if flags&vfs.OPEN_MAIN_DB == 0 || name != "serdes.db" {
5352
return nil, flags, sqlite3.CANTOPEN
5453
}
55-
return <-fileToOpen, flags | vfs.OPEN_MEMORY, nil
54+
select {
55+
case file := <-fileToOpen:
56+
return file, flags | vfs.OPEN_MEMORY, nil
57+
default:
58+
return nil, flags, sqlite3.MISUSE
59+
}
5660
}
5761

5862
func (sliceVFS) Delete(name string, dirSync bool) error {
@@ -61,7 +65,7 @@ func (sliceVFS) Delete(name string, dirSync bool) error {
6165
}
6266

6367
func (sliceVFS) Access(name string, flag vfs.AccessFlag) (bool, error) {
64-
return name == "db", nil
68+
return name == "serdes.db", nil
6569
}
6670

6771
func (sliceVFS) FullPathname(name string) (string, error) {

ext/serdes/serdes_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package serdes_test
22

33
import (
4+
"errors"
45
"io"
56
"net/http"
67
"testing"
@@ -66,3 +67,21 @@ func httpGet() ([]byte, error) {
6667
defer res.Body.Close()
6768
return io.ReadAll(res.Body)
6869
}
70+
71+
func TestOpen_errors(t *testing.T) {
72+
_, err := sqlite3.Open("file:test.db?vfs=github.com/ncruces/go-sqlite3/ext/serdes.sliceVFS")
73+
if err == nil {
74+
t.Error("want error")
75+
}
76+
if !errors.Is(err, sqlite3.CANTOPEN) {
77+
t.Errorf("got %v, want sqlite3.CANTOPEN", err)
78+
}
79+
80+
_, err = sqlite3.Open("file:serdes.db?vfs=github.com/ncruces/go-sqlite3/ext/serdes.sliceVFS")
81+
if err == nil {
82+
t.Error("want error")
83+
}
84+
if !errors.Is(err, sqlite3.MISUSE) {
85+
t.Errorf("got %v, want sqlite3.MISUSE", err)
86+
}
87+
}

0 commit comments

Comments
 (0)