]> git.ipfire.org Git - pakfire.git/commitdiff
request: Refactor creating solver
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Jun 2021 20:15:16 +0000 (20:15 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Jun 2021 20:15:16 +0000 (20:15 +0000)
The solver will now be created immediately

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/request.c

index 2edf06c870671333ac29ec8d8d2860d51fb37441..1023428635bedea85d5027dc95cc5a47c809ccd3 100644 (file)
@@ -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);
 }