diff --git a/cayley.go b/cayley.go index 0516da5..7bc90f1 100644 --- a/cayley.go +++ b/cayley.go @@ -191,6 +191,28 @@ func main() { } func load(qw graph.QuadWriter, cfg *config.Config, path, typ string) error { + return decompressAndLoad(qw, cfg, path, typ, db.Load) +} + +func removeAll(qw graph.QuadWriter, cfg *config.Config, path, typ string) error { + return decompressAndLoad(qw, cfg, path, typ, remove) +} + +func remove(qw graph.QuadWriter, cfg *config.Config, dec quad.Unmarshaler) error { + for { + t, err := dec.Unmarshal() + if err != nil { + if err == io.EOF { + break + } + return err + } + qw.RemoveQuad(t) + } + return nil +} + +func decompressAndLoad(qw graph.QuadWriter, cfg *config.Config, path, typ string, loadFn func(graph.QuadWriter, *config.Config, quad.Unmarshaler) error) error { var r io.Reader if path == "" { diff --git a/cayley_test.go b/cayley_test.go index b0839e7..056f55e 100644 --- a/cayley_test.go +++ b/cayley_test.go @@ -296,8 +296,9 @@ var m2_actors = movie2.Save("name","movie2").Follow(filmToActor) ` var ( - once sync.Once - cfg = &config.Config{ + create sync.Once + deleteAndRecreate sync.Once + cfg = &config.Config{ DatabasePath: "30kmoviedata.nq.gz", DatabaseType: "memstore", ReplicationType: "single", @@ -309,7 +310,7 @@ var ( func prepare(t testing.TB) { var err error - once.Do(func() { + create.Do(func() { handle, err = db.Open(cfg) if err != nil { t.Fatalf("Failed to open %q: %v", cfg.DatabasePath, err) @@ -324,8 +325,37 @@ func prepare(t testing.TB) { }) } +func deletePrepare(t testing.TB) { + var err error + deleteAndRecreate.Do(func() { + prepare(t) + if !graph.IsPersistent(cfg.DatabaseType) { + err = removeAll(handle.QuadWriter, cfg, "", "cquad") + if err != nil { + t.Fatalf("Failed to remove %q: %v", cfg.DatabasePath, err) + } + err = load(handle.QuadWriter, cfg, "", "cquad") + if err != nil { + t.Fatalf("Failed to load %q: %v", cfg.DatabasePath, err) + } + } + }) +} + func TestQueries(t *testing.T) { prepare(t) + checkQueries(t) +} + +func TestDeletedAndRecreatedQueries(t *testing.T) { + if testing.Short() { + t.Skip() + } + deletePrepare(t) + checkQueries(t) +} + +func checkQueries(t *testing.T) { for _, test := range benchmarkQueries { if testing.Short() && test.long { continue