From b0d5861d10a5472d4ac07a5e27331ec492be69b6 Mon Sep 17 00:00:00 2001 From: sentriz Date: Mon, 14 Feb 2022 17:53:10 +0000 Subject: [PATCH] feat(mockfs): add DumpDB method --- server/mockfs/mockfs.go | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/server/mockfs/mockfs.go b/server/mockfs/mockfs.go index 7e6f036b..579a079a 100644 --- a/server/mockfs/mockfs.go +++ b/server/mockfs/mockfs.go @@ -1,14 +1,17 @@ package mockfs import ( + "context" "errors" "fmt" + "net/url" "os" "path/filepath" "strings" "testing" "time" + "github.com/mattn/go-sqlite3" "go.senan.xyz/gonic/server/db" "go.senan.xyz/gonic/server/scanner" "go.senan.xyz/gonic/server/scanner/tags" @@ -246,6 +249,55 @@ func (m *MockFS) SetTags(path string, cb func(*Tags)) { cb(m.reader.tags[abspath]) } +func (m *MockFS) DumpDB(suffix ...string) { + var p []string + p = append(p, + "gonic", "dump", + strings.ReplaceAll(m.t.Name(), string(filepath.Separator), "-"), + fmt.Sprint(time.Now().UnixNano()), + ) + p = append(p, suffix...) + + destPath := filepath.Join(os.TempDir(), strings.Join(p, "-")) + dest, err := db.New(destPath, url.Values{}) + if err != nil { + m.t.Fatalf("create dest db: %v", err) + } + defer dest.Close() + + connSrc, err := m.db.DB.DB().Conn(context.Background()) + if err != nil { + m.t.Fatalf("getting src raw conn: %v", err) + } + defer connSrc.Close() + connDest, err := dest.DB.DB().Conn(context.Background()) + if err != nil { + m.t.Fatalf("getting dest raw conn: %v", err) + } + defer connDest.Close() + + err = connDest.Raw(func(connDest interface{}) error { + return connSrc.Raw(func(connSrc interface{}) error { + connDestq := connDest.(*sqlite3.SQLiteConn) + connSrcq := connSrc.(*sqlite3.SQLiteConn) + bk, err := connDestq.Backup("main", connSrcq, "main") + if err != nil { + return fmt.Errorf("create backup db: %w", err) + } + for done, _ := bk.Step(-1); !done; { + m.t.Logf("dumping db...") + } + if err := bk.Finish(); err != nil { + return fmt.Errorf("finishing dump: %w", err) + } + return nil + }) + }) + if err != nil { + m.t.Fatalf("backing up: %v", err) + } +} + type mreader struct { tags map[string]*Tags }