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 | 
