diff --git a/backup.go b/backup.go index 62b7c00..429a0fa 100644 --- a/backup.go +++ b/backup.go @@ -129,6 +129,6 @@ func (b *Backup) Remaining() int { // // https://www.sqlite.org/c3ref/backup_finish.html#sqlite3backuppagecount func (b *Backup) PageCount() int { - r := b.c.call(b.c.api.backupFinish, uint64(b.handle)) + r := b.c.call(b.c.api.backupPageCount, uint64(b.handle)) return int(r[0]) } diff --git a/sqlite3vfs/reader_test.go b/sqlite3vfs/reader_test.go index 786e71d..192d6aa 100644 --- a/sqlite3vfs/reader_test.go +++ b/sqlite3vfs/reader_test.go @@ -4,7 +4,14 @@ import ( "database/sql" "fmt" "log" + "os" + "path/filepath" + "strings" + "testing" + _ "embed" + + "github.com/ncruces/go-sqlite3" _ "github.com/ncruces/go-sqlite3/driver" _ "github.com/ncruces/go-sqlite3/embed" "github.com/ncruces/go-sqlite3/sqlite3vfs" @@ -58,3 +65,85 @@ func ExampleReaderVFS() { // 2012.03: 18477 million Dollars // 2012.06: 18270 million Dollars } + +//go:embed testdata/test.db +var testDB string + +func TestReaderVFS_Open(t *testing.T) { + sqlite3vfs.Register("reader", sqlite3vfs.ReaderVFS{ + "test.db": sqlite3vfs.NewSizeReaderAt(strings.NewReader(testDB)), + }) + + _, err := sqlite3.Open("file:demo.db?vfs=reader&mode=ro") + if err == nil { + t.Error("want error") + } + + db, err := sqlite3.Open("file:test.db?vfs=reader&mode=ro") + if err != nil { + t.Error(err) + } + defer db.Close() + + stmt, _, err := db.Prepare(`SELECT id, name FROM users`) + if err != nil { + t.Fatal(err) + } + defer stmt.Close() + + row := 0 + ids := []int{0, 1, 2} + names := []string{"go", "zig", "whatever"} + for ; stmt.Step(); row++ { + id := stmt.ColumnInt(0) + name := stmt.ColumnText(1) + + if id != ids[row] { + t.Errorf("got %d, want %d", id, ids[row]) + } + if name != names[row] { + t.Errorf("got %q, want %q", name, names[row]) + } + } + if row != 3 { + t.Errorf("got %d, want %d", row, len(ids)) + } + + if err := stmt.Err(); err != nil { + t.Fatal(err) + } + + err = stmt.Close() + if err != nil { + t.Fatal(err) + } + + err = db.Close() + if err != nil { + t.Fatal(err) + } +} + +func TestNewSizeReaderAt(t *testing.T) { + n, err := sqlite3vfs.NewSizeReaderAt(strings.NewReader("abc")).Size() + if err != nil { + t.Fatal(err) + } + if n != 3 { + t.Errorf("got %d", n) + } + + f, err := os.Create(filepath.Join(t.TempDir(), "abc.txt")) + if err != nil { + t.Fatal(err) + } + defer f.Close() + + n, err = sqlite3vfs.NewSizeReaderAt(f).Size() + if err != nil { + t.Fatal(err) + } + if n != 0 { + t.Errorf("got %d", n) + } +} diff --git a/sqlite3vfs/testdata/test.db b/sqlite3vfs/testdata/test.db new file mode 100644 index 0000000..48ea4e7 Binary files /dev/null and b/sqlite3vfs/testdata/test.db differ diff --git a/sqlite3vfs/vfs_test.go b/sqlite3vfs/vfs_test.go index d794451..56dc105 100644 --- a/sqlite3vfs/vfs_test.go +++ b/sqlite3vfs/vfs_test.go @@ -198,6 +198,15 @@ func Test_vfsAccess(t *testing.T) { t.Error("can't access directory") } + util.WriteString(mod, 8, file) + rc = vfsAccess(ctx, mod, 0, 8, ACCESS_READ, 4) + if rc != _OK { + t.Fatal("returned", rc) + } + if got := util.ReadUint32(mod, 4); got != 1 { + t.Error("can't access file") + } + util.WriteString(mod, 8, file) rc = vfsAccess(ctx, mod, 0, 8, ACCESS_READWRITE, 4) if rc != _OK { diff --git a/tests/backup_test.go b/tests/backup_test.go index cc3fbec..1d3d0a8 100644 --- a/tests/backup_test.go +++ b/tests/backup_test.go @@ -124,4 +124,46 @@ func TestBackup(t *testing.T) { t.Fatal(err) } }() + + func() { // Incremental. + db, err := sqlite3.Open(backupName) + if err != nil { + t.Fatal(err) + } + defer db.Close() + + b, err := db.BackupInit("main", ":memory:") + if err != nil { + t.Fatal(err) + } + defer b.Close() + + done, err := b.Step(1) + if done { + t.Error("want false") + } + if err != nil { + t.Error(err) + } + + n := b.Remaining() + if n != 1 { + t.Errorf("got %d", n) + } + + n = b.PageCount() + if n != 2 { + t.Errorf("got %d", n) + } + + err = b.Close() + if err != nil { + t.Fatal(err) + } + + err = db.Close() + if err != nil { + t.Fatal(err) + } + }() } diff --git a/tests/driver_test.go b/tests/driver_test.go index 732dc17..94a5c97 100644 --- a/tests/driver_test.go +++ b/tests/driver_test.go @@ -27,18 +27,32 @@ func TestDriver(t *testing.T) { } defer conn.Close() - _, err = conn.ExecContext(ctx, + res, err := conn.ExecContext(ctx, `CREATE TABLE IF NOT EXISTS users (id INT, name VARCHAR(10))`) if err != nil { t.Fatal(err) } + changes, err := res.RowsAffected() + if err != nil { + t.Fatal(err) + } + if changes != 0 { + t.Errorf("got %d want 0", changes) + } + id, err := res.LastInsertId() + if err != nil { + t.Fatal(err) + } + if id != 0 { + t.Errorf("got %d want 0", changes) + } - res, err := conn.ExecContext(ctx, + res, err = conn.ExecContext(ctx, `INSERT INTO users (id, name) VALUES (0, 'go'), (1, 'zig'), (2, 'whatever')`) if err != nil { t.Fatal(err) } - changes, err := res.RowsAffected() + changes, err = res.RowsAffected() if err != nil { t.Fatal(err) }