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$
This commit is contained in:
Aaron Griffin 2007-01-17 03:57:53 +00:00
parent 2e352141d7
commit 726e90dc2c
3 changed files with 20 additions and 57 deletions

View File

@ -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(&reg, 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(&reg, 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(&reg, 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(&reg, k->data, 0, 0, 0) == 0) {
matched = k->data;
break;
}
FREE(haystack);
}
}
regfree(&reg);
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);

View File

@ -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(&reg, pattern, REG_EXTENDED | REG_NOSUB | REG_ICASE) != 0) {
RET_ERR(PM_ERR_INVALID_REGEX, -1);
}
result = regexec(&reg, string, 0, 0, 0);
regfree(&reg);
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)

View File

@ -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);