mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-22 15:58:50 -05:00
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:
parent
2e352141d7
commit
726e90dc2c
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user