xbps-query: optimize the search mode with --regex (compile ERE once).

This commit is contained in:
Juan RP 2015-01-14 20:53:01 +01:00
parent 8263449f94
commit 676888b5c1
2 changed files with 13 additions and 20 deletions

2
NEWS
View File

@ -23,7 +23,7 @@ xbps-0.44 (???):
and its dependencies) and `xbps-remove -o` (remove orphaned pkgs) marginally. and its dependencies) and `xbps-remove -o` (remove orphaned pkgs) marginally.
* xbps-query(8): only compile the ERE (Extended Regular Expression) once in * xbps-query(8): only compile the ERE (Extended Regular Expression) once in
the ownedby mode. A performance improvement suggested by Christian Neukirchen. the ownedby and search modes. A performance improvement suggested by Christian Neukirchen.
* libxbps: performance improvement for xbps_repo_get_pkg_revdeps(): when finding * libxbps: performance improvement for xbps_repo_get_pkg_revdeps(): when finding
the matching pkg, search for it in the current repository, not in the repository the matching pkg, search for it in the current repository, not in the repository

View File

@ -45,6 +45,7 @@
struct search_data { struct search_data {
bool regex, repo_mode; bool regex, repo_mode;
regex_t regexp;
int maxcols; int maxcols;
const char *pat, *prop, *repourl; const char *pat, *prop, *repourl;
xbps_array_t results; xbps_array_t results;
@ -104,7 +105,6 @@ search_array_cb(struct xbps_handle *xhp _unused,
xbps_object_t obj2; xbps_object_t obj2;
struct search_data *sd = arg; struct search_data *sd = arg;
const char *pkgver = NULL, *desc, *str; const char *pkgver = NULL, *desc, *str;
regex_t regex;
if (!xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver)) if (!xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver))
return 0; return 0;
@ -118,15 +118,11 @@ search_array_cb(struct xbps_handle *xhp _unused,
vpkgfound = true; vpkgfound = true;
if (sd->regex) { if (sd->regex) {
if (regcomp(&regex, sd->pat, REG_EXTENDED|REG_NOSUB) != 0) if ((regexec(&sd->regexp, pkgver, 0, 0, 0) == 0) ||
return errno; (regexec(&sd->regexp, desc, 0, 0, 0) == 0)) {
if ((regexec(&regex, pkgver, 0, 0, 0) == 0) ||
(regexec(&regex, desc, 0, 0, 0) == 0)) {
xbps_array_add_cstring_nocopy(sd->results, pkgver); xbps_array_add_cstring_nocopy(sd->results, pkgver);
xbps_array_add_cstring_nocopy(sd->results, desc); xbps_array_add_cstring_nocopy(sd->results, desc);
} }
regfree(&regex);
return 0; return 0;
} }
if (vpkgfound) { if (vpkgfound) {
@ -149,15 +145,12 @@ search_array_cb(struct xbps_handle *xhp _unused,
for (unsigned int i = 0; i < xbps_array_count(obj2); i++) { for (unsigned int i = 0; i < xbps_array_count(obj2); i++) {
xbps_array_get_cstring_nocopy(obj2, i, &str); xbps_array_get_cstring_nocopy(obj2, i, &str);
if (sd->regex) { if (sd->regex) {
if (regcomp(&regex, sd->pat, REG_EXTENDED|REG_NOSUB) != 0) if (regexec(&sd->regexp, str, 0, 0, 0) == 0) {
return errno;
if (regexec(&regex, str, 0, 0, 0) == 0) {
if (sd->repo_mode) if (sd->repo_mode)
printf("%s: %s (%s)\n", pkgver, str, sd->repourl); printf("%s: %s (%s)\n", pkgver, str, sd->repourl);
else else
printf("%s: %s\n", pkgver, str); printf("%s: %s\n", pkgver, str);
} }
regfree(&regex);
} else { } else {
if ((strcasestr(str, sd->pat)) || if ((strcasestr(str, sd->pat)) ||
(fnmatch(sd->pat, str, FNM_PERIOD)) == 0) { (fnmatch(sd->pat, str, FNM_PERIOD)) == 0) {
@ -176,15 +169,12 @@ search_array_cb(struct xbps_handle *xhp _unused,
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
if (sd->regex) { if (sd->regex) {
if (regcomp(&regex, sd->pat, REG_EXTENDED|REG_NOSUB) != 0) if (regexec(&sd->regexp, size, 0, 0, 0) == 0) {
return errno;
if (regexec(&regex, size, 0, 0, 0) == 0) {
if (sd->repo_mode) if (sd->repo_mode)
printf("%s: %s (%s)\n", pkgver, size, sd->repourl); printf("%s: %s (%s)\n", pkgver, size, sd->repourl);
else else
printf("%s: %s\n", pkgver, size); printf("%s: %s\n", pkgver, size);
} }
regfree(&regex);
} else { } else {
if (strcasestr(size, sd->pat)) { if (strcasestr(size, sd->pat)) {
if (sd->repo_mode) if (sd->repo_mode)
@ -204,15 +194,12 @@ search_array_cb(struct xbps_handle *xhp _unused,
/* property is a string */ /* property is a string */
str = xbps_string_cstring_nocopy(obj2); str = xbps_string_cstring_nocopy(obj2);
if (sd->regex) { if (sd->regex) {
if (regcomp(&regex, sd->pat, REG_EXTENDED|REG_NOSUB) != 0) if (regexec(&sd->regexp, str, 0, 0, 0) == 0) {
return errno;
if (regexec(&regex, str, 0, 0, 0) == 0) {
if (sd->repo_mode) if (sd->repo_mode)
printf("%s: %s (%s)\n", pkgver, str, sd->repourl); printf("%s: %s (%s)\n", pkgver, str, sd->repourl);
else else
printf("%s: %s\n", pkgver, str); printf("%s: %s\n", pkgver, str);
} }
regfree(&regex);
} else { } else {
if (strcasestr(str, sd->pat)) { if (strcasestr(str, sd->pat)) {
if (sd->repo_mode) if (sd->repo_mode)
@ -249,6 +236,10 @@ search(struct xbps_handle *xhp, bool repo_mode, const char *pat, const char *pro
int rv; int rv;
sd.regex = regex; sd.regex = regex;
if (regex) {
if (regcomp(&sd.regexp, pat, REG_EXTENDED|REG_NOSUB) != 0)
return errno;
}
sd.repo_mode = repo_mode; sd.repo_mode = repo_mode;
sd.pat = pat; sd.pat = pat;
sd.prop = prop; sd.prop = prop;
@ -274,6 +265,8 @@ search(struct xbps_handle *xhp, bool repo_mode, const char *pat, const char *pro
print_results(xhp, &sd); print_results(xhp, &sd);
xbps_object_release(sd.results); xbps_object_release(sd.results);
} }
if (regex)
regfree(&sd.regexp);
return rv; return rv;
} }