From 62af9c81d5311a9604b63b8eb4c3c8d1b31b1685 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Mon, 25 Nov 2019 20:03:37 +0100 Subject: [PATCH] BoltDB fixups Unmarshalling needs well-defined structs, also swap pointers in few places where needed. There are few more TODOS pending (like getting UpdatePackage fixed properly) --- pkg/package/database.go | 3 +- pkg/package/database_boltdb.go | 62 ++++++++++++++++++++++++---------- pkg/package/database_mem.go | 2 +- pkg/tree/tree.go | 2 +- 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/pkg/package/database.go b/pkg/package/database.go index af1ccc93..9e25ff09 100644 --- a/pkg/package/database.go +++ b/pkg/package/database.go @@ -38,11 +38,12 @@ type PackageSet interface { RemovePackage(Package) error GetPackageFiles(Package) ([]string, error) - SetPackageFiles(PackageFile) error + SetPackageFiles(*PackageFile) error RemovePackageFiles(Package) error } type PackageFile struct { + ID int `storm:"id,increment"` // primary key with auto increment PackageFingerprint string Files []string } diff --git a/pkg/package/database_boltdb.go b/pkg/package/database_boltdb.go index 3cee5139..0d342e62 100644 --- a/pkg/package/database_boltdb.go +++ b/pkg/package/database_boltdb.go @@ -16,6 +16,9 @@ package pkg import ( + "encoding/base64" + "fmt" + "hash/crc32" "os" "strconv" "sync" @@ -44,20 +47,45 @@ func NewBoltDatabase(path string) PackageDatabase { } func (db *BoltDatabase) Get(s string) (string, error) { - return "", errors.New("Not implemented") + bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second})) + if err != nil { + return "", err + } + defer bolt.Close() + var str string + bolt.Get("solver", s, &str) + + return str, errors.New("Not implemented") } func (db *BoltDatabase) Set(k, v string) error { - return errors.New("Not implemented") - + bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second})) + if err != nil { + return err + } + defer bolt.Close() + return bolt.Set("solver", k, v) } func (db *BoltDatabase) Create(v []byte) (string, error) { - return "", errors.New("Not implemented") + enc := base64.StdEncoding.EncodeToString(v) + crc32q := crc32.MakeTable(0xD5828281) + ID := fmt.Sprintf("%08x", crc32.Checksum([]byte(enc), crc32q)) // TODO: Replace with package fingerprint? + + return ID, db.Set(ID, enc) } func (db *BoltDatabase) Retrieve(ID string) ([]byte, error) { - return []byte{}, errors.New("Not implemented") + pa, err := db.Get(ID) + if err != nil { + return nil, err + } + + enc, err := base64.StdEncoding.DecodeString(pa) + if err != nil { + return nil, err + } + return enc, nil } func (db *BoltDatabase) FindPackage(tofind Package) (Package, error) { @@ -76,18 +104,13 @@ func (db *BoltDatabase) FindPackage(tofind Package) (Package, error) { } func (db *BoltDatabase) UpdatePackage(p Package) error { - - bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second})) + // TODO: Change, but by query we cannot update by ID + err := db.RemovePackage(p) if err != nil { return err } - defer bolt.Close() + _, err = db.CreatePackage(p) - dp, ok := p.(*DefaultPackage) - if !ok { - return errors.New("Bolt DB support only DefaultPackage type for now") - } - err = bolt.Update(dp) if err != nil { return err } @@ -106,7 +129,9 @@ func (db *BoltDatabase) GetPackage(ID string) (Package, error) { if err != nil { return nil, err } - err = bolt.One("ID", iid, p) + err = bolt.Select(q.Eq("ID", iid)).Limit(1).First(p) + + //err = bolt.One("id", iid, p) return p, err } @@ -199,7 +224,7 @@ func (db *BoltDatabase) GetPackageFiles(p Package) ([]string, error) { } return pf.Files, nil } -func (db *BoltDatabase) SetPackageFiles(p PackageFile) error { +func (db *BoltDatabase) SetPackageFiles(p *PackageFile) error { bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second})) if err != nil { return errors.Wrap(err, "Error opening boltdb "+db.Path) @@ -231,9 +256,10 @@ func (db *BoltDatabase) RemovePackage(p Package) error { return errors.Wrap(err, "Error opening boltdb "+db.Path) } defer bolt.Close() - p, err = db.FindPackage(p) + var found DefaultPackage + err = bolt.Select(q.Eq("Name", p.GetName()), q.Eq("Category", p.GetCategory()), q.Eq("Version", p.GetVersion())).Limit(1).Delete(&found) if err != nil { - return errors.Wrap(err, "No package found") + return errors.Wrap(err, "No package found to delete") } - return bolt.DeleteStruct(p) + return nil } diff --git a/pkg/package/database_mem.go b/pkg/package/database_mem.go index de57f3e9..7db21857 100644 --- a/pkg/package/database_mem.go +++ b/pkg/package/database_mem.go @@ -218,7 +218,7 @@ func (db *InMemoryDatabase) GetPackageFiles(p Package) ([]string, error) { return pa, nil } -func (db *InMemoryDatabase) SetPackageFiles(p PackageFile) error { +func (db *InMemoryDatabase) SetPackageFiles(p *PackageFile) error { db.Lock() defer db.Unlock() db.FileDatabase[p.PackageFingerprint] = p.Files diff --git a/pkg/tree/tree.go b/pkg/tree/tree.go index 647620af..f7054a46 100644 --- a/pkg/tree/tree.go +++ b/pkg/tree/tree.go @@ -61,7 +61,7 @@ func (gt *DefaultTree) World() ([]pkg.Package, error) { p, err := gt.GetPackageSet().GetPackage(pid) if err != nil { - return packages, err + return packages, errors.Wrap(err, "Package "+pid+" not found in the packageset") } packages = append(packages, p) }