#include <pakfire/types.h>
PakfireTransaction pakfire_transaction_create(PakfirePool pool, Transaction* trans);
-void pakfire_transaction_free(PakfireTransaction transaction);
+PakfireTransaction pakfire_transaction_ref(PakfireTransaction transaction);
+PakfireTransaction pakfire_transaction_unref(PakfireTransaction transaction);
+PakfirePool pakfire_transaction_get_pool(PakfireTransaction transaction);
size_t pakfire_transaction_count(PakfireTransaction transaction);
ssize_t pakfire_transaction_installsizechange(PakfireTransaction transaction);
PAKFIRE_ACTION_POSTTRANS = 1 << 3,
} pakfire_action_type;
-struct _PakfireTransaction {
- PakfirePool pool;
- Transaction* transaction;
-};
-
-static inline PakfirePool pakfire_transaction_pool(PakfireTransaction transaction) {
- return transaction->pool;
-}
+Transaction* pakfire_transaction_get_transaction(PakfireTransaction transaction);
#endif
#include <pakfire/cache.h>
#include <pakfire/constants.h>
#include <pakfire/package.h>
+#include <pakfire/pool.h>
#include <pakfire/private.h>
#include <pakfire/repo.h>
#include <pakfire/step.h>
PAKFIRE_EXPORT PakfireStep pakfire_step_create(PakfireTransaction transaction, Id id) {
PakfireStep step = pakfire_calloc(1, sizeof(*step));
- step->pool = pakfire_transaction_pool(transaction);
+ step->pool = pakfire_transaction_get_pool(transaction);
step->transaction = transaction;
step->id = id;
}
PAKFIRE_EXPORT void pakfire_step_free(PakfireStep step) {
+ pakfire_pool_unref(step->pool);
pakfire_free(step);
}
}
PAKFIRE_EXPORT pakfire_step_type pakfire_step_get_type(PakfireStep step) {
- Transaction* trans = step->transaction->transaction;
+ Transaction* trans = pakfire_transaction_get_transaction(step->transaction);
int type = transaction_type(trans, step->id,
SOLVER_TRANSACTION_SHOW_ACTIVE|SOLVER_TRANSACTION_CHANGE_IS_REINSTALL);
#include <solv/transaction.h>
#include <pakfire/i18n.h>
+#include <pakfire/logging.h>
#include <pakfire/package.h>
#include <pakfire/packagelist.h>
+#include <pakfire/pool.h>
#include <pakfire/private.h>
#include <pakfire/repo.h>
#include <pakfire/step.h>
#include <pakfire/types.h>
#include <pakfire/util.h>
+struct _PakfireTransaction {
+ PakfirePool pool;
+ Transaction* transaction;
+
+ int nrefs;
+};
+
PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_create(PakfirePool pool, Transaction* trans) {
PakfireTransaction transaction = pakfire_calloc(1, sizeof(*transaction));
- transaction->pool = pool;
+ if (!transaction)
+ return NULL;
+
+ transaction->pool = pakfire_pool_ref(pool);
+ transaction->nrefs = 1;
// Clone the transaction, so we get independent from what ever called this.
if (trans) {
return transaction;
}
-PAKFIRE_EXPORT void pakfire_transaction_free(PakfireTransaction transaction) {
+PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_ref(PakfireTransaction transaction) {
+ if (!transaction)
+ return NULL;
+
+ transaction->nrefs++;
+ return transaction;
+}
+
+void pakfire_transaction_free(PakfireTransaction transaction) {
+ pakfire_pool_unref(transaction->pool);
+
transaction_free(transaction->transaction);
pakfire_free(transaction);
}
+PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_unref(PakfireTransaction transaction) {
+ if (!transaction)
+ return NULL;
+
+ if (--transaction->nrefs > 0)
+ return transaction;
+
+ pakfire_transaction_free(transaction);
+ return NULL;
+}
+
+PAKFIRE_EXPORT PakfirePool pakfire_transaction_get_pool(PakfireTransaction transaction) {
+ return pakfire_pool_ref(transaction->pool);
+}
+
+Transaction* pakfire_transaction_get_transaction(PakfireTransaction transaction) {
+ return transaction->transaction;
+}
+
PAKFIRE_EXPORT size_t pakfire_transaction_count(PakfireTransaction transaction) {
return transaction->transaction->steps.count;
}
}
PAKFIRE_EXPORT ssize_t pakfire_transaction_downloadsize(PakfireTransaction transaction) {
- PakfirePool pool = pakfire_transaction_pool(transaction);
ssize_t size = 0;
for (int i = 0; i < transaction->transaction->steps.count; i++) {
continue;
// Get the package for this step
- PakfirePackage pkg = pakfire_package_create(pool, p);
+ PakfirePackage pkg = pakfire_package_create(transaction->pool, p);
if (!pakfire_package_is_cached(pkg))
size += pakfire_package_get_downloadsize(pkg);
}
PAKFIRE_EXPORT PakfirePackageList pakfire_transaction_get_packages(PakfireTransaction transaction, int type) {
- PakfirePool pool = pakfire_transaction_pool(transaction);
-
PakfirePackageList packagelist = pakfire_packagelist_create();
for (int i = 0; i < transaction->transaction->steps.count; i++) {
SOLVER_TRANSACTION_SHOW_ACTIVE);
if (t == type) {
- PakfirePackage package = pakfire_package_create(pool, p);
+ PakfirePackage package = pakfire_package_create(transaction->pool, p);
pakfire_packagelist_push(packagelist, package);
}
}
if (l > 0 && string[l] == '\n')
string[l] = '\0';
+ DEBUG("Transaction: %s\n", string);
+
return string;
}