From: Michael Tremer Date: Thu, 24 Jun 2021 20:55:23 +0000 (+0000) Subject: request: Return transaction when solving X-Git-Tag: 0.9.28~1178 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41ebf5f0d50e42f313bbdd134d2b771fee1bdaef;p=pakfire.git request: Return transaction when solving Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/request.h b/src/libpakfire/include/pakfire/request.h index a94356655..cfafd219d 100644 --- a/src/libpakfire/include/pakfire/request.h +++ b/src/libpakfire/include/pakfire/request.h @@ -21,6 +21,7 @@ #ifndef PAKFIRE_REQUEST_H #define PAKFIRE_REQUEST_H +#include #include 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); diff --git a/src/libpakfire/include/pakfire/transaction.h b/src/libpakfire/include/pakfire/transaction.h index da98ce23c..d422848e9 100644 --- a/src/libpakfire/include/pakfire/transaction.h +++ b/src/libpakfire/include/pakfire/transaction.h @@ -35,13 +35,12 @@ int pakfire_transaction_download(struct pakfire_transaction* transaction); #ifdef PAKFIRE_PRIVATE -#include -#include +#include #include -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 diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index d0eddfbcd..00dd72ef8 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -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); diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index e8e92693a..fafda7e37 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -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"); } diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index ede695d2d..83fe079c1 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -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; }