int mpkgSys::requestUninstall(string package_name, mpkgDatabase *db, DependencyTracker *DepTracker, bool purge) { //printf("requestUninstall by name !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); mDebug("requestUninstall of " + package_name); SQLRecord sqlSearch; sqlSearch.addField("package_name", package_name); if (!purge) sqlSearch.addField("package_installed", 1); else sqlSearch.addField("package_configexist",1); PACKAGE_LIST candidates; //printf("SLOW GET_PACKAGELIST CALL: %s %d\n", __func__, __LINE__); int ret = db->get_packagelist(sqlSearch, &candidates, true, false); mDebug("candidates to uninstall size = " + IntToStr(candidates.size())); int id=-1; if (ret == 0) { if (candidates.size()>1) { mError(_("Ambiguity in uninstall: multiple packages with some name are installed")); return MPKGERROR_AMBIGUITY; } if (candidates.IsEmpty()) { mError(_("Cannot remove package ") + package_name + _(": not installed")); return MPKGERROR_NOPACKAGE; } id = candidates[0].get_id(); if (id>=0) { return requestUninstall(id, db, DepTracker, purge); } else return MPKGERROR_NOPACKAGE; } else return ret; }
int mpkgSys::update_repository_data(mpkgDatabase *db)//, DependencyTracker *DepTracker) { // Функция, с которой начинается обновление данных. Repository *rep = new Repository; // Объект репозиториев vector< pair<string, string> > package_descriptions; rep->package_descriptions = &package_descriptions; // Add pointer to package descriptions PACKAGE_LIST *availablePackages = new PACKAGE_LIST; // Список пакетов, полученных из всех репозиториев... PACKAGE_LIST *tmpPackages = new PACKAGE_LIST; // Список пакетов, полученных из текущего репозитория (временное хранилище) // А есть ли у нас вообще репозитории? Может нам и ловить-то нечего?... // Впрочем, надо все равно пойти на принцип и пометить все пакеты как недоступные. Ибо это действительно так. // Поэтому - проверка устранена. if (!dialogMode) { #ifdef X86_64 say(_("Updating package data from %ld repository(s)...\n"), REPOSITORY_LIST.size()); #else say(_("Updating package data from %d repository(s)...\n"), REPOSITORY_LIST.size()); #endif } int total_packages=0; // Счетчик полученных пакетов. // Поехали! Запрашиваем каждый репозиторий через функцию get_index() unsigned int cnt=1; pData.clear(); for (size_t i=0; i<REPOSITORY_LIST.size(); ++i) { pData.addItem(REPOSITORY_LIST[i], 1, ITEMSTATE_INPROGRESS); pData.setItemCurrentAction(i, _("retrieving index")); } for (size_t i=0; i<REPOSITORY_LIST.size(); ++i) { delete tmpPackages; tmpPackages = new PACKAGE_LIST; //Очищаем временный список. pData.setItemChanged(i); _cmdOptions["hide_download_errors"] = "true"; rep->get_index(REPOSITORY_LIST[i], tmpPackages); // Получаем список пакетов. _cmdOptions["hide_download_errors"] = "false"; pData.increaseItemProgress(i); pData.setItemState(i, ITEMSTATE_FINISHED); cnt++; if (!tmpPackages->IsEmpty()) // Если мы таки получили что-то, добавляем это в список. { total_packages+=tmpPackages->size(); // Увеличим счетчик availablePackages->add_list(*tmpPackages); // Прибавляем данные к общему списку. } cnt++; } delete rep; delete tmpPackages; // Вот тут-то и начинается самое главное. Вызываем фильтрацию пакетов (действие будет происходить в функции updateRepositoryData. int ret=db->updateRepositoryData(availablePackages); // Now - update package descriptions updatePackageDescriptions(package_descriptions); if (!dialogMode) say(_("Update complete.\n")); pData.clear(); return ret; }