diff options
author | Aaron Griffin <aaron@archlinux.org> | 2007-01-17 04:57:53 +0100 |
---|---|---|
committer | Aaron Griffin <aaron@archlinux.org> | 2007-01-17 04:57:53 +0100 |
commit | 726e90dc2c860ee6893df29f9d8cf9c886fdd66d (patch) | |
tree | a8449f5567ec0ec13e94b8af3695bda2b417f692 | |
parent | 2e352141d793e00b6a5b4a6f1efabc2ef8142c0c (diff) | |
download | pacman-726e90dc2c860ee6893df29f9d8cf9c886fdd66d.tar.gz pacman-726e90dc2c860ee6893df29f9d8cf9c886fdd66d.tar.xz |
Jürgen Hötzel <juergen@hoetzel.info>
* avoid repeated regex compilations (regex for search string do not
change while scanning the package database)
* remove needless string duplication (regex function do not change target
string nor free them)
* code cleanup
This patch improves search performance:
bash-3.2$ time ./src/pacman/pacman.static.old -Ss "(database|web).*server" >/dev/null
real 0m1.026s
user 0m0.544s
sys 0m0.208s
bash-3.2$ time ./src/pacman/pacman.static -Ss "(database|web).*server" >/dev/null
real 0m0.777s
user 0m0.456s
sys 0m0.128s
bash-3.2$
-rw-r--r-- | lib/libalpm/db.c | 61 | ||||
-rw-r--r-- | lib/libalpm/util.c | 15 | ||||
-rw-r--r-- | lib/libalpm/util.h | 1 |
3 files changed, 20 insertions, 57 deletions
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index e6b3f4df..1cc603be 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -37,6 +37,7 @@ #include <sys/stat.h> #include <dirent.h> #include <libintl.h> +#include <regex.h> #ifdef CYGWIN #include <limits.h> /* PATH_MAX */ #endif @@ -101,68 +102,46 @@ pmlist_t *_alpm_db_search(pmdb_t *db, pmlist_t *needles) for(i = needles; i; i = i->next) { char *targ; - int retval; if(i->data == NULL) { continue; } - targ = strdup(i->data); + targ = i->data; _alpm_log(PM_LOG_DEBUG, "searching for target '%s'", targ); for(j = _alpm_db_get_pkgcache(db, INFRQ_DESC|INFRQ_DEPENDS); j; j = j->next) { pmpkg_t *pkg = j->data; - char *haystack; - int match = 0; + char *matched = NULL; + regex_t reg; + + if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE) != 0) { + RET_ERR(PM_ERR_INVALID_REGEX, NULL); + } /* check name */ - haystack = strdup(pkg->name); - retval = _alpm_reg_match(haystack, targ); - if(retval < 0) { - /* bad regexp */ - FREE(haystack); - return(NULL); - } else if(retval) { - _alpm_log(PM_LOG_DEBUG, " search target '%s' matched '%s'", targ, haystack); - match = 1; + if (regexec(®, pkg->name, 0, 0, 0) == 0) { + matched = pkg->name; } - FREE(haystack); - - /* check description */ - if(!match) { - haystack = strdup(pkg->desc); - retval = _alpm_reg_match(haystack, targ); - if(retval < 0) { - /* bad regexp */ - FREE(haystack); - return(NULL); - } else if(retval) { - match = 1; - } - FREE(haystack); + /* check desc */ + else if (regexec(®, pkg->desc, 0, 0, 0) == 0) { + matched = pkg->desc; } - /* check provides */ - if(!match) { + else { for(k = pkg->provides; k; k = k->next) { - haystack = strdup(k->data); - retval = _alpm_reg_match(haystack, targ); - if(retval < 0) { - /* bad regexp */ - FREE(haystack); - return(NULL); - } else if(retval) { - match = 1; + if (regexec(®, k->data, 0, 0, 0) == 0) { + matched = k->data; + break; } - FREE(haystack); } } + regfree(®); - if(match) { + if(matched != NULL) { + _alpm_log(PM_LOG_DEBUG, " search target '%s' matched '%s'", targ, matched); ret = _alpm_list_add(ret, pkg); } } - - FREE(targ); } return(ret); diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 1610c43f..ec4b7eef 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -54,7 +54,6 @@ #ifndef __sun__ #include <mntent.h> #endif -#include <regex.h> /* pacman */ #include "log.h" @@ -619,20 +618,6 @@ int _alpm_check_freespace(pmtrans_t *trans, pmlist_t **data) } #endif -/* match a string against a regular expression */ -int _alpm_reg_match(char *string, char *pattern) -{ - int result; - regex_t reg; - - if(regcomp(®, pattern, REG_EXTENDED | REG_NOSUB | REG_ICASE) != 0) { - RET_ERR(PM_ERR_INVALID_REGEX, -1); - } - result = regexec(®, string, 0, 0, 0); - regfree(®); - return(!(result)); -} - /* convert a time_t to a string - buffer MUST be large enough for * YYYYMMDDHHMMSS - 15 chars */ void _alpm_time2string(time_t t, char *buffer) diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h index 978de9e7..cda65a3a 100644 --- a/lib/libalpm/util.h +++ b/lib/libalpm/util.h @@ -70,7 +70,6 @@ int _alpm_runscriptlet(char *util, char *installfn, char *script, char *ver, cha int _alpm_check_freespace(pmtrans_t *trans, pmlist_t **data); #endif #endif -int _alpm_reg_match(char *string, char *pattern); void _alpm_time2string(time_t t, char *buffer); #ifdef __sun__ char* strsep(char** str, const char* delims); |