15.4.2. Сет зависимости

Для сравнения версий пакета применяется сет зависимости. Утилита rpm, например, использует сет зависимости для этой операции.

Можно, конечно, сравнивать версии напрямую, то есть вызывать
headerGetEntry для получения значения полей версии и релиза, превращать эти строки в числа и затем сравнивать, но этот подход будет источником проблем. Такое "пользовательское" сравнение не будет столь точным, как способ, описанный в этой главе. В особенности потому, что номера версий не представляют собой числа в действительности, например, 1.12.4 по сути строка, а не число.

Для реализации всей непростой логики сравнения версий можно использовать код этой главы или вызов rpmvercmp. Не пытайтесь сравнивать версии с помощью доморощенных реализаций.

Для создания сета зависимости данного объекта хэдера (заданного пакета) вызывается rpmdsThis. Вызов rpmdsThis создает сет зависимости, который хранит имя пакета, информацию о Эпохе/Версии/Релизе и флаги.

rpmds rpmdsThis(Header header,

rpmTag tagID,

int_32 Flags);

Для сравнения пакетов вы можете передать RPMTAG_REQUIRENAME в качестве tagID. Настоящий tagID игнорируется механизмом сравнения. В действительности важны флаги, задающие, будет ли определятся равенство Эпохи/Версии/Релиза или же будет определяться меньшинство Эпохи/Версии/Релиза в данном сете. Для выполнения этой настройки передаются битовые флаги:

(RPMSENSE_EQUAL|RPMSENSE_LESS)

После создания сета зависимости можно вызывать функцию rpmdsNVRMatchesDep для сравнения Имени, Версии, Релиза, то есть записей Name, Version, Release в хэдере пакета по сравнению с данными из сета зависимости.

int rpmdsNVRMatchesDep(const Header header,

const rpmds dependency_set,

int nopromote);

После проверки зависимостей 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-файла и установленного пакета
Назад - Итераторы БД
Содержание