From 54f6a1cb12c7e980eac903d4e6af4fe6e7e6b125 Mon Sep 17 00:00:00 2001
From: Aurelien Foret <aurelien@archlinux.org>
Date: Tue, 3 May 2005 17:43:02 +0000
Subject: make use of the new list_remove implementation

---
 lib/libalpm/alpm.c   | 19 ++++++++++++-------
 lib/libalpm/cache.c  | 40 ++++++++++++++++++++++------------------
 lib/libalpm/cache.h  |  2 +-
 lib/libalpm/remove.c | 19 +++++++++++--------
 4 files changed, 46 insertions(+), 34 deletions(-)

(limited to 'lib')

diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c
index 31cfbc56..6c79c30b 100644
--- a/lib/libalpm/alpm.c
+++ b/lib/libalpm/alpm.c
@@ -193,9 +193,15 @@ pmdb_t *alpm_db_register(char *treename)
 	return(db);
 }
 
+/* Helper function for comparing databases
+ */
+static int db_cmp(const void *db1, const void *db2)
+{
+	return(strcmp(((pmdb_t *)db1)->treename, ((pmdb_t *)db2)->treename));
+}
+
 int alpm_db_unregister(pmdb_t *db)
 {
-	PMList *i;
 	int found = 0;
 
 	/* Sanity checks */
@@ -207,12 +213,11 @@ int alpm_db_unregister(pmdb_t *db)
 		handle->db_local = NULL;
 		found = 1;
 	} else {
-		for(i = handle->dbs_sync; i && !found; i = i->next) {
-			if(db == i->data) {
-				db_close(i->data);
-				handle->dbs_sync = _alpm_list_remove(handle->dbs_sync, i);
-				found = 1;
-			}
+		void *data;
+		handle->dbs_sync = _alpm_list_remove(handle->dbs_sync, db, db_cmp, &data);
+		if(data) {
+			db_close(data);
+			found = 1;
 		}
 	}
 
diff --git a/lib/libalpm/cache.c b/lib/libalpm/cache.c
index f8942002..31257c08 100644
--- a/lib/libalpm/cache.c
+++ b/lib/libalpm/cache.c
@@ -36,12 +36,20 @@
 #include "db.h"
 #include "cache.h"
 
+/* Helper function for comparing packages
+ */
+static int pkg_cmp(const void *p1, const void *p2)
+{
+	return(strcmp(((pmpkg_t *)p1)->name, ((pmpkg_t *)p2)->name));
+}
+
 /* Returns a new package cache from db.
  * It frees the cache if it already exists.
  */
 int db_load_pkgcache(pmdb_t *db)
 {
 	pmpkg_t *info;
+	unsigned char infolevel = INFRQ_DESC|INFRQ_DEPENDS;
 
 	if(db == NULL) {
 		return(-1);
@@ -49,10 +57,11 @@ int db_load_pkgcache(pmdb_t *db)
 
 	db_free_pkgcache(db);
 
-	_alpm_log(PM_LOG_DEBUG, "loading package cache for repository \"%s\"", db->treename);
+	_alpm_log(PM_LOG_DEBUG, "loading package cache (infolevel=%#x) for repository '%s'",
+	                        infolevel, db->treename);
 
 	db_rewind(db);
-	while((info = db_scan(db, NULL, INFRQ_DESC|INFRQ_DEPENDS)) != NULL) {
+	while((info = db_scan(db, NULL, infolevel)) != NULL) {
 		info->origin = PKG_FROM_CACHE;
 		info->data = db;
 		/* add to the collective */
@@ -100,7 +109,7 @@ int db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
 	if(newpkg == NULL) {
 		return(-1);
 	}
-	_alpm_log(PM_LOG_DEBUG, "adding entry %s in \"%s\" cache", newpkg->name, db->treename);
+	_alpm_log(PM_LOG_DEBUG, "adding entry %s in '%s' cache", newpkg->name, db->treename);
 	db->pkgcache = pm_list_add_sorted(db->pkgcache, newpkg, pkg_cmp);
 
 	db_free_grpcache(db);
@@ -108,29 +117,24 @@ int db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
 	return(0);
 }
 
-int db_remove_pkgfromcache(pmdb_t *db, char *name)
+int db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg)
 {
-	PMList *i;
-	int found = 0;
+	pmpkg_t *data;
 
-	if(db == NULL || name == NULL || strlen(name) == 0) {
+	if(db == NULL || pkg == NULL) {
 		return(-1);
 	}
 
-	for(i = db->pkgcache; i && !found; i = i->next) {
-		if(strcmp(((pmpkg_t *)i->data)->name, name) == 0) {
-			_alpm_log(PM_LOG_DEBUG, "removing entry %s from \"%s\" cache", name, db->treename);
-			db->pkgcache = _alpm_list_remove(db->pkgcache, i);
-			/* ORE
-			MLK: list_remove() does not free properly an entry from a packages list */
-			found = 1;
-		}
-	}
+	db->pkgcache = _alpm_list_remove(db->pkgcache, pkg, pkg_cmp, (void **)&data);
 
-	if(!found) {
+	if(data == NULL) {
+		/* package not found */
 		return(-1);
 	}
 
+	_alpm_log(PM_LOG_DEBUG, "removing entry %s from '%s' cache", pkg->name, db->treename);
+	FREEPKG(data);
+
 	db_free_grpcache(db);
 
 	return(0);
@@ -170,7 +174,7 @@ int db_load_grpcache(pmdb_t *db)
 		db_load_pkgcache(db);
 	}
 
-	_alpm_log(PM_LOG_DEBUG, "loading group cache for repository \"%s\"", db->treename);
+	_alpm_log(PM_LOG_DEBUG, "loading group cache for repository '%s'", db->treename);
 
 	for(lp = db->pkgcache; lp; lp = lp->next) {
 		PMList *i;
diff --git a/lib/libalpm/cache.h b/lib/libalpm/cache.h
index 805d5d30..e187ec93 100644
--- a/lib/libalpm/cache.h
+++ b/lib/libalpm/cache.h
@@ -30,7 +30,7 @@
 int db_load_pkgcache(pmdb_t *db);
 void db_free_pkgcache(pmdb_t *db);
 int db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg);
-int db_remove_pkgfromcache(pmdb_t *db, char *name);
+int db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg);
 PMList *db_get_pkgcache(pmdb_t *db);
 pmpkg_t *db_get_pkgfromcache(pmdb_t *db, char *target);
 /* groups */
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index e42035ee..a4fd59dd 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -125,6 +125,13 @@ int remove_prepare(pmtrans_t *trans, pmdb_t *db, PMList **data)
 	return(0);
 }
 
+/* Helper function for comparing strings
+ */
+static int str_cmp(const void *s1, const void *s2)
+{
+	return(strcmp(s1, s2));
+}
+
 int remove_commit(pmtrans_t *trans, pmdb_t *db)
 {
 	pmpkg_t *info;
@@ -222,16 +229,16 @@ int remove_commit(pmtrans_t *trans, pmdb_t *db)
 		if(db_remove(db, info) == -1) {
 			_alpm_log(PM_LOG_ERROR, "could not remove database entry %s/%s-%s", db->treename, info->name, info->version);
 		}
-		if(db_remove_pkgfromcache(db, info->name) == -1) {
+		if(db_remove_pkgfromcache(db, info) == -1) {
 			_alpm_log(PM_LOG_ERROR, "could not remove entry %s from cache", info->name);
 		}
 
 		/* update dependency packages' REQUIREDBY fields */
 		_alpm_log(PM_LOG_FLOW2, "updating dependency packages 'requiredby' fields");
 		for(lp = info->depends; lp; lp = lp->next) {
-			PMList *j;
 			pmpkg_t *depinfo = NULL;
 			pmdepend_t depend;
+			void *ptr;
 
 			if(splitdep((char*)lp->data, &depend)) {
 				continue;
@@ -257,12 +264,8 @@ int remove_commit(pmtrans_t *trans, pmdb_t *db)
 				}
 			}
 			/* splice out this entry from requiredby */
-			for(j = depinfo->requiredby; j; j = j->next) {
-				if(!strcmp((char*)j->data, info->name)) {
-					depinfo->requiredby = _alpm_list_remove(depinfo->requiredby, j);
-					break;
-				}
-			}
+			depinfo->requiredby = _alpm_list_remove(depinfo->requiredby, info->name, str_cmp, &ptr);
+			FREE(ptr);
 			_alpm_log(PM_LOG_DEBUG, "updating 'requiredby' field for package %s", depinfo->name);
 			if(db_write(db, depinfo, INFRQ_DEPENDS)) {
 				_alpm_log(PM_LOG_ERROR, "could not update 'requiredby' database entry %s/%s-%s", db->treename, depinfo->name, depinfo->version);
-- 
cgit v1.2.3-70-g09d2