Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Improved query efficiency.
jlaffaye committed 15 years ago
commit 1bb05a004fb29ac3a4d79f6f9d7c67313c113a94
parent 997fee1
2 files changed +20 -17
modified libpkg/pkgdb.c
@@ -126,21 +126,10 @@ pkgdb_match(struct pkgdb *db, const char *pattern)
{
	int matched = 1;

-
	switch (db->match) {
-
		case MATCH_ALL:
-
			matched = 0;
-
			break;
-
		case MATCH_EXACT:
-
			matched = strcmp(pattern, db->pattern);
-
			break;
-
		case MATCH_GLOB:
-
			matched = fnmatch(db->pattern, pattern, 0);
-
			break;
-
		case MATCH_REGEX:
-
		case MATCH_EREGEX:
-
			matched = regexec(&db->re, pattern, 0, NULL, 0);
-
			break;
-
	}
+
	if (db->match == MATCH_GLOB)
+
		matched = fnmatch(db->pattern, pattern, 0);
+
	else if (db->match == MATCH_REGEX || db->match == MATCH_EREGEX)
+
		matched = regexec(&db->re, pattern, 0, NULL, 0);

	return (matched);
}
modified libpkg/pkgdb_cache.c
@@ -64,8 +64,22 @@ pkgdb_cache_getattr(struct pkg *pkg, const char *attr)
int
pkgdb_cache_query(struct pkgdb *db, struct pkg *pkg)
{
+
	const int32_t *idx;
+

+
	/* If we are looking for an exact match, no needs to loop over all entries */
+
	if (db->match == MATCH_EXACT) {
+
		if (db->i == 0 && (idx = pkgdb_cache_vget(db->cdb, "%s", db->pattern)) != NULL) {
+
			pkg->namever = db->pattern;
+
			pkg->idx = *idx;
+
			pkg->pdb = db;
+
			db->i++;
+
			return (0);
+
		} else
+
			return (-1);
+
	}
+

	while ((pkg->namever = pkgdb_cache_vget(db->cdb, PKGDB_NAMEVER, db->i)) != NULL) {
-
		if (pkgdb_match(db, pkg->namever) == 0) {
+
		if (db->match == MATCH_ALL || pkgdb_match(db, pkg->namever) == 0) {
			pkg->idx = db->i++;
			pkg->pdb = db;
			return (0);
@@ -149,7 +163,7 @@ pkgdb_cache_vget(struct cdb *db, const char *fmt, ...)
int
pkgdb_cache_dep(struct pkg *pkg, struct pkg *dep)
{
-
	const size_t *idx;
+
	const int32_t *idx;
	int ret = -1;

	pkg_reset(dep);