Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Store files has a hash table
Baptiste Daroussin committed 13 years ago
commit 188a4e8a933e532cb8eed3b185180dfe73ee13f3
parent 20f5ac9
2 files changed +29 -8
modified libpkg/pkg.c
@@ -73,7 +73,7 @@ pkg_new(struct pkg **pkg, pkg_t type)
	STAILQ_INIT(&(*pkg)->categories);
	STAILQ_INIT(&(*pkg)->deps);
	STAILQ_INIT(&(*pkg)->rdeps);
-
	STAILQ_INIT(&(*pkg)->files);
+
	(*pkg)->files = NULL;
	STAILQ_INIT(&(*pkg)->dirs);
	STAILQ_INIT(&(*pkg)->options);
	STAILQ_INIT(&(*pkg)->users);
@@ -390,6 +390,17 @@ pkg_set_from_file(struct pkg *pkg, pkg_attr attr, const char *path)
			return (EPKG_OK); \
	} while (0)

+
#define HASH_NEXT(hash, data) do {            \
+
		if (data == NULL)             \
+
			data = hash;          \
+
		else                          \
+
			data = data->hh.next; \
+
		if (data == NULL)             \
+
			return (EPKG_END);    \
+
		else                          \
+
			return (EPKG_OK);     \
+
	} while (0)
+

int
pkg_licenses(struct pkg *pkg, struct pkg_license **l)
{
@@ -435,7 +446,7 @@ pkg_files(struct pkg *pkg, struct pkg_file **f)
{
	assert(pkg != NULL);

-
	PKG_LIST_NEXT(&pkg->files, *f);
+
	HASH_NEXT(pkg->files, (*f));
}

int
@@ -659,7 +670,7 @@ pkg_addfile_attr(struct pkg *pkg, const char *path, const char *sha256, const ch
	if (perm != 0)
		f->perm = perm;

-
	STAILQ_INSERT_TAIL(&pkg->files, f, next);
+
	HASH_ADD_STR(pkg->files, path, f);

	return (EPKG_OK);
}
@@ -878,7 +889,7 @@ pkg_list_is_empty(struct pkg *pkg, pkg_list list) {
	case PKG_CATEGORIES:
		return (STAILQ_EMPTY(&pkg->categories));
	case PKG_FILES:
-
		return (STAILQ_EMPTY(&pkg->files));
+
		return (HASH_COUNT(pkg->files) == 0 ? 1 : 0);
	case PKG_DIRS:
		return (STAILQ_EMPTY(&pkg->dirs));
	case PKG_USERS:
@@ -898,7 +909,6 @@ pkg_list_free(struct pkg *pkg, pkg_list list) {
	struct pkg_option *o;
	struct pkg_license *l;
	struct pkg_category *c;
-
	struct pkg_file *f;
	struct pkg_dir *dir;
	struct pkg_user *u;
	struct pkg_group *g;
@@ -926,7 +936,7 @@ pkg_list_free(struct pkg *pkg, pkg_list list) {
		pkg->flags &= ~PKG_LOAD_CATEGORIES;
		break;
	case PKG_FILES:
-
		LIST_FREE(&pkg->files, f, pkg_file_free);
+
		HASH_FREE(pkg->files, pkg_file, pkg_file_free);
		pkg->flags &= ~PKG_LOAD_FILES;
		break;
	case PKG_DIRS:
modified libpkg/private/pkg.h
@@ -37,6 +37,7 @@
#include <sqlite3.h>
#include <openssl/sha.h>
#include <stdbool.h>
+
#include <uthash.h>

#include "private/utils.h"

@@ -47,6 +48,16 @@
		ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_ACL | \
		ARCHIVE_EXTRACT_FFLAGS|ARCHIVE_EXTRACT_XATTR)

+
#define HASH_FREE(data, type, free_func) do {      \
+
	struct type *hf1, *hf2;                    \
+
	HASH_ITER(hh, data, hf1, hf2) {            \
+
		HASH_DEL(data, hf1);               \
+
		if (free_func != NULL)             \
+
			free_func(hf1);           \
+
	}                                          \
+
	data = NULL;                               \
+
} while (0)
+

#define LIST_FREE(head, data, free_func) do { \
	while (!STAILQ_EMPTY(head)) { \
		data = STAILQ_FIRST(head); \
@@ -66,7 +77,7 @@ struct pkg {
	STAILQ_HEAD(licenses, pkg_license) licenses;
	STAILQ_HEAD(deps, pkg_dep) deps;
	STAILQ_HEAD(rdeps, pkg_dep) rdeps;
-
	STAILQ_HEAD(files, pkg_file) files;
+
	struct pkg_file *files;
	STAILQ_HEAD(dirs, pkg_dir) dirs;
	STAILQ_HEAD(options, pkg_option) options;
	STAILQ_HEAD(users, pkg_user) users;
@@ -104,7 +115,7 @@ struct pkg_file {
	char		 gname[MAXLOGNAME +1];
	int		 keep;
	mode_t		 perm;
-
	STAILQ_ENTRY(pkg_file) next;
+
	UT_hash_handle	 hh;
};

struct pkg_dir {