diff options
author | Dan McGee <dan@archlinux.org> | 2007-02-27 00:32:08 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2007-02-27 00:32:08 +0100 |
commit | cb311adeab04aa5a8780f48af450b5e20a00dedc (patch) | |
tree | 3bbb0cb576b543894814c3d22a4ff2d964b26c5e | |
parent | 01bb564e703ab8cbff26940f9274484f1a3ad87b (diff) | |
download | pacman-cb311adeab04aa5a8780f48af450b5e20a00dedc.tar.gz pacman-cb311adeab04aa5a8780f48af450b5e20a00dedc.tar.xz |
* db search optimization- why don't we compile the regex once instead of once
per package.
-rw-r--r-- | lib/libalpm/db.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 8a7210d3..62255a3f 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -105,21 +105,21 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, alpm_list_t *needles) for(i = needles; i; i = i->next) { char *targ; + regex_t reg; if(i->data == NULL) { continue; } targ = i->data; _alpm_log(PM_LOG_DEBUG, "searching for target '%s'", targ); + + if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE) != 0) { + RET_ERR(PM_ERR_INVALID_REGEX, NULL); + } for(j = _alpm_db_get_pkgcache(db, INFRQ_DESC|INFRQ_DEPENDS); j; j = j->next) { pmpkg_t *pkg = j->data; char *matched = NULL; - regex_t reg; - - if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE) != 0) { - RET_ERR(PM_ERR_INVALID_REGEX, NULL); - } /* check name */ if (regexec(®, pkg->name, 0, 0, 0) == 0) { @@ -130,6 +130,8 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, alpm_list_t *needles) matched = pkg->desc; } /* check provides */ + /* TODO: should we be doing this, and should we print something + * differently when we do match it since it isn't currently printed? */ else { for(k = pkg->provides; k; k = k->next) { if (regexec(®, k->data, 0, 0, 0) == 0) { @@ -138,13 +140,15 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, alpm_list_t *needles) } } } - regfree(®); if(matched != NULL) { - _alpm_log(PM_LOG_DEBUG, " search target '%s' matched '%s'", targ, matched); + _alpm_log(PM_LOG_DEBUG, " search target '%s' matched '%s'", + targ, matched); ret = alpm_list_add(ret, pkg); } } + + regfree(®); } return(ret); |