void RpmTransaction::process(const StringVector& install, const StringVector& remove, const StringToStringMap& upgrade, const StringToStringMap& downgrade) { int rc = 0; int probFilter = 0; int notifyFlags = 0; int tsFlags = 0; rpmProblemSet probs; if (!upgrade.empty()) probFilter |= RPMPROB_FILTER_OLDPACKAGE; // probFilter |= RPMPROB_FILTER_REPLACEPKG//reinstall;; // probFilter |= RPMPROB_FILTER_REPLACEOLDFILES; // probFilter |= RPMPROB_FILTER_REPLACENEWFILES; notifyFlags |= INSTALL_LABEL | INSTALL_HASH; if (!remove.empty()) addToTransactionRemove(remove); if (!install.empty()) addToTransactionInstall(install); if (!upgrade.empty()) addToTransactionUpgrade(upgrade); rpmDependencyConflict conflicts = NULL; int numConflicts; if (rpmdepCheck(m_ts, &conflicts, &numConflicts) || conflicts) { std::cerr << "Conflicts found!!" << std::endl; if (conflicts) { printDepProblems(stderr, conflicts, numConflicts); rpmdepFreeConflicts(conflicts, numConflicts); } exit(EXIT_FAILURE); } rc = rpmdepOrder(m_ts); if (rc > 0) { std::cerr << "Ordering failed" << std::endl; return; } rc = rpmRunTransactions(m_ts, rpmShowProgress, (void *)(intptr_t)notifyFlags, NULL, &probs, (rpmtransFlags)tsFlags, (rpmprobFilterFlags)probFilter); if (rc > 0) { std::cerr << "Error while running transaction" << std::endl; // if (probs->numProblems > 0) // rpmpsPrint(stderr, probs); } else if (rc < 0) std::cerr << "warning:some errors occurred while running transaction" << std::endl; // rpmpsFree(probs); }
bool RpmBackEnd::transaction(const StringVector& toInstall, const StringVector& toRemove, const StringToStringMap& toUpgrade, const StringToStringMap& toDowngrade) { if (!toDowngrade.empty()) throw NotImplementedException("Downgrading tasks in a transaction"); logMsg(LOG_DEBUG, "backend:starting transaction with %zu packages to install, %zu packages to remove, %zu packages to upgrade and %zu packages to downgrade", toInstall.size(), toRemove.size(), toUpgrade.size(), toDowngrade.size()); for(StringVector::size_type i = 0;i < toInstall.size();i++) logMsg(LOG_DEBUG, "backend:%s to install", toInstall[i].c_str()); for(StringVector::size_type i = 0;i < toRemove.size();i++) logMsg(LOG_DEBUG, "backend:%s to remove", toRemove[i].c_str()); for(StringToStringMap::const_iterator it = toUpgrade.begin();it != toUpgrade.end();it++) logMsg(LOG_DEBUG, "backend:%s -> %s to upgrade", it->first.c_str(), it->second.c_str()); for(StringToStringMap::const_iterator it = toDowngrade.begin();it != toDowngrade.end();it++) logMsg(LOG_DEBUG, "backend:%s -> %s to downgrade", it->first.c_str(), it->second.c_str()); RpmTransaction transact; transact.init(); transact.process(toInstall, toRemove, toUpgrade, toDowngrade); transact.close(); logMsg(LOG_DEBUG, "backend:transaction is completed"); return 1; }