Skip to content

Commit 20a67ca

Browse files
committed
WAL mode serdes.
1 parent 789e2dc commit 20a67ca

File tree

3 files changed

+36
-8
lines changed

3 files changed

+36
-8
lines changed

ext/serdes/serdes.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var fileToOpen = make(chan *[]byte, 1)
2121
func Serialize(db *sqlite3.Conn, schema string) ([]byte, error) {
2222
var file []byte
2323
fileToOpen <- &file
24-
err := db.Backup(schema, "file:serdes.db?vfs="+vfsName)
24+
err := db.Backup(schema, "file:serdes.db?nolock=1&vfs="+vfsName)
2525
return file, err
2626
}
2727

@@ -41,7 +41,7 @@ func Serialize(db *sqlite3.Conn, schema string) ([]byte, error) {
4141
// ["reader"]: https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs
4242
func Deserialize(db *sqlite3.Conn, schema string, data []byte) error {
4343
fileToOpen <- &data
44-
return db.Restore(schema, "file:serdes.db?vfs="+vfsName)
44+
return db.Restore(schema, "file:serdes.db?immutable=1&vfs="+vfsName)
4545
}
4646

4747
type sliceVFS struct{}

ext/serdes/serdes_test.go

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

33
import (
4+
_ "embed"
45
"errors"
56
"io"
67
"net/http"
@@ -11,7 +12,30 @@ import (
1112
"github.com/ncruces/go-sqlite3/ext/serdes"
1213
)
1314

14-
func TestDeserialize(t *testing.T) {
15+
//go:embed testdata/wal.db
16+
var walDB []byte
17+
18+
func Test_wal(t *testing.T) {
19+
db, err := sqlite3.Open("testdata/wal.db")
20+
if err != nil {
21+
t.Fatal(err)
22+
}
23+
defer db.Close()
24+
25+
data, err := serdes.Serialize(db, "main")
26+
if err != nil {
27+
t.Fatal(err)
28+
}
29+
30+
compareDBs(t, data, walDB)
31+
32+
err = serdes.Deserialize(db, "main", walDB)
33+
if err != nil {
34+
t.Fatal(err)
35+
}
36+
}
37+
38+
func Test_northwind(t *testing.T) {
1539
if testing.Short() {
1640
t.Skip("skipping in short mode")
1741
}
@@ -37,10 +61,14 @@ func TestDeserialize(t *testing.T) {
3761
t.Fatal(err)
3862
}
3963

40-
if len(input) != len(output) {
64+
compareDBs(t, input, output)
65+
}
66+
67+
func compareDBs(t *testing.T, a, b []byte) {
68+
if len(a) != len(b) {
4169
t.Fatal("lengths are different")
4270
}
43-
for i := range input {
71+
for i := range a {
4472
// These may be different.
4573
switch {
4674
case 24 <= i && i < 28:
@@ -53,14 +81,14 @@ func TestDeserialize(t *testing.T) {
5381
// SQLite version that wrote the file.
5482
continue
5583
}
56-
if input[i] != output[i] {
57-
t.Errorf("difference at %d: %d %d", i, input[i], output[i])
84+
if a[i] != b[i] {
85+
t.Errorf("difference at %d: %d %d", i, a[i], b[i])
5886
}
5987
}
6088
}
6189

6290
func httpGet() ([]byte, error) {
63-
res, err := http.Get("https://raw.githubusercontent.com/jpwhite3/northwind-SQLite3/refs/heads/main/dist/northwind.db")
91+
res, err := http.Get("https://github.com/jpwhite3/northwind-SQLite3/raw/refs/heads/main/dist/northwind.db")
6492
if err != nil {
6593
return nil, err
6694
}

ext/serdes/testdata/wal.db

512 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)