#include <pakfire/transaction.h>
#include <pakfire/types.h>
+struct pakfire_problem;
struct pakfire_request;
enum pakfire_request_flags {
struct pakfire_request* pakfire_request_unref(struct pakfire_request* request);
int pakfire_request_solve(struct pakfire_request* request,
- struct pakfire_transaction** transaction);
-struct pakfire_problem* pakfire_request_get_problems(struct pakfire_request* request);
+ struct pakfire_transaction** transaction, struct pakfire_problem*** problems);
int pakfire_request_install(struct pakfire_request* request, const char* what, int flags);
int pakfire_request_install_package(struct pakfire_request* request, PakfirePackage package);
const char** packages, const char** locks, int flags, int* changed) {
struct pakfire_request* request = NULL;
struct pakfire_transaction* transaction = NULL;
+ struct pakfire_problem** problems = NULL;
int r = 1;
// Packages cannot be NULL
}
// Solve the request
- r = pakfire_request_solve(request, &transaction);
+ r = pakfire_request_solve(request, &transaction, &problems);
if (r)
goto ERROR;
r = 0;
ERROR:
+ if (problems) {
+ for (struct pakfire_problem** problem = problems; *problem; problem++)
+ pakfire_problem_unref(*problem);
+ free(problems);
+ }
if (transaction)
pakfire_transaction_unref(transaction);
if (request)
int flags, int* changed) {
struct pakfire_request* request = NULL;
struct pakfire_transaction* transaction = NULL;
+ struct pakfire_problem** problems = NULL;
int r = 1;
// Refresh repositories
goto ERROR;
// Solve the request
- r = pakfire_request_solve(request, &transaction);
+ r = pakfire_request_solve(request, &transaction, &problems);
if (r)
goto ERROR;
r = 0;
ERROR:
+ if (problems) {
+ for (struct pakfire_problem** problem = problems; *problem; problem++)
+ pakfire_problem_unref(*problem);
+ free(problems);
+ }
if (transaction)
pakfire_transaction_unref(transaction);
if (request)
return request->solver;
}
+static int pakfire_request_get_problems(struct pakfire_request* request,
+ struct pakfire_problem*** problems) {
+ struct pakfire_problem* problem;
+
+ unsigned int count = solver_problem_count(request->solver);
+ if (!count)
+ return 0;
+
+ // Allocate array
+ *problems = calloc(count + 1, sizeof(*problems));
+ if (!*problems)
+ return 1;
+
+ Id p = 0;
+ for (unsigned int i = 0; i < count; i++) {
+ p = solver_next_problem(request->solver, p);
+ if (!p)
+ break;
+
+ // Create problem
+ int r = pakfire_problem_create(&problem, request, p);
+ if (r)
+ goto ERROR;
+
+ // Append to array
+ (*problems)[i] = problem;
+ };
+
+ return 0;
+
+ERROR:
+ if (*problems) {
+ for (struct pakfire_problem** problem = *problems; *problem; problem++)
+ free(*problem);
+ free(*problems);
+ }
+
+ return 1;
+}
+
PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request,
- struct pakfire_transaction** transaction) {
+ struct pakfire_transaction** transaction, struct pakfire_problem*** problems) {
+ int r;
+
pakfire_pool_apply_changes(request->pakfire);
- // Reset pointer
+ // Reset pointers
*transaction = NULL;
+ *problems = NULL;
#ifdef ENABLE_DEBUG
Pool* pool = pakfire_get_solv_pool(request->pakfire);
solver_printallsolutions(request->solver);
#endif
- return 1;
+ // Fetch problems
+ r = pakfire_request_get_problems(request, problems);
+ if (r)
+ return 1;
+
+ return 2;
}
// Save time when we finished solving
#endif
// If the solving process was successful, we create the transaction
- int r = pakfire_transaction_create(transaction, request->pakfire, request->solver);
+ r = pakfire_transaction_create(transaction, request->pakfire, request->solver);
if (r)
goto ERROR;
return r;
}
-PAKFIRE_EXPORT struct pakfire_problem* pakfire_request_get_problems(struct pakfire_request* request) {
- Id problem = 0;
- struct pakfire_problem* ret = NULL;
- struct pakfire_problem* p;
-
- while ((problem = solver_next_problem(request->solver, problem)) != 0) {
- pakfire_problem_create(&p, request, problem);
-
- if (ret)
- pakfire_problem_append(ret, p);
- else
- ret = p;
- }
-
- return ret;
-}
-
static int pakfire_request_is_file(const char* what) {
return pakfire_string_endswith(what, ".pfm");
}