On Fri, 24 Aug 2007 22:40:41 -0400 Travis Willard <travis@archlinux.org> wrote:
Here's the quick-and-dirty version of moving repos to $DBPATH/sync/$REPO.
I don't much like it, to be honest - I'd prefer to separate the concept of the local repo from the sync repos entirely
And here's my patch to do this. Read the comment for details - I think I was specific enough there. From 7d9c73eda546195a0a207be8b264219184929712 Mon Sep 17 00:00:00 2001 From: Travis Willard <travis@archlinux.org> Date: Sun, 26 Aug 2007 12:00:03 -0400 Subject: [PATCH] Clean way to separate local from sync dbs. Introduce two new methods into the API - alpm_syncdb_register and alpm_localdb_register, which replace the functionality of alpm_db_register. which has now been flagged as deprecated. localdb_register always returns the local DB, and syncdb_register will always try to register a sync DB. This removes the silly limitation that a sync DB couldn't be named 'local', along with structurally separating sync DBs and the local DB in the filesystem. Also updated the pacman frontend to use the new functions. Signed-off-by: Travis Willard <travis@archlinux.org> --- lib/libalpm/alpm.h | 8 ++++++- lib/libalpm/db.c | 56 +++++++++++++++++++++++++++++++++++++++++++------- lib/libalpm/db.h | 9 +++++++- src/pacman/pacman.c | 10 +------- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 844d9bf..74d6102 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -31,6 +31,8 @@ extern "C" { #include <time.h> /* for time_t */ #include <stdarg.h> /* for va_list */ +#define DEPRECATED __attribute__((deprecated)) + /* * Arch Linux Package Management library */ @@ -143,7 +145,11 @@ alpm_list_t *alpm_option_get_syncdbs(); * Databases */ -pmdb_t *alpm_db_register(const char *treename); +/* Deprecated interface alpm_db_register */ +pmdb_t DEPRECATED *alpm_db_register(const char *treename); +/* Preferred interfaces localdb_register and syncdb_register */ +pmdb_t *alpm_localdb_register(); +pmdb_t *alpm_syncdb_register(const char *treename); int alpm_db_unregister(pmdb_t *db); int alpm_db_unregister_all(void); diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 6bc85b7..dac1959 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -53,8 +53,8 @@ * @{ */ -/** Register a package database - * @param treename the name of the repository +/** Register a package database (deprecated) + * @param treename the name of the sync repository or "local" for the local DB * @return a pmdb_t* on success (the value), NULL on error */ pmdb_t SYMEXPORT *alpm_db_register(const char *treename) @@ -67,9 +67,42 @@ pmdb_t SYMEXPORT *alpm_db_register(const char *treename) /* Do not register a database if a transaction is on-going */ ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, NULL)); - return(_alpm_db_register(treename)); + return(_alpm_db_register(treename, DB_REGISTER_OLD_BEHAVIOUR)); } +/** Register a sync-database of packages. + * @param treename the name of the sync repository + * @return a pmdb_t* on success (the value), NULL on error + */ +pmdb_t SYMEXPORT *alpm_syncdb_register(const char *treename) +{ + ALPM_LOG_FUNC; + + /* Sanity checks */ + ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, NULL)); + ASSERT(treename != NULL && strlen(treename) != 0, RET_ERR(PM_ERR_WRONG_ARGS, NULL)); + /* Do not register a database if a transaction is on-going */ + ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, NULL)); + + return(_alpm_db_register(treename, DB_REGISTER_SYNC_DB)); +} + +/** Register the local package database + * @return a pmdb_t* representing the local database, or NULL on error + */ +pmdb_t SYMEXPORT *alpm_localdb_register() +{ + ALPM_LOG_FUNC; + + /* Sanity checks */ + ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, NULL)); + /* Do not register a database if a transaction is on-going */ + ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, NULL)); + + return(_alpm_db_register("local", DB_REGISTER_LOCAL_DB)); +} + + /* Helper function for alpm_db_unregister{_all} */ static void _alpm_db_unregister(pmdb_t *db) { @@ -690,7 +723,7 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles) return(ret); } -pmdb_t *_alpm_db_register(const char *treename) +pmdb_t *_alpm_db_register(const char *treename, pmdbregtype_t type) { struct stat buf; pmdb_t *db; @@ -701,10 +734,16 @@ pmdb_t *_alpm_db_register(const char *treename) ALPM_LOG_FUNC; - if(strcmp(treename, "local") == 0) { + if(type == DB_REGISTER_LOCAL_DB || + (type == DB_REGISTER_OLD_BEHAVIOUR && strcmp(treename, "local") == 0)) { + if(handle->db_local != NULL) { - _alpm_log(PM_LOG_WARNING, _("attempt to re-register the 'local' DB")); - RET_ERR(PM_ERR_DB_NOT_NULL, NULL); + if (type == DB_REGISTER_OLD_BEHAVIOUR) { + _alpm_log(PM_LOG_WARNING, _("attempt to re-register the 'local' DB")); + RET_ERR(PM_ERR_DB_NOT_NULL, NULL); + } else { + return handle->db_local; + } } local = 1; } else { @@ -717,9 +756,10 @@ pmdb_t *_alpm_db_register(const char *treename) } } local = 0; + } - _alpm_log(PM_LOG_DEBUG, "registering database '%s'", treename); + _alpm_log(PM_LOG_DEBUG, "registering %s database '%s'", local?"local":"sync", treename); /* make sure the database directory exists */ dbpath = alpm_option_get_dbpath(); diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h index 2597c8c..be895f2 100644 --- a/lib/libalpm/db.h +++ b/lib/libalpm/db.h @@ -37,6 +37,13 @@ typedef enum _pmdbinfrq_t { INFRQ_ALL = 0x1F } pmdbinfrq_t; +/* Register functionality. */ +typedef enum _pmdbregtype_t { + DB_REGISTER_OLD_BEHAVIOUR = 0x1, + DB_REGISTER_SYNC_DB = 0x2, + DB_REGISTER_LOCAL_DB = 0x3 +} pmdbregtype_t; + /* Database */ struct __pmdb_t { char *path; @@ -52,7 +59,7 @@ pmdb_t *_alpm_db_new(const char *dbpath, const char *treename); void _alpm_db_free(pmdb_t *db); int _alpm_db_cmp(const void *db1, const void *db2); alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles); -pmdb_t *_alpm_db_register(const char *treename); +pmdb_t *_alpm_db_register(const char *treename, pmdbregtype_t type); /* be.c, backend specific calls */ int _alpm_db_install(pmdb_t *db, const char *dbfile); diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 31302ab..ac4f6c5 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -495,15 +495,9 @@ static int _parseconfig(const char *file, const char *givensection, file, linenum); return(1); } - /* a section/database named local is not allowed */ - if(!strcmp(section, "local")) { - pm_printf(PM_LOG_ERROR, _("config file %s, line %d: 'local' cannot be used as section name.\n"), - file, linenum); - return(1); - } /* if we are not looking at the options section, register a db */ if(strcmp(section, "options") != 0) { - db = alpm_db_register(section); + db = alpm_syncdb_register(section); } } else { /* directive */ @@ -811,7 +805,7 @@ int main(int argc, char *argv[]) } /* Opening local database */ - db_local = alpm_db_register("local"); + db_local = alpm_localdb_register(); if(db_local == NULL) { pm_printf(PM_LOG_ERROR, _("could not register 'local' database (%s)\n"), alpm_strerror(pm_errno)); -- 1.5.2.5