summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Chantry <shiningxc@gmail.com>2009-01-19 22:54:00 +0100
committerXavier Chantry <shiningxc@gmail.com>2009-01-20 14:07:15 +0100
commit34e1413d756269dcd71a32dd5d2dbb263a943051 (patch)
treef3bce1b380c1c2fceb23a8b2968b4a75c4bbd732
parent14230869e6a37526f8a1bdb1fb88f23309b10aef (diff)
Delay the creation of local and sync db dir.
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@gmail.com>
-rw-r--r--lib/libalpm/be_files.c43
-rw-r--r--lib/libalpm/db.c26
2 files changed, 31 insertions, 38 deletions
diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c
index 06b25a94..0765b8db 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,12 +649,16 @@ 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) {
- _alpm_log(PM_LOG_ERROR, _("could not create directory %s: %s\n"), pkgpath, strerror(errno));
+ _alpm_log(PM_LOG_ERROR, _("could not create directory %s: %s\n"),
+ pkgpath, strerror(errno));
}
free(pkgpath);
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index a639b1fb..561967ce 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);