summaryrefslogtreecommitdiffstats
path: root/src/database.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/database.c')
-rw-r--r--src/database.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/database.c b/src/database.c
index 996738e..cce1b0c 100644
--- a/src/database.c
+++ b/src/database.c
@@ -101,6 +101,7 @@ static const struct apk_hash_ops dir_hash_ops = {
};
struct apk_db_file_hash_key {
+ unsigned long dirhash;
apk_blob_t dirname;
apk_blob_t filename;
};
@@ -109,16 +110,14 @@ static unsigned long apk_db_file_hash_key(apk_blob_t _key)
{
struct apk_db_file_hash_key *key = (struct apk_db_file_hash_key *) _key.ptr;
- return apk_blob_hash(key->dirname) ^
- apk_blob_hash(key->filename);
+ return apk_blob_hash_seed(key->filename, key->dirhash);
}
static unsigned long apk_db_file_hash_item(apk_hash_item item)
{
struct apk_db_file *dbf = (struct apk_db_file *) item;
- return apk_blob_hash(APK_BLOB_STR(dbf->diri->dir->dirname)) ^
- apk_blob_hash(APK_BLOB_STR(dbf->filename));
+ return apk_blob_hash_seed(APK_BLOB_STR(dbf->filename), dbf->diri->dir->hash);
}
static int apk_db_file_compare_item(apk_hash_item item, apk_blob_t _key)
@@ -127,6 +126,9 @@ static int apk_db_file_compare_item(apk_hash_item item, apk_blob_t _key)
struct apk_db_file_hash_key *key = (struct apk_db_file_hash_key *) _key.ptr;
int r;
+ if (key->dirhash != dbf->diri->dir->hash)
+ return key->dirhash - dbf->diri->dir->hash;
+
r = apk_blob_compare(key->dirname, APK_BLOB_STR(dbf->diri->dir->dirname));
if (r != 0)
return r;
@@ -150,8 +152,9 @@ struct apk_name *apk_db_query_name(struct apk_database *db, apk_blob_t name)
struct apk_name *apk_db_get_name(struct apk_database *db, apk_blob_t name)
{
struct apk_name *pn;
+ unsigned long hash = apk_hash_from_key(&db->available.names, name);
- pn = apk_db_query_name(db, name);
+ pn = (struct apk_name *) apk_hash_get_hashed(&db->available.names, name, hash);
if (pn != NULL)
return pn;
@@ -161,7 +164,7 @@ struct apk_name *apk_db_get_name(struct apk_database *db, apk_blob_t name)
pn->name = apk_blob_cstr(name);
pn->id = db->name_id++;
- apk_hash_insert(&db->available.names, pn);
+ apk_hash_insert_hashed(&db->available.names, pn, hash);
return pn;
}
@@ -195,12 +198,13 @@ static struct apk_db_dir *apk_db_dir_get(struct apk_database *db,
{
struct apk_db_dir *dir;
apk_blob_t bparent;
+ unsigned long hash = apk_hash_from_key(&db->installed.dirs, name);
int i;
if (name.len && name.ptr[name.len-1] == '/')
name.len--;
- dir = apk_db_dir_query(db, name);
+ dir = (struct apk_db_dir *) apk_hash_get_hashed(&db->installed.dirs, name, hash);
if (dir != NULL)
return apk_db_dir_ref(dir);
@@ -210,7 +214,8 @@ static struct apk_db_dir *apk_db_dir_get(struct apk_database *db,
dir->refs = 1;
memcpy(dir->dirname, name.ptr, name.len);
dir->dirname[name.len] = 0;
- apk_hash_insert(&db->installed.dirs, dir);
+ dir->hash = apk_blob_hash(APK_BLOB_STR(dir->dirname));
+ apk_hash_insert_hashed(&db->installed.dirs, dir, hash);
if (name.len == 0)
dir->parent = NULL;
@@ -286,6 +291,7 @@ struct apk_db_file *apk_db_file_query(struct apk_database *db,
struct apk_db_file_hash_key key;
key = (struct apk_db_file_hash_key) {
+ .dirhash = apk_blob_hash(dir),
.dirname = dir,
.filename = name,
};