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;
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) {
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) {
}
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);
}