mirror of
https://github.com/mudler/luet.git
synced 2025-08-04 17:10:11 +00:00
Add FindPackages()
The version inmemory is optimized, while the boltdb implementation is not. It returns a list of the same package but with all the versions present in the db.
This commit is contained in:
parent
556668fcc4
commit
57181d7cbf
@ -33,6 +33,7 @@ type PackageSet interface {
|
|||||||
GetPackage(ID string) (Package, error)
|
GetPackage(ID string) (Package, error)
|
||||||
Clean() error
|
Clean() error
|
||||||
FindPackage(Package) (Package, error)
|
FindPackage(Package) (Package, error)
|
||||||
|
FindPackages(p Package) ([]Package, error)
|
||||||
UpdatePackage(p Package) error
|
UpdatePackage(p Package) error
|
||||||
GetAllPackages(packages chan Package) error
|
GetAllPackages(packages chan Package) error
|
||||||
RemovePackage(Package) error
|
RemovePackage(Package) error
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
version "github.com/hashicorp/go-version"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
storm "github.com/asdine/storm"
|
storm "github.com/asdine/storm"
|
||||||
@ -293,3 +294,27 @@ func (db *BoltDatabase) FindPackageCandidate(p Package) (Package, error) {
|
|||||||
return required, err
|
return required, err
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindPackages return the list of the packages beloging to cat/name (any versions)
|
||||||
|
// FIXME: Optimize, see inmemorydb
|
||||||
|
func (db *BoltDatabase) FindPackages(p Package) ([]Package, error) {
|
||||||
|
var versionsInWorld []Package
|
||||||
|
for _, w := range db.World() {
|
||||||
|
if w.GetName() != p.GetName() || w.GetCategory() != p.GetCategory() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := version.NewVersion(w.GetVersion())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
constraints, err := version.NewConstraint(p.GetVersion())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if constraints.Check(v) {
|
||||||
|
versionsInWorld = append(versionsInWorld, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return versionsInWorld, nil
|
||||||
|
}
|
||||||
|
@ -18,28 +18,35 @@ package pkg
|
|||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
version "github.com/hashicorp/go-version"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var DBInMemoryInstance = &InMemoryDatabase{
|
var DBInMemoryInstance = &InMemoryDatabase{
|
||||||
Mutex: &sync.Mutex{},
|
Mutex: &sync.Mutex{},
|
||||||
FileDatabase: map[string][]string{},
|
FileDatabase: map[string][]string{},
|
||||||
Database: map[string]string{}}
|
Database: map[string]string{},
|
||||||
|
CacheNoVersion: map[string]map[string]interface{}{},
|
||||||
|
}
|
||||||
|
|
||||||
type InMemoryDatabase struct {
|
type InMemoryDatabase struct {
|
||||||
*sync.Mutex
|
*sync.Mutex
|
||||||
Database map[string]string
|
Database map[string]string
|
||||||
FileDatabase map[string][]string
|
FileDatabase map[string][]string
|
||||||
|
CacheNoVersion map[string]map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewInMemoryDatabase(singleton bool) PackageDatabase {
|
func NewInMemoryDatabase(singleton bool) PackageDatabase {
|
||||||
// In memoryDB is a singleton
|
// In memoryDB is a singleton
|
||||||
if !singleton {
|
if !singleton {
|
||||||
return &InMemoryDatabase{
|
return &InMemoryDatabase{
|
||||||
Mutex: &sync.Mutex{},
|
Mutex: &sync.Mutex{},
|
||||||
FileDatabase: map[string][]string{},
|
FileDatabase: map[string][]string{},
|
||||||
Database: map[string]string{}}
|
Database: map[string]string{},
|
||||||
|
CacheNoVersion: map[string]map[string]interface{}{},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return DBInMemoryInstance
|
return DBInMemoryInstance
|
||||||
}
|
}
|
||||||
@ -131,6 +138,16 @@ func (db *InMemoryDatabase) CreatePackage(p Package) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create extra cache between package -> []versions
|
||||||
|
db.Lock()
|
||||||
|
defer db.Unlock()
|
||||||
|
_, ok = db.CacheNoVersion[p.GetPackageName()]
|
||||||
|
if !ok {
|
||||||
|
db.CacheNoVersion[p.GetPackageName()] = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
db.CacheNoVersion[p.GetPackageName()][p.GetVersion()] = nil
|
||||||
|
|
||||||
return ID, nil
|
return ID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,6 +170,33 @@ func (db *InMemoryDatabase) FindPackage(p Package) (Package, error) {
|
|||||||
return db.GetPackage(p.GetFingerPrint())
|
return db.GetPackage(p.GetFingerPrint())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindPackages return the list of the packages beloging to cat/name (any versions)
|
||||||
|
func (db *InMemoryDatabase) FindPackages(p Package) ([]Package, error) {
|
||||||
|
versions, ok := db.CacheNoVersion[p.GetPackageName()]
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.New("No versions found for package")
|
||||||
|
}
|
||||||
|
var versionsInWorld []Package
|
||||||
|
for ve, _ := range versions {
|
||||||
|
v, err := version.NewVersion(ve)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
constraints, err := version.NewConstraint(p.GetVersion())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if constraints.Check(v) {
|
||||||
|
w, err := db.FindPackage(&DefaultPackage{Name: p.GetName(), Category: p.GetCategory(), Version: ve})
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "Cache mismatch - this shouldn't happen")
|
||||||
|
}
|
||||||
|
versionsInWorld = append(versionsInWorld, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return versionsInWorld, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (db *InMemoryDatabase) UpdatePackage(p Package) error {
|
func (db *InMemoryDatabase) UpdatePackage(p Package) error {
|
||||||
|
|
||||||
_, enc, err := db.encodePackage(p)
|
_, enc, err := db.encodePackage(p)
|
||||||
|
Loading…
Reference in New Issue
Block a user