From: Michael Tremer Date: Thu, 24 Jun 2021 20:15:16 +0000 (+0000) Subject: request: Refactor creating solver X-Git-Tag: 0.9.28~1182 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df9739f255d182f61b2c662a90ddabf9b3a1eab8;p=pakfire.git request: Refactor creating solver The solver will now be created immediately Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index 2edf06c87..102342863 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -56,8 +56,47 @@ struct pakfire_request { int flags; }; + +static void pakfire_request_free(struct pakfire_request* request) { + if (request->transaction) + transaction_free(request->transaction); + if (request->solver) + solver_free(request->solver); + queue_free(&request->jobs); + + pakfire_unref(request->pakfire); + free(request); +} + +static int setup_solver(struct pakfire_request* request, int flags) { + if (flags & PAKFIRE_SOLVER_ALLOW_DOWNGRADE) + solver_set_flag(request->solver, SOLVER_FLAG_ALLOW_DOWNGRADE, 1); + + if (flags & PAKFIRE_SOLVER_ALLOW_UNINSTALL) + solver_set_flag(request->solver, SOLVER_FLAG_ALLOW_UNINSTALL, 1); + + if (flags & PAKFIRE_SOLVER_ALLOW_VENDORCHANGE) + solver_set_flag(request->solver, SOLVER_FLAG_ALLOW_VENDORCHANGE, 1); + + if (flags & PAKFIRE_SOLVER_WITHOUT_RECOMMENDS) + solver_set_flag(request->solver, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); + + /* no arch change for forcebest */ + solver_set_flag(request->solver, SOLVER_FLAG_BEST_OBEY_POLICY, 1); + + return 0; +} + PAKFIRE_EXPORT int pakfire_request_create(struct pakfire_request** request, Pakfire pakfire, int flags) { + Pool* pool = pakfire_get_solv_pool(pakfire); + int r = 1; + + // Cannot create a solver when no installed repository has been set + if (!pool->installed) + return -EINVAL; + + // Allocate request struct pakfire_request* req = calloc(1, sizeof(*req)); if (!req) return ENOMEM; @@ -65,25 +104,31 @@ PAKFIRE_EXPORT int pakfire_request_create(struct pakfire_request** request, req->pakfire = pakfire_ref(pakfire); req->nrefs = 1; + // Allocate a job queue queue_init(&req->jobs); + // Allocate solver + req->solver = solver_create(pool); + if (!req->solver) { + ERROR(pakfire, "Could not allocate solver: %m\n"); + goto ERROR; + } + + // Set up solver + r = setup_solver(req, flags); + if (r) + goto ERROR; + // Always solve for the best solution? if (flags & PAKFIRE_SOLVER_FORCE_BEST) req->flags |= SOLVER_FORCEBEST; *request = req; return 0; -} - -static void pakfire_request_free(struct pakfire_request* request) { - if (request->transaction) - transaction_free(request->transaction); - if (request->solver) - solver_free(request->solver); - queue_free(&request->jobs); - pakfire_unref(request->pakfire); - free(request); +ERROR: + pakfire_request_free(req); + return r; } PAKFIRE_EXPORT struct pakfire_request* pakfire_request_ref(struct pakfire_request* request) { @@ -108,43 +153,6 @@ Solver* pakfire_request_get_solver(struct pakfire_request* request) { return request->solver; } -static int init_solver(struct pakfire_request* request, int flags) { - Pool* p = pakfire_get_solv_pool(request->pakfire); - - if (!p->installed) - return -EINVAL; - - Solver* solver = solver_create(p); - - /* Free older solver */ - if (request->solver) { - solver_free(request->solver); - request->solver = NULL; - } - - request->solver = solver; - - if (flags & PAKFIRE_SOLVER_ALLOW_ARCHCHANGE) - solver_set_flag(solver, SOLVER_FLAG_ALLOW_ARCHCHANGE, 1); - - if (flags & PAKFIRE_SOLVER_ALLOW_DOWNGRADE) - solver_set_flag(solver, SOLVER_FLAG_ALLOW_DOWNGRADE, 1); - - if (flags & PAKFIRE_SOLVER_ALLOW_UNINSTALL) - solver_set_flag(solver, SOLVER_FLAG_ALLOW_UNINSTALL, 1); - - if (flags & PAKFIRE_SOLVER_ALLOW_VENDORCHANGE) - solver_set_flag(solver, SOLVER_FLAG_ALLOW_VENDORCHANGE, 1); - - if (flags & PAKFIRE_SOLVER_WITHOUT_RECOMMENDS) - solver_set_flag(solver, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); - - /* no arch change for forcebest */ - solver_set_flag(solver, SOLVER_FLAG_BEST_OBEY_POLICY, 1); - - return 0; -} - static int solve(struct pakfire_request* request, Queue* queue) { /* Remove any previous transactions */ if (request->transaction) { @@ -193,12 +201,6 @@ static int solve(struct pakfire_request* request, Queue* queue) { } PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request, int flags) { - int r = init_solver(request, flags); - if (r) { - ERROR(request->pakfire, "Could not initialize the solver: %m\n"); - return r; - } - return solve(request, &request->jobs); }