diff options
-rw-r--r-- | README.md | 33 | ||||
-rw-r--r-- | package.xml | 6 | ||||
-rw-r--r-- | rpminfo.c | 72 | ||||
-rw-r--r-- | tests/008-rpmdbsearch.phpt (renamed from tests/008-rpmdbinfo2.phpt) | 10 |
4 files changed, 98 insertions, 23 deletions
@@ -108,7 +108,7 @@ Retrieve information from rpm database about installed packages using glob or re The return value is an array of hash tables, or false if it fails. $ php -a - php > print_r(rpmdbinfo("php-pecl-r*", false, RPM_MATCH_GLOB)); + php > print_r(rpmdbsearch("php-pecl-r*", RPM_TAG_NAME, RPM_MATCH_GLOB)); Array ( [0] => Array @@ -121,10 +121,10 @@ The return value is an array of hash tables, or false if it fails. ) [1] => Array ( - [Name] => php-pecl-request - [Version] => 1.0.0 - [Release] => 0.11.b2.fc31.remi.7.3 - [Summary] => Server-side request and response objects + [Name] => php-pecl-redis5 + [Version] => 5.2.0 + [Release] => 1.fc31.remi.7.3 + [Summary] => Extension for communicating with the Redis key-value store [Arch] => x86_64 ) [2] => Array @@ -138,7 +138,7 @@ The return value is an array of hash tables, or false if it fails. ) $ php -a - php > print_r(rpmdbinfo("^php-pecl-r", false, RPM_MATCH_REGEX)); + php > print_r(rpmdbsearch("^php-pecl-r", RPM_TAG_NAME, RPM_MATCH_REGEX)); Array ( [0] => Array @@ -151,10 +151,10 @@ The return value is an array of hash tables, or false if it fails. ) [1] => Array ( - [Name] => php-pecl-request - [Version] => 1.0.0 - [Release] => 0.11.b2.fc31.remi.7.3 - [Summary] => Server-side request and response objects + [Name] => php-pecl-redis5 + [Version] => 5.2.0 + [Release] => 1.fc31.remi.7.3 + [Summary] => Extension for communicating with the Redis key-value store [Arch] => x86_64 ) [2] => Array @@ -167,6 +167,19 @@ The return value is an array of hash tables, or false if it fails. ) ) + $ php -a + php > print_r(rpmdbsearch(PHP_BINARY, RPM_TAG_INSTFILENAMES)); + Array + ( + [0] => Array + ( + [Name] => php-cli + [Version] => 7.3.15 + [Release] => 1.fc31.remi + [Summary] => Command-line interface for PHP + [Arch] => x86_64 + ) + ) ---- diff --git a/package.xml b/package.xml index 41ff33f..2b3d729 100644 --- a/package.xml +++ b/package.xml @@ -26,8 +26,8 @@ Available functions: </stability> <license>PHP 3.01</license> <notes> -- add match_mode parameters to rpmdbinfo function allowing - to search packages with name matching a glob or a regex. +- add rpmdbsearch function to search packages using + name, owned files, requires, provides... </notes> <contents> <dir name="/"> @@ -53,7 +53,7 @@ Available functions: <file name="005-rpminfo-full.phpt" role="test"/> <file name="006-rpminfo-errors.phpt" role="test"/> <file name="007-rpmdbinfo.phpt" role="test"/> - <file name="008-rpmdbinfo2.phpt" role="test"/> + <file name="008-rpmdbsearch.phpt" role="test"/> <file name="bidon.rpm" role="test"/> <file name="bidon-src.rpm" role="test"/> </dir> @@ -250,37 +250,86 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_rpmdbinfo, 0, 0, 1) ZEND_ARG_INFO(0, match_mode) ZEND_END_ARG_INFO() -/* {{{ proto array rpmdbinfo(string name [, bool full [, string &$error]) - Retrieve information from a RPM file */ +/* {{{ proto array rpmdbinfo(string name [, bool full]) + Retrieve information from an installed RPM */ PHP_FUNCTION(rpmdbinfo) { char *name; size_t len; zend_bool full = 0; + Header h; + rpmdb db; + rpmdbMatchIterator di; + rpmts ts = rpminfo_getts(_RPMVSF_NODIGESTS | _RPMVSF_NOSIGNATURES | RPMVSF_NOHDRCHK); + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|b", &name, &len, &full) == FAILURE) { + return; + } + + rpmtsOpenDB(ts, O_RDONLY); + db = rpmtsGetRdb(ts); + di = rpmdbInitIterator(db, RPMTAG_NAME, name, len); + if (!di) { + // Not found + rpmtsCloseDB(ts); + RETURN_FALSE; + } + + array_init(return_value); + while ((h = rpmdbNextIterator(di)) != NULL) { + zval tmp; + rpm_header_to_zval(&tmp, h, full); + add_next_index_zval(return_value, &tmp); + } + + rpmdbFreeIterator(di); + rpmtsCloseDB(ts); +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(arginfo_rpmdbsearch, 0, 0, 2) + ZEND_ARG_INFO(0, tag_name) + ZEND_ARG_INFO(0, pattern) + ZEND_ARG_INFO(0, mode) +ZEND_END_ARG_INFO() + +/* {{{ proto array rpmdbsearch(string pattern [, integer tag_name = RPM_TAG_NAME [, integer mode]]) + Search information from installed RPMs */ +PHP_FUNCTION(rpmdbsearch) +{ + char *name; + size_t len; + zend_long crit = RPMTAG_NAME; zend_long mode = 0; Header h; rpmdb db; rpmdbMatchIterator di; rpmts ts = rpminfo_getts(_RPMVSF_NODIGESTS | _RPMVSF_NOSIGNATURES | RPMVSF_NOHDRCHK); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|bl", &name, &len, &full, &mode) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|ll", &name, &len, &crit, &mode) == FAILURE) { return; } + if (mode && crit != RPMTAG_NAME) { + php_error_docref(NULL, E_WARNING, "Mode only allowed for name"); + mode = 0; + } + rpmtsOpenDB(ts, O_RDONLY); db = rpmtsGetRdb(ts); if (mode) { - di = rpmdbInitIterator(db, RPMTAG_NAME, NULL, 0); + di = rpmdbInitIterator(db, crit, NULL, len); } else { - di = rpmdbInitIterator(db, RPMTAG_NAME, name, len); + di = rpmdbInitIterator(db, crit, name, len); } if (!di) { // Not found rpmtsCloseDB(ts); RETURN_FALSE; } + if (mode) { - if (rpmdbSetIteratorRE(di, RPMTAG_NAME, mode, name)) { + if (rpmdbSetIteratorRE(di, crit, mode, name)) { php_error_docref(NULL, E_WARNING, "Can't set filter"); rpmtsCloseDB(ts); RETURN_FALSE; @@ -290,7 +339,7 @@ PHP_FUNCTION(rpmdbinfo) array_init(return_value); while ((h = rpmdbNextIterator(di)) != NULL) { zval tmp; - rpm_header_to_zval(&tmp, h, full); + rpm_header_to_zval(&tmp, h, 0); add_next_index_zval(return_value, &tmp); } @@ -403,10 +452,16 @@ PHP_MINIT_FUNCTION(rpminfo) REGISTER_LONG_CONSTANT("RPMSENSE_KEYRING", RPMSENSE_KEYRING, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("RPMSENSE_CONFIG", RPMSENSE_CONFIG, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("RPM_MATCH_EQUAL", 0, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("RPM_MATCH_DEFAULT", RPMMIRE_DEFAULT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("RPM_MATCH_STRCMP", RPMMIRE_STRCMP, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("RPM_MATCH_REGEX", RPMMIRE_REGEX, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("RPM_MATCH_GLOB", RPMMIRE_GLOB, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("RPM_TAG_NAME", RPMTAG_NAME, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("RPM_TAG_INSTFILENAMES", RPMTAG_INSTFILENAMES, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("RPM_TAG_REQUIRENAME", RPMTAG_REQUIRENAME, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("RPM_TAG_PROVIDENAME", RPMTAG_PROVIDENAME, CONST_CS | CONST_PERSISTENT); + return SUCCESS; } /* }}} */ @@ -466,6 +521,7 @@ PHP_GSHUTDOWN_FUNCTION(rpminfo) */ const zend_function_entry rpminfo_functions[] = { PHP_FE(rpmdbinfo, arginfo_rpmdbinfo) + PHP_FE(rpmdbsearch, arginfo_rpmdbsearch) PHP_FE(rpminfo, arginfo_rpminfo) PHP_FE(rpmvercmp, arginfo_rpmvercmp) PHP_FE_END diff --git a/tests/008-rpmdbinfo2.phpt b/tests/008-rpmdbsearch.phpt index 940ad61..09800a6 100644 --- a/tests/008-rpmdbinfo2.phpt +++ b/tests/008-rpmdbsearch.phpt @@ -4,13 +4,19 @@ Check for rpmdbinfo function <?php if (!extension_loaded("rpminfo")) print "skip"; ?> --FILE-- <?php -$a = rpmdbinfo('php*', false, RPM_MATCH_GLOB); +$a = rpmdbsearch('php*', RPM_TAG_NAME , RPM_MATCH_GLOB); var_dump(count($a) > 1); -$a = rpmdbinfo('^php', false, RPM_MATCH_REGEX); + +$a = rpmdbsearch('^php', RPM_TAG_NAME, RPM_MATCH_REGEX); var_dump(count($a) > 1); + +$a = rpmdbsearch(PHP_BINARY, RPM_TAG_INSTFILENAMES); +var_dump(count($a) == 1); + ?> Done --EXPECTF-- bool(true) bool(true) +bool(true) Done |