]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Load all steps when initializing the transaction
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 18:12:02 +0000 (19:12 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 18:12:02 +0000 (19:12 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/transaction.h
src/libpakfire/transaction.c

index 25e3be6fd6cb7b1991dbb1249da9412de8662a13..648564dcb823c8e70af189c57cf3f6e8ab80be6a 100644 (file)
@@ -34,7 +34,7 @@ size_t pakfire_transaction_count(PakfireTransaction transaction);
 
 ssize_t pakfire_transaction_installsizechange(PakfireTransaction transaction);
 
-PakfireStep pakfire_transaction_get_step(PakfireTransaction transaction, int index);
+PakfireStep pakfire_transaction_get_step(PakfireTransaction transaction, unsigned int index);
 PakfirePackageList pakfire_transaction_get_packages(PakfireTransaction transaction, pakfire_step_type_t type);
 
 char* pakfire_transaction_dump(PakfireTransaction transaction, size_t width);
index f103b4337d8e2da91a734b020f99b9f9f011c45c..6af7d3204b53122980d2b595320ed46ce15ce517 100644 (file)
@@ -36,7 +36,8 @@
 struct _PakfireTransaction {
        PakfirePool pool;
        Transaction* transaction;
-
+       PakfireStep* steps;
+       size_t num_steps;
        int nrefs;
 };
 
@@ -55,6 +56,14 @@ PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_create(PakfirePool pool, T
                } else {
                        transaction->transaction = transaction_create(trans->pool);
                }
+
+               // Save total number of steps
+               transaction->num_steps = transaction->transaction->steps.count;
+
+               // Import all steps
+               PakfireStep* steps = transaction->steps = pakfire_calloc(transaction->num_steps + 1, sizeof(*steps));
+               for (unsigned int i = 0; i < transaction->num_steps; i++)
+                       *steps++ = pakfire_step_create(transaction, transaction->transaction->steps.elements[i]);
        }
 
        return transaction;
@@ -71,6 +80,10 @@ PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_ref(PakfireTransaction tra
 void pakfire_transaction_free(PakfireTransaction transaction) {
        pakfire_pool_unref(transaction->pool);
 
+       // Release all steps
+       while (*transaction->steps)
+               pakfire_step_unref(*transaction->steps++);
+
        transaction_free(transaction->transaction);
        pakfire_free(transaction);
 
@@ -97,7 +110,7 @@ Transaction* pakfire_transaction_get_transaction(PakfireTransaction transaction)
 }
 
 PAKFIRE_EXPORT size_t pakfire_transaction_count(PakfireTransaction transaction) {
-       return transaction->transaction->steps.count;
+       return transaction->num_steps;
 }
 
 PAKFIRE_EXPORT ssize_t pakfire_transaction_installsizechange(PakfireTransaction transaction) {
@@ -110,32 +123,34 @@ PAKFIRE_EXPORT ssize_t pakfire_transaction_installsizechange(PakfireTransaction
 PAKFIRE_EXPORT ssize_t pakfire_transaction_downloadsize(PakfireTransaction transaction) {
        ssize_t size = 0;
 
-       size_t steps = pakfire_transaction_count(transaction);
-       for (unsigned int i = 0; i < steps; i++) {
-               PakfireStep step = pakfire_transaction_get_step(transaction, i);
-               size += pakfire_step_get_downloadsize(step);
+       PakfireStep* steps = transaction->steps;
+       while (*steps) {
+               PakfireStep step = *steps++;
 
-               pakfire_step_unref(step);
+               size += pakfire_step_get_downloadsize(step);
        }
 
        return size;
 }
 
-PAKFIRE_EXPORT PakfireStep pakfire_transaction_get_step(PakfireTransaction transaction, int index) {
-       Transaction* trans = transaction->transaction;
+PAKFIRE_EXPORT PakfireStep pakfire_transaction_get_step(PakfireTransaction transaction, unsigned int index) {
+       PakfireStep* steps = transaction->steps;
 
-       if (index >= trans->steps.count)
-               return NULL;
+       while (index-- && *steps)
+               steps++;
 
-       return pakfire_step_create(transaction, trans->steps.elements[index]);
+       if (*steps)
+               return pakfire_step_ref(*steps);
+
+       return NULL;
 }
 
 PAKFIRE_EXPORT PakfirePackageList pakfire_transaction_get_packages(PakfireTransaction transaction, pakfire_step_type_t type) {
        PakfirePackageList packagelist = pakfire_packagelist_create();
 
-       size_t steps = pakfire_transaction_count(transaction);
-       for (unsigned int i = 0; i < steps; i++) {
-               PakfireStep step = pakfire_transaction_get_step(transaction, i);
+       PakfireStep* steps = transaction->steps;
+       while (*steps) {
+               PakfireStep step = *steps++;
 
                if (pakfire_step_get_type(step) == type) {
                        PakfirePackage package = pakfire_step_get_package(step);
@@ -143,8 +158,6 @@ PAKFIRE_EXPORT PakfirePackageList pakfire_transaction_get_packages(PakfireTransa
 
                        pakfire_package_unref(package);
                }
-
-               pakfire_step_unref(step);
        }
 
        // Sort list in place
@@ -298,19 +311,16 @@ PAKFIRE_EXPORT char* pakfire_transaction_dump(PakfireTransaction transaction, si
 }
 
 static int pakfire_transaction_run_steps(PakfireTransaction transaction, const pakfire_action_type action) {
-       size_t steps = pakfire_transaction_count(transaction);
+       int r = 0;
 
        // Walk through all steps
-       int r = 0;
-       for (unsigned int i = 0; i < steps; i++) {
-               PakfireStep step = pakfire_transaction_get_step(transaction, i);
+       PakfireStep* steps = transaction->steps;
+       while (*steps) {
+               PakfireStep step = *steps++;
 
                // Verify the step
                r = pakfire_step_run(step, action);
 
-               // Free memory
-               pakfire_step_unref(step);
-
                // End loop if action was unsuccessful
                if (r)
                        break;