Для сравнения версий пакета применяется сет зависимости. Утилита rpm, например, использует сет зависимости для этой операции.
Можно, конечно, сравнивать версии напрямую, то есть вызывать
headerGetEntry для получения значения полей версии и релиза, превращать эти строки в числа и затем сравнивать, но этот подход будет источником проблем. Такое "пользовательское" сравнение не будет столь точным, как способ, описанный в этой главе. В особенности потому, что номера версий не представляют собой числа в действительности, например, 1.12.4 по сути строка, а не число.
Для реализации всей непростой логики сравнения версий можно использовать код этой главы или вызов rpmvercmp. Не пытайтесь сравнивать версии с помощью доморощенных реализаций.
Для создания сета зависимости данного объекта хэдера (заданного пакета) вызывается rpmdsThis. Вызов rpmdsThis создает сет зависимости, который хранит имя пакета, информацию о Эпохе/Версии/Релизе и флаги.
rpmds rpmdsThis(Header header, |
Для сравнения пакетов вы можете передать RPMTAG_REQUIRENAME в качестве tagID. Настоящий tagID игнорируется механизмом сравнения. В действительности важны флаги, задающие, будет ли определятся равенство Эпохи/Версии/Релиза или же будет определяться меньшинство Эпохи/Версии/Релиза в данном сете. Для выполнения этой настройки передаются битовые флаги:
(RPMSENSE_EQUAL|RPMSENSE_LESS) |
После создания сета зависимости можно вызывать функцию rpmdsNVRMatchesDep для сравнения Имени, Версии, Релиза, то есть записей Name, Version, Release в хэдере пакета по сравнению с данными из сета зависимости.
int rpmdsNVRMatchesDep(const Header header, |
После проверки зависимостей rpmdsNVRMatchesDep возвращает 1 если зависимость перекрывается или 0 в противном случае. В терминах сравнения пакетов это означает, что при возврате 1 файлы установленного пакета такие же или старее, чем пакета сравнения, при возврате 0 установленные файлы новее. В параметре nopromote можно передать 1 для предотвращения влияния Эпохи на результат сравнения.
Также для сравнения версий двух пакетов можно вызвать rpmVersionCompare:
int rpmVersionCompare(Header header1, Header header2); |
Если хэдер 1 представляет более старую версию, чем хэдер 2, возвращается -1. Если версии одинаковые, возвращается 0. Если хэдер 1 представляет более новую версию, чем хэдер 2, возвращается 1.
Для получения имени пакета из сета зависимости используется rpmdsN:
const char* rpmdsN(const rpmds dependency_set); |
Можно использовать rpmdsN для получения имени при вызове rpmtsInitIterator, если вы работаете с сетом зависимости при поиске в БД RPM.
После использования сет зависимости должен быть освобожден:
rpmds rpmdsFree(rpmds dependency_set); |
rpmdsFree возвращает NULL, как и прочие функции очистки.
Далее - Сравнение rpm-файла и установленного пакета
Назад - Итераторы БД
Содержание