]> git.ipfire.org Git - pakfire.git/commitdiff
request: Return any problems
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Jun 2021 21:39:07 +0000 (21:39 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Jun 2021 21:39:07 +0000 (21:39 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/problem.h
src/libpakfire/include/pakfire/request.h
src/libpakfire/pakfire.c
src/libpakfire/request.c

index 2561c90de43c058b34e4920e8412e243e18981c1..b6028434874953b2323b24080fbb99b69dbb8e71 100644 (file)
@@ -26,6 +26,7 @@
 #include <pakfire/request.h>
 
 struct pakfire_problem;
+struct pakfire_request;
 
 int pakfire_problem_create(struct pakfire_problem** problem, struct pakfire_request* request, Id id);
 struct pakfire_problem* pakfire_problem_ref(struct pakfire_problem* problem);
index 47dd65e689cb1833ac07af9e72f750d4ed0056b8..496b258fbc47494a0f8bdfd87cca1a3be201c65a 100644 (file)
@@ -25,6 +25,7 @@
 #include <pakfire/transaction.h>
 #include <pakfire/types.h>
 
+struct pakfire_problem;
 struct pakfire_request;
 
 enum pakfire_request_flags {
@@ -46,8 +47,7 @@ struct pakfire_request* pakfire_request_ref(struct pakfire_request* request);
 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);
index 00dd72ef8cbf0012835ef3db107429364493a58c..6fe53b55107eea46bd8bc22b60ecdb09aa67414d 100644 (file)
@@ -1612,6 +1612,7 @@ static int pakfire_perform_transaction(Pakfire pakfire,
                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
@@ -1651,7 +1652,7 @@ static int pakfire_perform_transaction(Pakfire pakfire,
        }
 
        // Solve the request
-       r = pakfire_request_solve(request, &transaction);
+       r = pakfire_request_solve(request, &transaction, &problems);
        if (r)
                goto ERROR;
 
@@ -1668,6 +1669,11 @@ static int pakfire_perform_transaction(Pakfire pakfire,
        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)
@@ -1699,6 +1705,7 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire,
                int flags, int* changed) {
        struct pakfire_request* request = NULL;
        struct pakfire_transaction* transaction = NULL;
+       struct pakfire_problem** problems = NULL;
        int r = 1;
 
        // Refresh repositories
@@ -1717,7 +1724,7 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire,
                goto ERROR;
 
        // Solve the request
-       r = pakfire_request_solve(request, &transaction);
+       r = pakfire_request_solve(request, &transaction, &problems);
        if (r)
                goto ERROR;
 
@@ -1734,6 +1741,11 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire,
        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)
index db9ad6bf0e20e2608b182e8b4404875a838433bd..0e8169e2fdc307a3c9fabbab2671f77e937367fd 100644 (file)
@@ -141,12 +141,55 @@ Solver* pakfire_request_get_solver(struct pakfire_request* 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);
@@ -165,7 +208,12 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request,
                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
@@ -179,7 +227,7 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request,
 #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;
 
@@ -193,23 +241,6 @@ 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");
 }