From efbae3cfcbd8e401084cb26853bbe46120daea4d Mon Sep 17 00:00:00 2001
From: Dan McGee <dan@archlinux.org>
Date: Sat, 10 Jul 2010 21:06:21 -0500
Subject: 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>
---
 lib/libalpm/be_files.c |  2 +-
 lib/libalpm/db.c       | 23 +++++++++++++++++------
 lib/libalpm/db.h       | 11 +++++++++++
 3 files changed, 29 insertions(+), 7 deletions(-)

(limited to 'lib/libalpm')

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);
-- 
cgit v1.2.3-70-g09d2