aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--URPM.pm5
-rw-r--r--URPM.xs30
2 files changed, 35 insertions, 0 deletions
diff --git a/URPM.pm b/URPM.pm
index c7dd62d..33d1618 100644
--- a/URPM.pm
+++ b/URPM.pm
@@ -672,6 +672,11 @@ Recognized options are:
They roughly correspond to command-line options to rpm(1).
+=item $trans->traverse($callback)
+
+Executes the specified callback (a code reference) for each package in the
+transaction, passing a C<URPM::Package> object as argument the callback.
+
=back
=head2 Macro handling functions
diff --git a/URPM.xs b/URPM.xs
index 182ebc8..b923648 100644
--- a/URPM.xs
+++ b/URPM.xs
@@ -2889,6 +2889,36 @@ Trans_remove(trans, name)
OUTPUT:
RETVAL
+int
+Trans_traverse(trans, callback)
+ URPM::Transaction trans
+ SV *callback
+ PREINIT:
+ rpmdbMatchIterator mi;
+ Header h;
+ int c = 0;
+ CODE:
+ mi = rpmtsInitIterator(trans->ts, RPMDBI_PACKAGES, NULL, 0);
+ while ((h = rpmdbNextIterator(mi))) {
+ if (SvROK(callback)) {
+ dSP;
+ URPM__Package pkg = calloc(1, sizeof(struct s_Package));
+ pkg->flag = FLAG_ID_INVALID | FLAG_NO_HEADER_FREE;
+ pkg->h = h;
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(sv_setref_pv(newSVpv("", 0), "URPM::Package", pkg)));
+ PUTBACK;
+ call_sv(callback, G_DISCARD | G_SCALAR);
+ SPAGAIN;
+ pkg->h = 0; /* avoid using it anymore, in case it has been copied inside callback */
+ }
+ ++c;
+ }
+ rpmdbFreeIterator(mi);
+ RETVAL = c;
+ OUTPUT:
+ RETVAL
+
void
Trans_check(trans, ...)
URPM::Transaction trans