summaryrefslogtreecommitdiff
path: root/lib/libalpm/db.c
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-06-07 20:42:15 -0500
committerDan McGee <dan@archlinux.org>2011-06-24 03:46:12 -0500
commit79e98316ea89486d107466858543e965bcfbb0a9 (patch)
treee22572124cffc7275a200e4964c4ea112457fa52 /lib/libalpm/db.c
parent1150d9e15aaea2ae1f259995d11442f491ef0af7 (diff)
downloadpacman-79e98316ea89486d107466858543e965bcfbb0a9.tar.xz
Add a 'valid' flag to the database object
Start by converting all of our flags to a 'status' bitmask (pkgcache status, grpcache status). Add a new 'valid' flag as well. This will let us keep track if the database itself has been marked valid in whatever fashion. For local databases at the moment we ensure there are no depends files; for sync databases we ensure the PGP signature is valid if required/requested. The loading of the pkgcache is prohibited if the database is invalid. Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/db.c')
-rw-r--r--lib/libalpm/db.c49
1 files changed, 26 insertions, 23 deletions
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index 820261a1..b20421a3 100644
--- a/lib/libalpm/db.c
+++ b/lib/libalpm/db.c
@@ -468,11 +468,8 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
/* Returns a new package cache from db.
* It frees the cache if it already exists.
*/
-int _alpm_db_load_pkgcache(pmdb_t *db)
+static int load_pkgcache(pmdb_t *db)
{
- if(db == NULL) {
- return -1;
- }
_alpm_db_free_pkgcache(db);
_alpm_log(db->handle, PM_LOG_DEBUG, "loading package cache for repository '%s'\n",
@@ -483,23 +480,23 @@ int _alpm_db_load_pkgcache(pmdb_t *db)
return -1;
}
- db->pkgcache_loaded = 1;
+ db->status |= DB_STATUS_PKGCACHE;
return 0;
}
void _alpm_db_free_pkgcache(pmdb_t *db)
{
- if(db == NULL || !db->pkgcache_loaded) {
+ if(db == NULL || !(db->status & DB_STATUS_PKGCACHE)) {
return;
}
- _alpm_log(db->handle, PM_LOG_DEBUG, "freeing package cache for repository '%s'\n",
- db->treename);
+ _alpm_log(db->handle, PM_LOG_DEBUG,
+ "freeing package cache for repository '%s'\n", db->treename);
alpm_list_free_inner(_alpm_db_get_pkgcache(db),
(alpm_list_fn_free)_alpm_pkg_free);
_alpm_pkghash_free(db->pkgcache);
- db->pkgcache_loaded = 0;
+ db->status &= ~DB_STATUS_PKGCACHE;
_alpm_db_free_grpcache(db);
}
@@ -510,8 +507,12 @@ pmpkghash_t *_alpm_db_get_pkgcache_hash(pmdb_t *db)
return NULL;
}
- if(!db->pkgcache_loaded) {
- _alpm_db_load_pkgcache(db);
+ if(!(db->status & DB_STATUS_VALID)) {
+ RET_ERR(db->handle, PM_ERR_DB_INVALID, NULL);
+ }
+
+ if(!(db->status & DB_STATUS_PKGCACHE)) {
+ load_pkgcache(db);
}
return db->pkgcache;
@@ -533,7 +534,7 @@ int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
{
pmpkg_t *newpkg;
- if(db == NULL || !db->pkgcache_loaded || pkg == NULL) {
+ if(db == NULL || pkg == NULL || !(db->status & DB_STATUS_PKGCACHE)) {
return -1;
}
@@ -555,7 +556,7 @@ int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg)
{
pmpkg_t *data = NULL;
- if(db == NULL || !db->pkgcache_loaded || pkg == NULL) {
+ if(db == NULL || pkg == NULL || !(db->status & DB_STATUS_PKGCACHE)) {
return -1;
}
@@ -585,8 +586,6 @@ pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target)
pmpkghash_t *pkgcache = _alpm_db_get_pkgcache_hash(db);
if(!pkgcache) {
- _alpm_log(db->handle, PM_LOG_DEBUG, "warning: failed to get '%s' from NULL pkgcache\n",
- target);
return NULL;
}
@@ -595,7 +594,7 @@ pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target)
/* Returns a new group cache from db.
*/
-int _alpm_db_load_grpcache(pmdb_t *db)
+static int load_grpcache(pmdb_t *db)
{
alpm_list_t *lp;
@@ -641,7 +640,7 @@ int _alpm_db_load_grpcache(pmdb_t *db)
}
}
- db->grpcache_loaded = 1;
+ db->status |= DB_STATUS_GRPCACHE;
return 0;
}
@@ -649,19 +648,19 @@ void _alpm_db_free_grpcache(pmdb_t *db)
{
alpm_list_t *lg;
- if(db == NULL || !db->grpcache_loaded) {
+ if(db == NULL || !(db->status & DB_STATUS_GRPCACHE)) {
return;
}
- _alpm_log(db->handle, PM_LOG_DEBUG, "freeing group cache for repository '%s'\n",
- db->treename);
+ _alpm_log(db->handle, PM_LOG_DEBUG,
+ "freeing group cache for repository '%s'\n", db->treename);
for(lg = db->grpcache; lg; lg = lg->next) {
_alpm_grp_free(lg->data);
lg->data = NULL;
}
FREELIST(db->grpcache);
- db->grpcache_loaded = 0;
+ db->status &= ~DB_STATUS_GRPCACHE;
}
alpm_list_t *_alpm_db_get_grpcache(pmdb_t *db)
@@ -670,8 +669,12 @@ alpm_list_t *_alpm_db_get_grpcache(pmdb_t *db)
return NULL;
}
- if(!db->grpcache_loaded) {
- _alpm_db_load_grpcache(db);
+ if(!(db->status & DB_STATUS_VALID)) {
+ RET_ERR(db->handle, PM_ERR_DB_INVALID, NULL);
+ }
+
+ if(!(db->status & DB_STATUS_GRPCACHE)) {
+ load_grpcache(db);
}
return db->grpcache;