/* * Add a delete operation to the transaction * @param [String, Package, Dependency] pkg Package to delete */ VALUE rpm_transaction_delete(VALUE trans, VALUE pkg) { VALUE db; VALUE mi; #if RPM_VERSION_CODE < RPM_VERSION(4,9,0) || RPM_VERSION_CODE >= RPM_VERSION(5,0,0) db = rb_ivar_get(trans, id_db); if (TYPE(pkg) == T_STRING) mi = rpm_db_init_iterator(db, INT2NUM(RPMDBI_LABEL), pkg); else if (rb_obj_is_kind_of(pkg, rpm_cPackage) != Qfalse) { VALUE sigmd5 = rpm_package_aref(pkg,INT2NUM(RPMTAG_SIGMD5)); if (sigmd5 != Qnil){ mi = rpm_db_init_iterator(db, INT2NUM(RPMTAG_SIGMD5), sigmd5); }else{ VALUE name = rpm_package_aref(pkg,INT2NUM(RPMDBI_LABEL)); mi = rpm_db_init_iterator(db, INT2NUM(RPMDBI_LABEL), name); } } else if ( rb_obj_is_kind_of(pkg, rpm_cDependency) ==Qfalse && rb_respond_to(pkg,rb_intern("name")) && rb_respond_to(pkg,rb_intern("version"))){ mi = rpm_db_init_iterator(db, INT2NUM(RPMDBI_LABEL),rb_funcall(pkg,rb_intern("name"),0)); rpm_mi_set_iterator_version(mi,rb_funcall(pkg,rb_intern("version"),0)); } else rb_raise(rb_eTypeError, "illegal argument type"); #else if (TYPE(pkg) == T_STRING) mi = rpm_transaction_init_iterator(trans, INT2NUM(RPMDBI_LABEL), pkg); else if (rb_obj_is_kind_of(pkg, rpm_cPackage) != Qfalse) { VALUE sigmd5 = rpm_package_aref(pkg,INT2NUM(RPMTAG_SIGMD5)); if (sigmd5 != Qnil){ mi = rpm_transaction_init_iterator(trans, INT2NUM(RPMTAG_SIGMD5), sigmd5); }else{ VALUE name = rpm_package_aref(pkg,INT2NUM(RPMDBI_LABEL)); mi = rpm_transaction_init_iterator(trans, INT2NUM(RPMDBI_LABEL), name); } } else if ( rb_obj_is_kind_of(pkg, rpm_cDependency) ==Qfalse && rb_respond_to(pkg,rb_intern("name")) && rb_respond_to(pkg,rb_intern("version"))){ mi = rpm_transaction_init_iterator(trans, INT2NUM(RPMDBI_LABEL),rb_funcall(pkg,rb_intern("name"),0)); rpm_mi_set_iterator_version(mi,rb_funcall(pkg,rb_intern("version"),0)); } else rb_raise(rb_eTypeError, "illegal argument type"); #endif VALUE p; while (!NIL_P(p = rpm_mi_next_iterator(mi))) { VALUE off = rpm_mi_get_iterator_offset(mi); if (!NIL_P(off)){ #if RPM_VERSION_CODE < RPM_VERSION(4,1,0) rpmtransRemovePackage(RPM_TRANSACTION(trans), NUM2INT(off)); #else rpmtsAddEraseElement(RPM_TRANSACTION(trans), RPM_HEADER(p), NUM2INT(off)); #endif } } return Qnil; }
void RpmTransaction::addToTransactionRemove(const StringVector& files) { for (StringVector::size_type i = 0;i < files.size();i++) { rpmdbMatchIterator MI; MI = rpmdbInitIterator(m_db, RPMDBI_LABEL, files[i].c_str(), 0); Header hdr; while ((hdr = rpmdbNextIterator(MI)) != NULL) { const unsigned int recOffset = rpmdbGetIteratorOffset(MI); if (recOffset) { const int rc = rpmtransRemovePackage(m_ts, recOffset); if (rc != 0) throw PkgBackEndException("rpmtransRemovePackage()"); } } MI = rpmdbFreeIterator(MI); } }