diff options
author | Dan McGee <dan@archlinux.org> | 2010-07-11 04:06:21 +0200 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2010-10-13 15:53:18 +0200 |
commit | efbae3cfcbd8e401084cb26853bbe46120daea4d (patch) | |
tree | 9d7ff7e81cc425b0b8fcb9479042c860a559836f | |
parent | 522ef5e981580a52ee0ffa37178d7ddf116ebd51 (diff) | |
download | pacman-efbae3cfcbd8e401084cb26853bbe46120daea4d.tar.gz pacman-efbae3cfcbd8e401084cb26853bbe46120daea4d.tar.xz |
Initial hack at a DB operations struct
It doesn't do a whole lot yet, but these type of operations will
potentially be different for the DBs we load.
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | lib/libalpm/be_files.c | 2 | ||||
-rw-r--r-- | lib/libalpm/db.c | 23 | ||||
-rw-r--r-- | lib/libalpm/db.h | 11 |
3 files changed, 29 insertions, 7 deletions
diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index 97ba1c8a..5766a4b1 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -367,7 +367,7 @@ int _alpm_db_load_pkgcache(pmdb_t *db) _alpm_log(PM_LOG_DEBUG, "loading package cache for repository '%s'\n", db->treename); - if(_alpm_db_populate(db) == -1) { + if(db->ops->populate(db) == -1) { _alpm_log(PM_LOG_DEBUG, "failed to load package cache for repository '%s'\n", db->treename); return(-1); diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 0b43f9fa..7b54a576 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -42,6 +42,11 @@ #include "alpm.h" #include "package.h" +struct db_operations default_db_ops = { + .populate = _alpm_db_populate, + .unregister = _alpm_db_unregister, +}; + /** \addtogroup alpm_databases Database Functions * @brief Functions to query and manipulate the database of libalpm * @{ @@ -80,7 +85,7 @@ pmdb_t SYMEXPORT *alpm_db_register_local(void) } /* Helper function for alpm_db_unregister{_all} */ -static void _alpm_db_unregister(pmdb_t *db) +void _alpm_db_unregister(pmdb_t *db) { if(db == NULL) { return; @@ -96,6 +101,7 @@ static void _alpm_db_unregister(pmdb_t *db) int SYMEXPORT alpm_db_unregister_all(void) { alpm_list_t *i; + pmdb_t *db; ALPM_LOG_FUNC; @@ -105,13 +111,16 @@ int SYMEXPORT alpm_db_unregister_all(void) ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, -1)); /* close local database */ - _alpm_db_unregister(handle->db_local); - handle->db_local = NULL; + db = handle->db_local; + if(db) { + db->ops->unregister(db); + handle->db_local = NULL; + } /* and also sync ones */ for(i = handle->dbs_sync; i; i = i->next) { - pmdb_t *db = i->data; - _alpm_db_unregister(db); + db = i->data; + db->ops->unregister(db); i->data = NULL; } FREELIST(handle->dbs_sync); @@ -154,7 +163,7 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db) RET_ERR(PM_ERR_DB_NOT_FOUND, -1); } - _alpm_db_unregister(db); + db->ops->unregister(db); return(0); } @@ -517,6 +526,7 @@ pmdb_t *_alpm_db_register_local(void) _alpm_log(PM_LOG_DEBUG, "registering local database\n"); db = _alpm_db_new("local", 1); + db->ops = &default_db_ops; if(db == NULL) { RET_ERR(PM_ERR_DB_CREATE, NULL); } @@ -543,6 +553,7 @@ pmdb_t *_alpm_db_register_sync(const char *treename) _alpm_log(PM_LOG_DEBUG, "registering sync database '%s'\n", treename); db = _alpm_db_new(treename, 0); + db->ops = &default_db_ops; if(db == NULL) { RET_ERR(PM_ERR_DB_CREATE, NULL); } diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h index 839ae258..b9f89ffd 100644 --- a/lib/libalpm/db.h +++ b/lib/libalpm/db.h @@ -39,6 +39,11 @@ typedef enum _pmdbinfrq_t { INFRQ_ALL = 0x3F } pmdbinfrq_t; +struct db_operations { + int (*populate) (pmdb_t *); + void (*unregister) (pmdb_t *); +}; + /* Database */ struct __pmdb_t { char *treename; @@ -46,12 +51,17 @@ struct __pmdb_t { char *_path; int pkgcache_loaded; int grpcache_loaded; + /* also indicates whether we are RO or RW */ int is_local; alpm_list_t *pkgcache; alpm_list_t *grpcache; alpm_list_t *servers; + + struct db_operations *ops; }; +extern struct db_operations default_db_ops; + /* db.c, database general calls */ void _alpm_db_free(pmdb_t *db); const char *_alpm_db_path(pmdb_t *db); @@ -59,6 +69,7 @@ int _alpm_db_cmp(const void *d1, const void *d2); alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles); pmdb_t *_alpm_db_register_local(void); pmdb_t *_alpm_db_register_sync(const char *treename); +void _alpm_db_unregister(pmdb_t *db); /* be.c, backend specific calls */ int _alpm_db_populate(pmdb_t *db); |