diff options
Diffstat (limited to 'rpmtools.xs')
-rw-r--r-- | rpmtools.xs | 150 |
1 files changed, 85 insertions, 65 deletions
diff --git a/rpmtools.xs b/rpmtools.xs index 07b35b4..1b80442 100644 --- a/rpmtools.xs +++ b/rpmtools.xs @@ -282,103 +282,123 @@ HV* get_info(Header header, int bflag, HV* provides) { return header_info; } +void callback_empty(void) {} MODULE = rpmtools PACKAGE = rpmtools +void* +db_open(prefix) + char *prefix + CODE: + rpmdb db; + rpmErrorCallBackType old_cb; + old_cb = rpmErrorSetCallback(callback_empty); + rpmSetVerbosity(RPMMESS_FATALERROR); + RETVAL = rpmReadConfigFiles(NULL, NULL) == 0 && rpmdbOpen(prefix, &db, O_RDONLY, 0644) == 0 ? db : NULL; + rpmErrorSetCallback(old_cb); + rpmSetVerbosity(RPMMESS_NORMAL); + OUTPUT: + RETVAL + +void +db_close(db) + void *db + CODE: + rpmdbClose((rpmdb)db); + +void +_exit(code) + int code + int -get_packages_installed(prefix, packages, lnames, ...) - char* prefix - SV* packages - SV* lnames +db_traverse_names(db, flags, names, callback) + void *db + SV *flags + SV *names + SV *callback PREINIT: - SV* flags = &PL_sv_undef; int count = 0; CODE: - if (items > 3) - flags = ST(3); - if (SvROK(packages) && SvTYPE(SvRV(packages)) == SVt_PVAV && - SvROK(lnames) && SvTYPE(SvRV(lnames)) == SVt_PVAV) { - AV* pkgs = (AV*)SvRV(packages); - AV* names = (AV*)SvRV(lnames); + if (SvROK(flags) && SvTYPE(SvRV(flags)) == SVt_PVAV && + SvROK(names) && SvTYPE(SvRV(names)) == SVt_PVAV) { + AV* flags_av = (AV*)SvRV(flags); + AV* names_av = (AV*)SvRV(names); + int bflag = get_bflag(flags_av); + int len = av_len(names_av); HV* info; SV** isv; - rpmdb db; - dbiIndexSet matches; - int bflag, num, i, j, rc, len; + int i; + STRLEN str_len; char *name; Header header; rpmdbMatchIterator mi; - if (rpmReadConfigFiles(NULL, NULL) == 0) { - if (rpmdbOpen(prefix, &db, O_RDONLY, 0644) == 0) { - bflag = SvROK(flags) && SvTYPE(SvRV(flags)) ? - get_bflag((AV*)SvRV(flags)) : (HDFLAGS_NAME | HDFLAGS_VERSION | HDFLAGS_RELEASE); - len = av_len(names); - for (j = 0; j <= len; ++j) { - isv = av_fetch(names, j, 0); - name = SvPV_nolen(*isv); - mi = rpmdbInitIterator(db, RPMTAG_NAME, name, 0); - count=0; - while (header = rpmdbNextIterator(mi)) { - count++; - info = get_info(header, bflag, NULL); - - if (info != 0) av_push(pkgs, newRV_noinc((SV*)info)); - - headerFree(header); - } + for (i = 0; i <= len; ++i) { + isv = av_fetch(names_av, i, 0); + name = SvPV(*isv, str_len); + mi = rpmdbInitIterator((rpmdb)db, RPMTAG_NAME, name, str_len); + while (header = rpmdbNextIterator(mi)) { + count++; + info = get_info(header, bflag, NULL); + + if (info != 0 && callback != &PL_sv_undef && SvROK(callback)) { + dSP; + ENTER; + SAVETMPS; + PUSHMARK(SP); + XPUSHs(sv_2mortal(newRV_noinc((SV*)info))); + PUTBACK; + call_sv(callback, G_DISCARD | G_SCALAR); + FREETMPS; + LEAVE; } - rpmdbClose(db); - } else croak("unable to open database"); - } else croak("cannot read rpm config files"); + } + rpmdbFreeIterator(mi); + } } else croak("bad arguments list"); RETVAL = count; OUTPUT: RETVAL - int -get_all_packages_installed(prefix, packages, ...) - char* prefix - SV* packages +db_traverse(db, flags, callback) + void *db + SV *flags + SV *callback PREINIT: - SV* flags = &PL_sv_undef; int count = 0; CODE: - if (items > 2) - flags = ST(2); - if (SvROK(packages) && SvTYPE(SvRV(packages)) == SVt_PVAV) { - AV* pkgs = (AV*)SvRV(packages); + if (SvROK(flags) && SvTYPE(SvRV(flags)) == SVt_PVAV) { + AV* flags_av = (AV*)SvRV(flags); + int bflag = get_bflag(flags_av); HV* info; - rpmdb db; - int bflag, num; Header header; rpmdbMatchIterator mi; - - if (rpmReadConfigFiles(NULL, NULL) == 0) { - if (rpmdbOpen(prefix, &db, O_RDONLY, 0644) == 0) { - bflag = SvROK(flags) && SvTYPE(SvRV(flags)) ? - get_bflag((AV*)SvRV(flags)) : (HDFLAGS_NAME | HDFLAGS_VERSION | HDFLAGS_RELEASE); - mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, NULL, 0); - - while (header = rpmdbNextIterator(mi)) { - info = get_info(header, bflag, NULL); - - if (info != 0) av_push(pkgs, newRV_noinc((SV*)info)); - - headerFree(header); - ++count; - } - rpmdbClose(db); - } else croak("unable to open database"); - } else croak("cannot read rpm config files"); + + mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, NULL, 0); + while (header = rpmdbNextIterator(mi)) { + info = get_info(header, bflag, NULL); + + if (info != 0 && callback != &PL_sv_undef && SvROK(callback)) { + dSP; + ENTER; + SAVETMPS; + PUSHMARK(SP); + XPUSHs(sv_2mortal(newRV_noinc((SV*)info))); + PUTBACK; + call_sv(callback, G_DISCARD | G_SCALAR); + FREETMPS; + LEAVE; + } + ++count; + } + rpmdbFreeIterator(mi); } else croak("bad arguments list"); RETVAL = count; OUTPUT: RETVAL - void _parse_(fileno_or_rpmfile, flag, info, ...) SV* fileno_or_rpmfile |