BSolver/LibsolvSolver: Add FindPackages()

Given a search string it finds all matching packages.
This commit is contained in:
Ingo Weinhold
2013-04-11 17:30:08 +02:00
parent a78a2540a8
commit fc57db481f
3 changed files with 93 additions and 0 deletions
+14
View File
@@ -6,12 +6,14 @@
#define _PACKAGE__SOLVER_H_
#include <ObjectList.h>
#include <SupportDefs.h>
namespace BPackageKit {
class BSolverPackage;
class BSolverPackageSpecifierList;
class BSolverProblem;
class BSolverRepository;
@@ -19,6 +21,14 @@ class BSolverResult;
class BSolver {
public:
// FindPackages() flags
enum {
B_FIND_CASE_INSENSITIVE = 0x01,
B_FIND_IN_SUMMARY = 0x02,
B_FIND_IN_DESCRIPTION = 0x04
};
public:
virtual ~BSolver();
@@ -29,6 +39,10 @@ public:
virtual status_t AddRepository(
BSolverRepository* repository) = 0;
virtual status_t FindPackages(const char* searchString,
uint32 flags,
BObjectList<BSolverPackage>& _packages) = 0;
virtual status_t Install(
const BSolverPackageSpecifierList&
packages) = 0;
+74
View File
@@ -57,6 +57,20 @@ struct LibsolvSolver::SolvQueue : Queue {
};
struct LibsolvSolver::SolvDataIterator : Dataiterator {
SolvDataIterator(Pool* pool, Repo* repo, Id solvableId, Id keyname,
const char* match, int flags)
{
dataiterator_init(this, pool, repo, solvableId, keyname, match, flags);
}
~SolvDataIterator()
{
dataiterator_free(this);
}
};
struct LibsolvSolver::RepositoryInfo {
RepositoryInfo(BSolverRepository* repository)
:
@@ -197,6 +211,66 @@ LibsolvSolver::AddRepository(BSolverRepository* repository)
}
status_t
LibsolvSolver::FindPackages(const char* searchString, uint32 flags,
BObjectList<BSolverPackage>& _packages)
{
// add repositories to pool
status_t error = _AddRepositories();
if (error != B_OK)
return error;
// create data iterator
int iteratorFlags = SEARCH_SUBSTRING;
if ((flags & B_FIND_CASE_INSENSITIVE) != 0)
iteratorFlags |= SEARCH_NOCASE;
SolvDataIterator iterator(fPool, 0, 0, 0, searchString, iteratorFlags);
// search package names
dataiterator_set_keyname(&iterator, SOLVABLE_NAME);
dataiterator_set_search(&iterator, 0, 0);
SolvQueue selection;
while (dataiterator_step(&iterator))
queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid);
// search package summaries
if ((flags & B_FIND_IN_SUMMARY) != 0) {
dataiterator_set_keyname(&iterator, SOLVABLE_SUMMARY);
dataiterator_set_search(&iterator, 0, 0);
while (dataiterator_step(&iterator))
queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid);
}
// search package description
if ((flags & B_FIND_IN_DESCRIPTION) != 0) {
dataiterator_set_keyname(&iterator, SOLVABLE_DESCRIPTION);
dataiterator_set_search(&iterator, 0, 0);
while (dataiterator_step(&iterator))
queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid);
}
// get solvables
SolvQueue solvables;
selection_solvables(fPool, &selection, &solvables);
// get packages
for (int i = 0; i < solvables.count; i++) {
BSolverPackage* package = _GetPackage(solvables.elements[i]);
if (package == NULL)
return B_ERROR;
if (!_packages.AddItem(package))
return B_NO_MEMORY;
}
return B_OK;
}
status_t
LibsolvSolver::Install(const BSolverPackageSpecifierList& packages)
{
+5
View File
@@ -34,6 +34,10 @@ public:
virtual status_t AddRepository(BSolverRepository* repository);
virtual status_t FindPackages(const char* searchString,
uint32 flags,
BObjectList<BSolverPackage>& _packages);
virtual status_t Install(
const BSolverPackageSpecifierList&
packages);
@@ -46,6 +50,7 @@ public:
private:
struct SolvQueue;
struct SolvDataIterator;
struct RepositoryInfo;
struct Problem;
struct Solution;