From 8d9fed2ad02942ddd3ad8e06146e2cfaa537c313 Mon Sep 17 00:00:00 2001 From: jguer Date: Sun, 15 Nov 2020 17:39:15 +0100 Subject: [PATCH] fix(query): fix remote package slow filtering --- pkg/db/executor.go | 1 + pkg/db/ialpm/alpm.go | 26 ++++++++++++++++++++++---- pkg/query/filter.go | 23 +++++++++-------------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/pkg/db/executor.go b/pkg/db/executor.go index 74d69fc4..0ce034ea 100644 --- a/pkg/db/executor.go +++ b/pkg/db/executor.go @@ -26,6 +26,7 @@ type Executor interface { PackagesFromGroup(string) []alpm.IPackage RefreshHandle() error RepoUpgrades(bool) (upgrade.UpSlice, error) + SyncPackage(string) alpm.IPackage SyncPackages(...string) []alpm.IPackage SyncSatisfier(string) alpm.IPackage SyncSatisfierExists(string) bool diff --git a/pkg/db/ialpm/alpm.go b/pkg/db/ialpm/alpm.go index 01a4d9e0..44f6430e 100644 --- a/pkg/db/ialpm/alpm.go +++ b/pkg/db/ialpm/alpm.go @@ -18,10 +18,11 @@ import ( ) type AlpmExecutor struct { - handle *alpm.Handle - localDB alpm.IDB - syncDB alpm.IDBList - conf *pacmanconf.Config + handle *alpm.Handle + localDB alpm.IDB + syncDB alpm.IDBList + syncDBsCache []alpm.IDB + conf *pacmanconf.Config } func NewExecutor(pacmanConf *pacmanconf.Config) (*AlpmExecutor, error) { @@ -255,6 +256,7 @@ func (ae *AlpmExecutor) RefreshHandle() error { alpmHandle.SetQuestionCallback(ae.questionCallback()) alpmHandle.SetLogCallback(logCallback) ae.handle = alpmHandle + ae.syncDBsCache = nil ae.syncDB, err = alpmHandle.SyncDBs() if err != nil { return err @@ -341,6 +343,22 @@ func (ae *AlpmExecutor) LocalPackage(pkgName string) alpm.IPackage { return pkg } +func (ae *AlpmExecutor) syncDBs() []alpm.IDB { + if ae.syncDBsCache == nil { + ae.syncDBsCache = ae.syncDB.Slice() + } + return ae.syncDBsCache +} + +func (ae *AlpmExecutor) SyncPackage(pkgName string) alpm.IPackage { + for _, db := range ae.syncDBs() { + if dbPkg := db.Pkg(pkgName); dbPkg != nil { + return dbPkg + } + } + return nil +} + func (ae *AlpmExecutor) SatisfierFromDB(pkgName, dbName string) alpm.IPackage { singleDB, err := ae.handle.SyncDBByName(dbName) if err != nil { diff --git a/pkg/query/filter.go b/pkg/query/filter.go index e266d8cc..8225ee95 100644 --- a/pkg/query/filter.go +++ b/pkg/query/filter.go @@ -12,15 +12,13 @@ import ( // GetPackageNamesBySource returns package names with and without correspondence in SyncDBS respectively func GetPackageNamesBySource(dbExecutor db.Executor) (local, remote []string, err error) { -outer: for _, localpkg := range dbExecutor.LocalPackages() { - for _, syncpkg := range dbExecutor.SyncPackages() { - if localpkg.Name() == syncpkg.Name() { - local = append(local, localpkg.Name()) - continue outer - } + pkgName := localpkg.Name() + if dbExecutor.SyncPackage(pkgName) != nil { + local = append(local, pkgName) + } else { + remote = append(remote, pkgName) } - remote = append(remote, localpkg.Name()) } return local, remote, err } @@ -29,15 +27,12 @@ outer: func GetRemotePackages(dbExecutor db.Executor) ( remote []alpm.IPackage, remoteNames []string) { -outer: for _, localpkg := range dbExecutor.LocalPackages() { - for _, syncpkg := range dbExecutor.SyncPackages() { - if localpkg.Name() == syncpkg.Name() { - continue outer - } + pkgName := localpkg.Name() + if dbExecutor.SyncPackage(pkgName) == nil { + remote = append(remote, localpkg) + remoteNames = append(remoteNames, pkgName) } - remote = append(remote, localpkg) - remoteNames = append(remoteNames, localpkg.Name()) } return remote, remoteNames }