[pacman-dev] [PATCH 3/3] Delay the creation of local and sync db dir.

Xavier Chantry shiningxc at gmail.com
Mon Jan 19 17:05:41 EST 2009


We don't need to create the directories when local or sync dbs are
registered. For example, if a sync db does not exist, we cannot even do
"pacman -Q" as an user..

Instead, we can create the local db if needed during the db_prepare
operation, and sync dbs on db_update.

Also remove some more useless abstractions in db_update and switch to a much
more efficient way to remove a sync db : rm -rf.

Signed-off-by: Xavier Chantry <shiningxc at gmail.com>
---
 lib/libalpm/be_files.c |   40 +++++++++++++++++++++++++++++-----------
 lib/libalpm/db.c       |   26 --------------------------
 2 files changed, 29 insertions(+), 37 deletions(-)

diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c
index 06b25a9..0faed88 100644
--- a/lib/libalpm/be_files.c
+++ b/lib/libalpm/be_files.c
@@ -113,6 +113,26 @@ static int setlastupdate(const pmdb_t *db, time_t time)
 	return(ret);
 }
 
+static int checkdbdir(pmdb_t *db)
+{
+	struct stat buf;
+	char *path = db->path;
+
+	if(stat(path, &buf) != 0) {
+		_alpm_log(PM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n",
+				path);
+		if(_alpm_makepath(path) != 0) {
+			RET_ERR(PM_ERR_SYSTEM, -1);
+		}
+	} else if(!S_ISDIR(buf.st_mode)) {
+		_alpm_log(PM_LOG_WARNING, "removing bogus database: %s\n", path);
+		if(unlink(path) != 0 || _alpm_makepath(path) != 0) {
+			RET_ERR(PM_ERR_SYSTEM, -1);
+		}
+	}
+	return(0);
+}
+
 /** Update a package database
  * @param force if true, then forces the update, otherwise update only in case
  * the database isn't up to date
@@ -122,7 +142,6 @@ static int setlastupdate(const pmdb_t *db, time_t time)
  */
 int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
 {
-	alpm_list_t *lp;
 	char *dbfile, *dbfilepath;
 	time_t newmtime = 0, lastupdate = 0;
 	const char *dbpath;
@@ -176,14 +195,9 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
 		return(-1);
 	} else {
 		/* remove the old dir */
-		_alpm_log(PM_LOG_DEBUG, "flushing database %s\n", db->path);
-		for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) {
-			pmpkg_t *pkg = lp->data;
-			if(pkg && _alpm_db_remove(db, pkg) == -1) {
-				_alpm_log(PM_LOG_ERROR, _("could not remove database entry %s%s\n"),
-						db->treename, pkg->name);
-				RET_ERR(PM_ERR_DB_REMOVE, -1);
-			}
+		if(_alpm_rmrf(db->path) != 0) {
+			_alpm_log(PM_LOG_ERROR, _("could not remove database %s\n"), db->treename);
+			RET_ERR(PM_ERR_DB_REMOVE, -1);
 		}
 
 		/* Cache needs to be rebuilt */
@@ -195,6 +209,7 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
 		sprintf(dbfilepath, "%s%s" DBEXT, dbpath, db->treename);
 
 		/* uncompress the sync database */
+		checkdbdir(db);
 		ret = _alpm_unpack(dbfilepath, db->path, NULL);
 		if(ret) {
 			free(dbfilepath);
@@ -268,7 +283,7 @@ int _alpm_db_populate(pmdb_t *db)
 
 	dbdir = opendir(db->path);
 	if(dbdir == NULL) {
-		RET_ERR(PM_ERR_DB_OPEN, -1);
+		return(0);
 	}
 	while((ent = readdir(dbdir)) != NULL) {
 		const char *name = ent->d_name;
@@ -634,8 +649,11 @@ int _alpm_db_prepare(pmdb_t *db, pmpkg_t *info)
 	int retval = 0;
 	char *pkgpath = NULL;
 
-	oldmask = umask(0000);
+	if(checkdbdir(db) != 0) {
+		return(-1);
+	}
 
+	oldmask = umask(0000);
 	pkgpath = get_pkgpath(db, info);
 
 	if((retval = mkdir(pkgpath, 0755)) != 0) {
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index a639b1f..561967c 100644
--- a/lib/libalpm/db.c
+++ b/lib/libalpm/db.c
@@ -428,10 +428,8 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 
 pmdb_t *_alpm_db_register_local(void)
 {
-	struct stat buf;
 	pmdb_t *db;
 	const char *dbpath;
-	char path[PATH_MAX];
 
 	ALPM_LOG_FUNC;
 
@@ -442,21 +440,11 @@ pmdb_t *_alpm_db_register_local(void)
 
 	_alpm_log(PM_LOG_DEBUG, "registering local database\n");
 
-	/* make sure the database directory exists */
 	dbpath = alpm_option_get_dbpath();
 	if(!dbpath) {
 		_alpm_log(PM_LOG_ERROR, _("database path is undefined\n"));
 			RET_ERR(PM_ERR_DB_OPEN, NULL);
 	}
-	snprintf(path, PATH_MAX, "%slocal", dbpath);
-	/* TODO this is rediculous, we try to do this even if we can't */
-	if(stat(path, &buf) != 0 || !S_ISDIR(buf.st_mode)) {
-		_alpm_log(PM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n",
-				path);
-		if(_alpm_makepath(path) != 0) {
-			RET_ERR(PM_ERR_SYSTEM, NULL);
-		}
-	}
 
 	db = _alpm_db_new(dbpath, "local");
 	if(db == NULL) {
@@ -469,7 +457,6 @@ pmdb_t *_alpm_db_register_local(void)
 
 pmdb_t *_alpm_db_register_sync(const char *treename)
 {
-	struct stat buf;
 	pmdb_t *db;
 	const char *dbpath;
 	char path[PATH_MAX];
@@ -487,25 +474,12 @@ pmdb_t *_alpm_db_register_sync(const char *treename)
 
 	_alpm_log(PM_LOG_DEBUG, "registering sync database '%s'\n", treename);
 
-	/* make sure the database directory exists */
 	dbpath = alpm_option_get_dbpath();
 	if(!dbpath) {
 		_alpm_log(PM_LOG_ERROR, _("database path is undefined\n"));
 			RET_ERR(PM_ERR_DB_OPEN, NULL);
 	}
 	/* all sync DBs now reside in the sync/ subdir of the dbpath */
-	snprintf(path, PATH_MAX, "%ssync/%s", dbpath, treename);
-	/* TODO this is rediculous, we try to do this even if we can't */
-	if(stat(path, &buf) != 0 || !S_ISDIR(buf.st_mode)) {
-		_alpm_log(PM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n",
-				path);
-		if(_alpm_makepath(path) != 0) {
-			RET_ERR(PM_ERR_SYSTEM, NULL);
-		}
-	}
-
-	/* Ensure the db gets the real path. */
-	path[0] = '\0';
 	snprintf(path, PATH_MAX, "%ssync/", dbpath);
 
 	db = _alpm_db_new(path, treename);
-- 
1.6.1



More information about the pacman-dev mailing list