С момента создания сета транзакции мы можем обходить информацию об установленных пакетах в БД RPM с помощью итератора. Для создания итератора вызывается rpmtsInitIterator:
rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, |
В вызове следует задать, какой тэг (какое поле, заданное его именем) мы будем перебирать. Как правило, это имя пакета, RPMTAG_NAME. Вместе с идентификатором поля мы должны передать имя пакета. keypointer изменяется в зависимости от того, какой тэг передан.
Для строковых данных можно передать 0 в параметре keylen. Например, ниже приводится конструкция, в которой rpmtsInitIterator ищет все пакеты, называющиеся sendmail:
rpmdbMatchIterator iter; |
rpmdbMatchIterator позволяет обходить множество пакетов, в данном случае обходятся пакеты, в именах которых имеется заданный шаблон. После вызова rpmtsInitIterator следующим шагом будет вызов rpmdbNextIterator:
Header rpmdbNextIterator(rpmdbMatchIterator iter); |
Эта функция возвращает следующий в итераторе объект хэдера. Если в итераторе больше нет пакетов, отвечающих условиям, вернется NULL.
Если Header - не NULL, из объекта можно получить записи, как было показано в предыдущих главах. Используйте цикл для обхода всех пакетов, отвечающих шаблону:
while ( (installed_header = rpmdbNextIterator(iter) ) != NULL) { |
Нет нужды освобождать объект после использования, так как каждый следующий вызов rpmdbNextIterator пересоздает Header.
Особенности работы итератора подлежат подстройке под ваши нужды. Для добавления шаблона в итератор используется rpmdbSetIteratorRE:
int rpmdbSetIteratorRE(rpmdbMatchIterator iter, |
Вызов rpmdbSetIteratorRE изменяет переданный итератор таким образом, чтобы использовался дополнительный шаблон. Параметр mode именует тип шаблона. Он может быть одним из:
Тип |
Означает |
RPMMIRE_DEFAULT |
То же, что и регулярное выражение, с добавлением \., .*, и ^..$ |
RPMMIRE_GLOB |
Шаблон в стиле glob с использованием fnmatch |
RPMMIRE_REGEX |
Регулярное выражение с использованием regcomp |
RPMMIRE_STRCMP |
Сравнение строк с использованием strcmp |
Для получения дополнительной информации по данным типам шаблонов воспользуйтесь man-ами для fnmatch(3), glob(7), regcomp(3), regex(7), и strcmp(3).
После использования итератор должен быть освобожден:
rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator iter); |
Вызов rpmdbFreeIterator возвращает NULL.
Далее - Сет зависимости
Назад - Программирование с БД RPM
Содержание