15.4.1. Итераторы БД

С момента создания сета транзакции мы можем обходить информацию об установленных пакетах в БД RPM с помощью итератора. Для создания итератора вызывается rpmtsInitIterator:

rpmdbMatchIterator rpmtsInitIterator(const rpmts ts,

rpmTag rpmtag,

const void *keypointer,

size_t keylen);

В вызове следует задать, какой тэг (какое поле, заданное его именем) мы будем перебирать. Как правило, это имя пакета, RPMTAG_NAME. Вместе с идентификатором поля мы должны передать имя пакета. keypointer изменяется в зависимости от того, какой тэг передан.

Для строковых данных можно передать 0 в параметре keylen. Например, ниже приводится конструкция, в которой rpmtsInitIterator ищет все пакеты, называющиеся sendmail:

rpmdbMatchIterator iter;

iter = rpmtsInitIterator(ts, RPMTAG_NAME, "sendmail", 0);

rpmdbMatchIterator позволяет обходить множество пакетов, в данном случае обходятся пакеты, в именах которых имеется заданный шаблон. После вызова rpmtsInitIterator следующим шагом будет вызов rpmdbNextIterator:

Header rpmdbNextIterator(rpmdbMatchIterator iter);

Эта функция возвращает следующий в итераторе объект хэдера. Если в итераторе больше нет пакетов, отвечающих условиям, вернется NULL.

Если Header - не NULL, из объекта можно получить записи, как было показано в предыдущих главах. Используйте цикл для обхода всех пакетов, отвечающих шаблону:

while ( (installed_header = rpmdbNextIterator(iter) ) != NULL) {

/* Do something... */

}

Нет нужды освобождать объект после использования, так как каждый следующий вызов rpmdbNextIterator пересоздает Header.

Особенности работы итератора подлежат подстройке под ваши нужды. Для добавления шаблона в итератор используется rpmdbSetIteratorRE:

int rpmdbSetIteratorRE(rpmdbMatchIterator iter,

rpmTag tag,

rpmMireMode mode,

const char * pattern);

Вызов 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
Содержание