]> git.ipfire.org Git - pakfire.git/commitdiff
request: Return transaction when solving
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Jun 2021 20:55:23 +0000 (20:55 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 24 Jun 2021 20:55:23 +0000 (20:55 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/request.h
src/libpakfire/include/pakfire/transaction.h
src/libpakfire/pakfire.c
src/libpakfire/request.c
src/libpakfire/transaction.c

index a94356655ea2e23ae557e8796e8cdfa5e04e3c1b..cfafd219da94c267aa4ee18ac73af2010cc053bd 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef PAKFIRE_REQUEST_H
 #define PAKFIRE_REQUEST_H
 
+#include <pakfire/transaction.h>
 #include <pakfire/types.h>
 
 struct pakfire_request;
@@ -43,9 +44,9 @@ int pakfire_request_create(struct pakfire_request** request, Pakfire pakfire, in
 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);
+int pakfire_request_solve(struct pakfire_request* request,
+       struct pakfire_transaction** transaction);
 PakfireProblem pakfire_request_get_problems(struct pakfire_request* request);
-struct pakfire_transaction* pakfire_request_get_transaction(struct pakfire_request* request);
 
 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 da98ce23cfb969d587381d87626088a1cca62c71..d422848e98345bb9ba4d88de7c86fc97ce362993 100644 (file)
@@ -35,13 +35,12 @@ int pakfire_transaction_download(struct pakfire_transaction* transaction);
 
 #ifdef PAKFIRE_PRIVATE
 
-#include <solv/queue.h>
-#include <solv/transaction.h>
+#include <solv/solver.h>
 
 #include <pakfire/types.h>
 
-int pakfire_transaction_create(struct pakfire_transaction** transaction, Pakfire pakfire,
-       Transaction* trans, Queue* userinstalled);
+int pakfire_transaction_create(struct pakfire_transaction** transaction,
+       Pakfire pakfire, Solver* solver);
 
 #endif
 
index d0eddfbcd83a6b7bdd49b8e745bf57c3e8c23485..00dd72ef8cbf0012835ef3db107429364493a58c 100644 (file)
@@ -1651,15 +1651,10 @@ static int pakfire_perform_transaction(Pakfire pakfire,
        }
 
        // Solve the request
-       r = pakfire_request_solve(request, 0);
+       r = pakfire_request_solve(request, &transaction);
        if (r)
                goto ERROR;
 
-       // Fetch the transaction
-       transaction = pakfire_request_get_transaction(request);
-       if (!transaction)
-               goto ERROR;
-
        // Set how many packages have been changed
        if (changed)
                *changed = pakfire_transaction_count(transaction);
@@ -1722,15 +1717,10 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire,
                goto ERROR;
 
        // Solve the request
-       r = pakfire_request_solve(request, 0);
+       r = pakfire_request_solve(request, &transaction);
        if (r)
                goto ERROR;
 
-       // Fetch the transaction
-       transaction = pakfire_request_get_transaction(request);
-       if (!transaction)
-               goto ERROR;
-
        // Set how many packages have been changed
        if (changed)
                *changed = pakfire_transaction_count(transaction);
index e8e92693a97c3bc9d818e0abecba4607ea85e56f..fafda7e37920067a20b32585a177c969e4731c3e 100644 (file)
@@ -48,15 +48,10 @@ struct pakfire_request {
        int nrefs;
 
        Solver* solver;
-       Transaction* transaction;
-
        Queue jobs;
 };
 
-
 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);
@@ -146,15 +141,13 @@ Solver* pakfire_request_get_solver(struct pakfire_request* request) {
        return request->solver;
 }
 
-PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request) {
-       /* Remove any previous transactions */
-       if (request->transaction) {
-               transaction_free(request->transaction);
-               request->transaction = NULL;
-       }
-
+PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request,
+               struct pakfire_transaction** transaction) {
        pakfire_pool_apply_changes(request->pakfire);
 
+       // Reset pointer
+       *transaction = NULL;
+
 #ifdef ENABLE_DEBUG
        Pool* pool = pakfire_get_solv_pool(request->pakfire);
 
@@ -185,12 +178,19 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request) {
        solver_printdecisions(request->solver);
 #endif
 
-       /* If the solving process was successful, we get the transaction
-        * from the solver. */
-       request->transaction = solver_create_transaction(request->solver);
-       transaction_order(request->transaction, 0);
+       // If the solving process was successful, we create the transaction
+       int r = pakfire_transaction_create(transaction, request->pakfire, request->solver);
+       if (r)
+               goto ERROR;
 
+       // All okay
        return 0;
+
+ERROR:
+       if (*transaction)
+               pakfire_transaction_unref(*transaction);
+
+       return r;
 }
 
 PAKFIRE_EXPORT PakfireProblem pakfire_request_get_problems(struct pakfire_request* request) {
@@ -209,33 +209,6 @@ PAKFIRE_EXPORT PakfireProblem pakfire_request_get_problems(struct pakfire_reques
        return ret;
 }
 
-PAKFIRE_EXPORT struct pakfire_transaction* pakfire_request_get_transaction(struct pakfire_request* request) {
-       struct pakfire_transaction* transaction;
-       Queue userinstalled;
-
-       // Return nothing if no transaction was created
-       if (!request->transaction)
-               return NULL;
-
-       queue_init(&userinstalled);
-
-       // Fetch a list of all packages that are installed by the user
-       solver_get_userinstalled(request->solver, &userinstalled, GET_USERINSTALLED_NAMES);
-
-       // Create a new transaction
-       int r = pakfire_transaction_create(&transaction, request->pakfire,
-               request->transaction, &userinstalled);
-       if (r) {
-               transaction = NULL;
-               goto ERROR;
-       }
-
-ERROR:
-       queue_free(&userinstalled);
-
-       return transaction;
-}
-
 static int pakfire_request_is_file(const char* what) {
        return pakfire_string_endswith(what, ".pfm");
 }
index ede695d2d868b559deb70725805472d5baea807e..83fe079c173493ee4e2e3ed0f235afcd6ecdbc42 100644 (file)
@@ -45,7 +45,7 @@ struct pakfire_transaction {
        int nrefs;
 
        Transaction* transaction;
-       const char** userinstalled;
+       char** userinstalled;
 
        PakfireArchive* archives;
        PakfirePackage* packages;
@@ -112,8 +112,11 @@ static void pakfire_transaction_free_archives_and_packages(
 static void pakfire_transaction_free(struct pakfire_transaction* transaction) {
        pakfire_transaction_free_archives_and_packages(transaction);
 
-       if (transaction->userinstalled)
+       if (transaction->userinstalled) {
+               for (char** userinstalled = transaction->userinstalled; *userinstalled; userinstalled++)
+                       free(*userinstalled);
                free(transaction->userinstalled);
+       }
        transaction_free(transaction->transaction);
 
        pakfire_unref(transaction->pakfire);
@@ -121,13 +124,20 @@ static void pakfire_transaction_free(struct pakfire_transaction* transaction) {
 }
 
 static int pakfire_transaction_import_transaction(
-               struct pakfire_transaction* transaction, Transaction* t) {
-       // Free any previous content
-       pakfire_transaction_free_archives_and_packages(transaction);
+               struct pakfire_transaction* transaction, Solver* solver) {
+       // Clone the transaction to keep a copy of it
+       Transaction* t = solver_create_transaction(solver);
+       if (!t)
+               return 1;
+
+       transaction->transaction = t;
 
        // Order the transaction
        transaction_order(t, 0);
 
+       // Free any previous content
+       pakfire_transaction_free_archives_and_packages(transaction);
+
        // How many steps?
        transaction->num = t->steps.count;
 
@@ -151,17 +161,23 @@ static int pakfire_transaction_import_transaction(
 }
 
 static int pakfire_transaction_import_userinstalled(
-               struct pakfire_transaction* t, Queue* userinstalled) {
+               struct pakfire_transaction* t, Solver* solver) {
        if (t->userinstalled) {
                free(t->userinstalled);
                t->userinstalled = NULL;
        }
 
+       Queue userinstalled;
+       queue_init(&userinstalled);
+
+       // Fetch a list of all packages that are installed by the user
+       solver_get_userinstalled(solver, &userinstalled, GET_USERINSTALLED_NAMES);
+
        // Skip everything if the queue is empty
-       if (!userinstalled || !userinstalled->count)
+       if (!userinstalled.count)
                return 0;
 
-       t->userinstalled = calloc(userinstalled->count, sizeof(*t->userinstalled));
+       t->userinstalled = calloc(userinstalled.count + 1, sizeof(*t->userinstalled));
        if (!t->userinstalled) {
                ERROR(t->pakfire, "Could not allocate userinstalled\n");
                return 1;
@@ -170,14 +186,16 @@ static int pakfire_transaction_import_userinstalled(
        Pool* pool = pakfire_get_solv_pool(t->pakfire);
 
        // Store the names of all userinstalled packages
-       for (int i = 0; i < userinstalled->count; i++)
-               t->userinstalled[i] = pool_id2str(pool, userinstalled->elements[i]);
+       for (int i = 0; i < userinstalled.count; i++) {
+               const char* package = pool_id2str(pool, userinstalled.elements[i]);
+               t->userinstalled[i] = strdup(package);
+       }
 
        return 0;
 }
 
 int pakfire_transaction_create(struct pakfire_transaction** transaction,
-               Pakfire pakfire, Transaction* trans, Queue* userinstalled) {
+               Pakfire pakfire, Solver* solver) {
        struct pakfire_transaction* t = calloc(1, sizeof(*t));
        if (!t)
                return ENOMEM;
@@ -188,18 +206,13 @@ int pakfire_transaction_create(struct pakfire_transaction** transaction,
        // Initialize the reference counter
        t->nrefs = 1;
 
-       // Clone the transaction to keep a copy of it
-       t->transaction = transaction_create_clone(trans);
-       if (!t->transaction)
-               goto ERROR;
-
        // Import transaction
-       int r = pakfire_transaction_import_transaction(t, t->transaction);
+       int r = pakfire_transaction_import_transaction(t, solver);
        if (r)
                goto ERROR;
 
        // Import userinstalled
-       r = pakfire_transaction_import_userinstalled(t, userinstalled);
+       r = pakfire_transaction_import_userinstalled(t, solver);
        if (r)
                goto ERROR;
 
@@ -208,7 +221,6 @@ int pakfire_transaction_create(struct pakfire_transaction** transaction,
 
 ERROR:
        pakfire_transaction_free(t);
-
        return 1;
 }
 
@@ -605,7 +617,7 @@ static int pakfire_transaction_package_is_userinstalled(
        const char* name = pakfire_package_get_name(pkg);
 
        // Check if the package is on the list
-       for (const char** elem = transaction->userinstalled; *elem; elem++) {
+       for (char** elem = transaction->userinstalled; *elem; elem++) {
                if (strcmp(name, *elem) == 0)
                        return 1;
        }