From 42ab639bf715cbacb3598b6c42388ba4bbb2d3d4 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 18 Oct 2010 16:39:04 -0500 Subject: Improve database server API Currently we have one call that has all sorts of crazy behavior and doesn't make a whole lot of sense. Go from one method to the normal four methods we have for all of our other lists we use in the library to make it a lot easier for a frontend to manipulate server lists. Signed-off-by: Dan McGee --- lib/libalpm/alpm.h | 15 +++++---- lib/libalpm/db.c | 96 +++++++++++++++++++++++++++++++++++++++++++++--------- src/pacman/conf.c | 2 +- 3 files changed, 89 insertions(+), 24 deletions(-) diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index c4f6cc0f..5af843c4 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -174,7 +174,7 @@ const char *alpm_option_get_dbpath(void); /** Sets the path to the database directory. */ int alpm_option_set_dbpath(const char *dbpath); -/** @name Accessors to the list of package cache directories +/** @name Accessors to the list of package cache directories. * @{ */ alpm_list_t *alpm_option_get_cachedirs(void); @@ -317,13 +317,14 @@ const char *alpm_db_get_name(const pmdb_t *db); */ const char *alpm_db_get_url(const pmdb_t *db); -/** Add a new server for a database. - * An empty string or NULL can be passed to empty the current server list. - * @param db database pointer - * @param url url of the server - * @return 0 on success, -1 on error (pm_errno is set accordingly) +/** @name Accessors to the list of servers for a database. + * @{ */ -int alpm_db_setserver(pmdb_t *db, const char *url); +alpm_list_t *alpm_db_get_servers(const pmdb_t *db); +int alpm_db_set_servers(pmdb_t *db, alpm_list_t *servers); +int alpm_db_add_server(pmdb_t *db, const char *url); +int alpm_db_remove_server(pmdb_t *db, const char *url); +/** @} */ int alpm_db_update(int level, pmdb_t *db); diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 3d593b36..31336144 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -129,35 +129,99 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db) return 0; } +/** Get the serverlist of a database. */ +alpm_list_t SYMEXPORT *alpm_db_get_servers(const pmdb_t *db) +{ + ALPM_LOG_FUNC; + + /* Sanity checks */ + ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL)); + + return(db->servers); +} + /** Set the serverlist of a database. */ -int SYMEXPORT alpm_db_setserver(pmdb_t *db, const char *url) +int SYMEXPORT alpm_db_set_servers(pmdb_t *db, alpm_list_t *servers) +{ + ALPM_LOG_FUNC; + + /* Sanity checks */ + ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1)); + + if(db->servers) FREELIST(db->servers); + db->servers = servers; + return 0; +} + +static char *sanitize_url(const char *url) +{ + char *newurl; + size_t len = strlen(url); + + STRDUP(newurl, url, RET_ERR(PM_ERR_MEMORY, NULL)); + /* strip the trailing slash if one exists */ + if(newurl[len - 1] == '/') { + newurl[len - 1] = '\0'; + } + return newurl; +} + +/** Add a download server to a database. + * @param db database pointer + * @param url url of the server + * @return 0 on success, -1 on error (pm_errno is set accordingly) + */ +int SYMEXPORT alpm_db_add_server(pmdb_t *db, const char *url) { char *newurl; - size_t len = 0; ALPM_LOG_FUNC; /* Sanity checks */ ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1)); + ASSERT(url != NULL && strlen(url) != 0, RET_ERR(PM_ERR_WRONG_ARGS, -1)); - if(url) { - len = strlen(url); + newurl = sanitize_url(url); + if(!newurl) { + return -1; } - if(len) { - newurl = strdup(url); - /* strip the trailing slash if one exists */ - if(newurl[len - 1] == '/') { - newurl[len - 1] = '\0'; - } - db->servers = alpm_list_add(db->servers, newurl); - _alpm_log(PM_LOG_DEBUG, "adding new server URL to database '%s': %s\n", + db->servers = alpm_list_add(db->servers, newurl); + _alpm_log(PM_LOG_DEBUG, "adding new server URL to database '%s': %s\n", + db->treename, newurl); + + return 0; +} + +/** Remove a download server from a database. + * @param db database pointer + * @param url url of the server + * @return 0 on success, 1 on server not present, + * -1 on error (pm_errno is set accordingly) + */ +int SYMEXPORT alpm_db_remove_server(pmdb_t *db, const char *url) +{ + char *newurl, *vdata = NULL; + + ALPM_LOG_FUNC; + + /* Sanity checks */ + ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1)); + ASSERT(url != NULL && strlen(url) != 0, RET_ERR(PM_ERR_WRONG_ARGS, -1)); + + newurl = sanitize_url(url); + if(!newurl) { + return -1; + } + db->servers = alpm_list_remove_str(db->servers, newurl, &vdata); + free(newurl); + if(vdata) { + _alpm_log(PM_LOG_DEBUG, "removed server URL from database '%s': %s\n", db->treename, newurl); - } else { - FREELIST(db->servers); - _alpm_log(PM_LOG_DEBUG, "serverlist flushed for '%s'\n", db->treename); + free(vdata); + return 0; } - return 0; + return 1; } /** Set the verify gpg signature option for a database. * @param db database pointer diff --git a/src/pacman/conf.c b/src/pacman/conf.c index 2ce73b64..4302ad95 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -387,7 +387,7 @@ static int _add_mirror(pmdb_t *db, char *value) server = temp; } - if(alpm_db_setserver(db, server) != 0) { + if(alpm_db_add_server(db, server) != 0) { /* pm_errno is set by alpm_db_setserver */ pm_printf(PM_LOG_ERROR, _("could not add server URL to database '%s': %s (%s)\n"), dbname, server, alpm_strerrorlast()); -- cgit v1.2.3-24-g4f1b