/** * Get list of transaction items involved in the merged transaction * Actions are merged using following rules: * (old action) -> (new action) = (merged action) * * Erase/Obsolete -> Install/Obsoleting = Reinstall/Downgrade/Upgrade * * Reinstall/Reason change -> (new action) = (new action) * * Install -> Erase = (nothing) * * Install -> Upgrade/Downgrade = Install (with Upgrade version) * * Downgrade/Upgrade/Obsoleting -> Reinstall = (old action) * * Downgrade/Upgrade/Obsoleting -> Erase/Obsoleted = Erase/Obsolete (with old package) * * Downgrade/Upgrade/Obsoleting -> Downgraded/Upgrade = * We have differentiate between original transaction, and new one. * When a transaction package pair is not complete, then we are still in original one. * * With complete transaction pair we need to get a new Upgrade/Downgrade package and * compare versions with original package from pair. */ std::vector< TransactionItemBasePtr > MergedTransaction::getItems() { ItemPairMap itemPairMap; // iterate over transaction for (auto t : transactions) { auto transItems = t->getItems(); // iterate over transaction items for (auto transItem : transItems) { // get item and its type auto mTransItem = std::dynamic_pointer_cast< TransactionItemBase >(transItem); mergeItem(itemPairMap, mTransItem); } } std::vector< TransactionItemBasePtr > items; for (const auto &row : itemPairMap) { ItemPair itemPair = row.second; items.push_back(itemPair.first); if (itemPair.second != nullptr) { items.push_back(itemPair.second); } } return items; }
bool Container::InsertItem(Item item, bool merge) { if (items.size() < getSlotCount()) { if (item.isContainer()) { return InsertContainer(item, new Container(item.getId())); } if (merge) { auto leftOver = mergeItem(item); if (leftOver > 0) { item.setNumber(leftOver); insertIntoFirstFreeSlot(item); } } else { insertIntoFirstFreeSlot(item); } return true; } return false; }
static bool addItem(RAnal *a, RSignItem *it) { char key[R_SIGN_KEY_MAXSZ], val[R_SIGN_VAL_MAXSZ]; const char *curval; bool retval = true; RSignItem *curit = R_NEW0 (RSignItem); serialize (a, it, key, val); curval = sdb_const_get (a->sdb_zigns, key, 0); if (curval) { if (!deserialize (a, curit, key, curval)) { eprintf ("error: cannot deserialize zign\n"); retval = false; goto exit_function; } mergeItem (curit, it); serialize (a, curit, key, val); } sdb_set (a->sdb_zigns, key, val, 0); exit_function: free (curit); return retval; }