#ifndef PAKFIRE_REQUEST_H
#define PAKFIRE_REQUEST_H
+#include <pakfire/transaction.h>
#include <pakfire/types.h>
struct pakfire_request;
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);
#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
}
// 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);
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);
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);
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);
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) {
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");
}
int nrefs;
Transaction* transaction;
- const char** userinstalled;
+ char** userinstalled;
PakfireArchive* archives;
PakfirePackage* 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);
}
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;
}
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;
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;
// 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;
ERROR:
pakfire_transaction_free(t);
-
return 1;
}
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;
}