diff --git a/pkg/package/database.go b/pkg/package/database.go index 1cdba75a..1af3d49b 100644 --- a/pkg/package/database.go +++ b/pkg/package/database.go @@ -23,7 +23,7 @@ type PackageDatabase interface { Get(s string) (string, error) Set(k, v string) error - Create([]byte) (string, error) + Create(string, []byte) (string, error) Retrieve(ID string) ([]byte, error) } diff --git a/pkg/package/database_boltdb.go b/pkg/package/database_boltdb.go index 647eae08..3069ee1a 100644 --- a/pkg/package/database_boltdb.go +++ b/pkg/package/database_boltdb.go @@ -17,8 +17,6 @@ package pkg import ( "encoding/base64" - "fmt" - "hash/crc32" "os" "strconv" "sync" @@ -66,13 +64,10 @@ func (db *BoltDatabase) Set(k, v string) error { defer bolt.Close() return bolt.Set("solver", k, v) } - -func (db *BoltDatabase) Create(v []byte) (string, error) { +func (db *BoltDatabase) Create(id string, v []byte) (string, error) { 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) + return id, db.Set(id, enc) } func (db *BoltDatabase) Retrieve(ID string) ([]byte, error) { diff --git a/pkg/package/database_mem.go b/pkg/package/database_mem.go index dacd5e9c..1ed47948 100644 --- a/pkg/package/database_mem.go +++ b/pkg/package/database_mem.go @@ -19,8 +19,6 @@ import ( "encoding/base64" "encoding/json" "errors" - "fmt" - "hash/crc32" "sync" ) @@ -64,12 +62,10 @@ func (db *InMemoryDatabase) Set(k, v string) error { return nil } -func (db *InMemoryDatabase) Create(v []byte) (string, error) { +func (db *InMemoryDatabase) Create(id string, v []byte) (string, error) { 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) + return id, db.Set(id, enc) } func (db *InMemoryDatabase) Retrieve(ID string) ([]byte, error) { @@ -131,7 +127,7 @@ func (db *InMemoryDatabase) CreatePackage(p Package) (string, error) { return "", err } - ID, err := db.Create(res) + ID, err := db.Create(pd.GetFingerPrint(), res) if err != nil { return "", err } @@ -149,51 +145,23 @@ func (db *InMemoryDatabase) encodePackage(p Package) (string, string, error) { return "", "", err } enc := base64.StdEncoding.EncodeToString(res) - crc32q := crc32.MakeTable(0xD5828281) - ID := fmt.Sprintf("%08x", crc32.Checksum([]byte(enc), crc32q)) // TODO: Replace with package fingerprint? - return ID, enc, nil + return p.GetFingerPrint(), enc, nil } func (db *InMemoryDatabase) FindPackage(p Package) (Package, error) { - - // TODO: Replace this piece, when IDs are fingerprint, findpackage becames O(1) - - for _, k := range db.GetPackages() { - pack, err := db.GetPackage(k) - if err != nil { - return nil, err - } - if pack.Matches(p) { - return pack, nil - } - } - return nil, errors.New("Package not found") + return db.GetPackage(p.GetFingerPrint()) } func (db *InMemoryDatabase) UpdatePackage(p Package) error { - var id string - found := false - for _, k := range db.GetPackages() { - pack, err := db.GetPackage(k) - if err != nil { - return err - } - if pack.Matches(p) { - id = k - found = true - break - } - } - if found { - _, enc, err := db.encodePackage(p) - if err != nil { - return err - } - - return db.Set(id, enc) + _, enc, err := db.encodePackage(p) + if err != nil { + return err } + + return db.Set(p.GetFingerPrint(), enc) + return errors.New("Package not found") } @@ -238,19 +206,11 @@ func (db *InMemoryDatabase) RemovePackageFiles(p Package) error { } func (db *InMemoryDatabase) RemovePackage(p Package) error { - for _, k := range db.GetPackages() { - pack, err := db.GetPackage(k) - if err != nil { - return err - } - if pack.Matches(p) { - db.Lock() - delete(db.Database, k) - db.Unlock() - return nil - } - } - return errors.New("Package not found") + db.Lock() + defer db.Unlock() + + delete(db.Database, p.GetFingerPrint()) + return nil } func (db *InMemoryDatabase) World() []Package { var all []Package