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 <dan@archlinux.org>
This commit is contained in:
Dan McGee 2010-10-18 16:39:04 -05:00
parent 3045f09ef4
commit 42ab639bf7
3 changed files with 91 additions and 26 deletions

View File

@ -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);

View File

@ -129,36 +129,100 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db)
return 0;
}
/** Set the serverlist of a database. */
int SYMEXPORT alpm_db_setserver(pmdb_t *db, const char *url)
/** Get the serverlist of a database. */
alpm_list_t SYMEXPORT *alpm_db_get_servers(const pmdb_t *db)
{
char *newurl;
size_t len = 0;
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_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(url) {
len = strlen(url);
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';
}
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->treename, newurl);
} else {
FREELIST(db->servers);
_alpm_log(PM_LOG_DEBUG, "serverlist flushed for '%s'\n", db->treename);
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;
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_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);
free(vdata);
return 0;
}
return 1;
}
/** Set the verify gpg signature option for a database.
* @param db database pointer
* @param verify enum pgp_verify_t

View File

@ -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());