Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=b6218e0e3d85a734a87221002cdec1a889f495ab

commit b6218e0e3d85a734a87221002cdec1a889f495ab
Author: Michel Hermier <[email protected]>
Date:   Sun Apr 27 08:41:01 2014 +0200

libpacman: Make libpacman::Database an abstract class.

diff --git a/lib/libpacman/db.cpp b/lib/libpacman/db.cpp
index 2ad2eac..ad20341 100644
--- a/lib/libpacman/db.cpp
+++ b/lib/libpacman/db.cpp
@@ -67,7 +67,8 @@ FILE *_pacman_db_fopen_lastupdate(const Database *db, const 
char *mode)
return fopen(path, mode);
}

-Database::Database(pmhandle_t *handle, const char *treename)
+Database::Database(pmhandle_t *handle, const char *treename, const pmdb_ops_t 
*_ops)
+       : ops(_ops)
{
path = f_zalloc(strlen(handle->root)+strlen(handle->dbpath)+strlen(treename)+2);
//      if(path == NULL) {
@@ -119,9 +120,10 @@ pmlist_t *Database::search(pmlist_t *needles)
return(ret);
}

-pmlist_t *Database::test()
+pmlist_t *Database::test() const
{
-       return ops->test(this);
+       /* testing sync dbs is not supported */
+       return _pacman_list_new();
}

int Database::open(int flags)
@@ -163,21 +165,6 @@ int Database::settimestamp(const time_t *timestamp)
return _pacman_db_setlastupdate(this, buffer);
}

-int Database::rewind()
-{
-       return ops->rewind(this);
-}
-
-pmpkg_t *Database::readpkg(unsigned int inforeq)
-{
-       return ops->readpkg(this, inforeq);
-}
-
-pmpkg_t *Database::scan(const char *target, unsigned int inforeq)
-{
-       return ops->scan(this, target, inforeq);
-}
-
int Database::read(pmpkg_t *info, unsigned int inforeq)
{
int ret;
@@ -293,15 +280,10 @@ Database *_pacman_db_register(const char *treename, 
pacman_cb_db_register callba

_pacman_log(PM_LOG_FLOW1, _("registering database '%s'"), treename);

-       db = new Database(handle, treename);
+       db = strcmp(treename, "local") == 0 ? (Database *)new 
LocalDatabase(handle, treename) : new SyncDatabase(handle, treename);
if(db == NULL) {
RET_ERR(PM_ERR_DB_CREATE, NULL);
}
-       if(strcmp(treename, "local") == 0) {
-               db->ops = &_pacman_localdb_ops;
-       } else {
-               db->ops = &_pacman_syncdb_ops;
-       }

_pacman_log(PM_LOG_DEBUG, _("opening database '%s'"), db->treename);
if(db->open(0) == -1) {
diff --git a/lib/libpacman/db.h b/lib/libpacman/db.h
index 7480617..3149cc2 100644
--- a/lib/libpacman/db.h
+++ b/lib/libpacman/db.h
@@ -46,17 +46,11 @@ class Database;
typedef struct __pmdb_ops_t pmdb_ops_t;

struct __pmdb_ops_t {
-       pmlist_t *(*test)(libpacman::Database *db);
int (*open)(libpacman::Database *db, int flags, time_t *timestamp);
int (*close)(libpacman::Database *db);

int (*gettimestamp)(libpacman::Database *db, time_t *timestamp);

-       /* Package iterator */
-       int (*rewind)(libpacman::Database *db);
-       pmpkg_t *(*readpkg)(libpacman::Database *db, unsigned int inforeq);
-       pmpkg_t *(*scan)(libpacman::Database *db, const char *target, unsigned 
int inforeq);
-
int (*read)(libpacman::Database *db, pmpkg_t *info, unsigned int inforeq);
int (*write)(libpacman::Database *db, pmpkg_t *info, unsigned int inforeq); /* 
Optional */
int (*remove)(libpacman::Database *db, pmpkg_t *info); /* Optional */
@@ -68,11 +62,10 @@ class Database
: public libpacman::Object
{
public:
-       Database(pmhandle_t *handle, const char *treename);
virtual ~Database();

/* Prototypes for backends functions */
-       virtual pmlist_t *test(); /* FIXME: constify */
+       virtual pmlist_t *test() const;

virtual int open(int flags);
virtual int close();
@@ -80,9 +73,10 @@ class Database
virtual int gettimestamp(time_t *timestamp);
virtual int settimestamp(const time_t *timestamp);

-       virtual int rewind();
-       virtual pmpkg_t *readpkg(unsigned int inforeq);
-       virtual pmpkg_t *scan(const char *target, unsigned int inforeq);
+       /* Package iterator */
+       virtual int rewind() = 0;
+       virtual pmpkg_t *readpkg(unsigned int inforeq) = 0;
+       virtual pmpkg_t *scan(const char *target, unsigned int inforeq) = 0;

virtual int read(pmpkg_t *info, unsigned int inforeq);
virtual int write(pmpkg_t *info, unsigned int inforeq);
@@ -91,7 +85,6 @@ class Database
// Cache operations
pmlist_t *search(pmlist_t *needles);

-       const pmdb_ops_t *ops;
char *path;
char treename[PATH_MAX];
void *handle;
@@ -99,6 +92,12 @@ class Database
pmlist_t *pkgcache;
pmlist_t *grpcache;
pmlist_t *servers;
+
+protected:
+       Database(pmhandle_t *handle, const char *treename, const pmdb_ops_t 
*ops);
+
+private:
+       const pmdb_ops_t *ops;
};

}
diff --git a/lib/libpacman/db/localdb.cpp b/lib/libpacman/db/localdb.cpp
index 7aba8f7..19a349a 100644
--- a/lib/libpacman/db/localdb.cpp
+++ b/lib/libpacman/db/localdb.cpp
@@ -167,33 +167,32 @@ pmpkg_t *_pacman_localdb_pkg_new(Database *db, const 
struct dirent *dirent, unsi
return pkg;
}

-static
-pmlist_t *_pacman_localdb_test(Database *db)
+pmlist_t *LocalDatabase::test() const
{
struct dirent *ent;
char path[PATH_MAX];
struct stat buf;
pmlist_t *ret = _pacman_list_new();

-       while ((ent = readdir(db->handle)) != NULL) {
-               snprintf(path, PATH_MAX, "%s/%s", db->path, ent->d_name);
+       while ((ent = readdir(handle)) != NULL) {
+               snprintf(path, PATH_MAX, "%s/%s", this->path, ent->d_name);
stat(path, &buf);
if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..") || 
!S_ISDIR(buf.st_mode)) {
continue;
}
-               snprintf(path, PATH_MAX, "%s/%s/desc", db->path, ent->d_name);
+               snprintf(path, PATH_MAX, "%s/%s/desc", this->path, ent->d_name);
if(stat(path, &buf))
{
snprintf(path, LOG_STR_LEN, _("%s: description file is missing"), ent->d_name);
ret = _pacman_stringlist_append(ret, path);
}
-               snprintf(path, PATH_MAX, "%s/%s/depends", db->path, 
ent->d_name);
+               snprintf(path, PATH_MAX, "%s/%s/depends", this->path, 
ent->d_name);
if(stat(path, &buf))
{
snprintf(path, LOG_STR_LEN, _("%s: dependency information is missing"), 
ent->d_name);
ret = _pacman_stringlist_append(ret, path);
}
-               snprintf(path, PATH_MAX, "%s/%s/files", db->path, ent->d_name);
+               snprintf(path, PATH_MAX, "%s/%s/files", this->path, 
ent->d_name);
if(stat(path, &buf))
{
snprintf(path, LOG_STR_LEN, _("%s: file list is missing"), ent->d_name);
@@ -232,41 +231,36 @@ int _pacman_localdb_close(Database *db)
return 0;
}

-static
-int _pacman_localdb_rewind(Database *db)
+int LocalDatabase::rewind()
{
-       if(db->handle == NULL) {
+       if(handle == NULL) {
return -1;
}

-       rewinddir(db->handle);
+       rewinddir(handle);
return 0;
}

-static
-pmpkg_t *_pacman_localdb_readpkg(Database *db, unsigned int inforeq)
+pmpkg_t *LocalDatabase::readpkg(unsigned int inforeq)
{
struct dirent *ent = NULL;
struct stat sbuf;
char path[PATH_MAX];

-       ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL));
-
-       while((ent = readdir(db->handle)) != NULL) {
+       while((ent = readdir(handle)) != NULL) {
if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) {
continue;
}
/* stat the entry, make sure it's a directory */
-               snprintf(path, PATH_MAX, "%s/%s", db->path, ent->d_name);
+               snprintf(path, PATH_MAX, "%s/%s", this->path, ent->d_name);
if(!stat(path, &sbuf) && S_ISDIR(sbuf.st_mode)) {
-                       return _pacman_localdb_pkg_new(db, ent, inforeq);
+                       return _pacman_localdb_pkg_new(this, ent, inforeq);
}
}
return NULL;
}

-static
-pmpkg_t *_pacman_localdb_scan(Database *db, const char *target, unsigned int 
inforeq)
+pmpkg_t *LocalDatabase::scan(const char *target, unsigned int inforeq)
{
struct dirent *ent = NULL;
struct stat sbuf;
@@ -274,19 +268,18 @@ pmpkg_t *_pacman_localdb_scan(Database *db, const char 
*target, unsigned int inf
char name[PKG_FULLNAME_LEN];
char *ptr = NULL;

-       ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL));
ASSERT(!_pacman_strempty(target), RET_ERR(PM_ERR_WRONG_ARGS, NULL));

// Search from start
-       db->rewind();
+       rewind();

/* search for a specific package (by name only) */
-       while((ent = readdir(db->handle)) != NULL) {
+       while((ent = readdir(handle)) != NULL) {
if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) {
continue;
}
/* stat the entry, make sure it's a directory */
-               snprintf(path, PATH_MAX, "%s/%s", db->path, ent->d_name);
+               snprintf(path, PATH_MAX, "%s/%s", this->path, ent->d_name);
if(stat(path, &sbuf) || !S_ISDIR(sbuf.st_mode)) {
continue;
}
@@ -300,7 +293,7 @@ pmpkg_t *_pacman_localdb_scan(Database *db, const char 
*target, unsigned int inf
*ptr = '\0';
}
if(!strcmp(name, target)) {
-                       return _pacman_localdb_pkg_new(db, ent, inforeq);
+                       return _pacman_localdb_pkg_new(this, ent, inforeq);
}
}
return(NULL);
@@ -507,18 +500,19 @@ int _pacman_localdb_remove(Database *db, pmpkg_t *info)
}

const pmdb_ops_t _pacman_localdb_ops = {
-       .test = _pacman_localdb_test,
.open = _pacman_localdb_open,
.close = _pacman_localdb_close,
.gettimestamp = NULL,
-       .rewind = _pacman_localdb_rewind,
-       .readpkg = _pacman_localdb_readpkg,
-       .scan = _pacman_localdb_scan,
.read = _pacman_localdb_read,
.write = _pacman_localdb_write,
.remove = _pacman_localdb_remove,
};

+LocalDatabase::LocalDatabase(pmhandle_t *handle, const char *treename)
+       : Database(handle, treename, &_pacman_localdb_ops)
+{
+}
+
LocalDatabase::~LocalDatabase()
{
}
diff --git a/lib/libpacman/db/localdb.h b/lib/libpacman/db/localdb.h
index 65a6c58..7498dfe 100644
--- a/lib/libpacman/db/localdb.h
+++ b/lib/libpacman/db/localdb.h
@@ -34,7 +34,14 @@ class LocalDatabase
: public libpacman::Database
{
public:
+       LocalDatabase(pmhandle_t *handle, const char *treename);
virtual ~LocalDatabase();
+
+       virtual pmlist_t *test() const;
+
+       virtual int rewind();
+       virtual pmpkg_t *readpkg(unsigned int inforeq);
+       virtual pmpkg_t *scan(const char *target, unsigned int inforeq);
};

class LocalPackage
diff --git a/lib/libpacman/db/syncdb.cpp b/lib/libpacman/db/syncdb.cpp
index 29f76bb..28cb608 100644
--- a/lib/libpacman/db/syncdb.cpp
+++ b/lib/libpacman/db/syncdb.cpp
@@ -150,13 +150,6 @@ pmpkg_t *_pacman_syncdb_pkg_new(Database *db, const struct 
archive_entry *entry,
return pkg;
}

-static
-pmlist_t *_pacman_syncdb_test(Database *db)
-{
-       /* testing sync dbs is not supported */
-       return _pacman_list_new();
-}
-
int _pacman_syncdb_update(Database *db, int force)
{
char path[PATH_MAX], dirpath[PATH_MAX];
@@ -239,55 +232,49 @@ int _pacman_syncdb_close(Database *db)
return 0;
}

-static
-int _pacman_syncdb_rewind(Database *db)
+int SyncDatabase::rewind()
{
-       _pacman_syncdb_close(db);
-       return _pacman_syncdb_open(db, 0, NULL);
+       _pacman_syncdb_close(this);
+       return _pacman_syncdb_open(this, 0, NULL);
}

-static
-pmpkg_t *_pacman_syncdb_readpkg(Database *db, unsigned int inforeq)
+pmpkg_t *SyncDatabase::readpkg(unsigned int inforeq)
{
struct archive_entry *entry = NULL;

-       ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL));
-
-       if(!db->handle) {
-               db->rewind();
+       if(!handle) {
+               rewind();
}
-       if(!db->handle) {
+       if(!handle) {
return NULL;
}

for(;;) {
-               if(archive_read_next_header(db->handle, &entry) != ARCHIVE_OK) {
+               if(archive_read_next_header(handle, &entry) != ARCHIVE_OK) {
return NULL;
}
// make sure it's a directory
const char *pathname = archive_entry_pathname(entry);
if (pathname[strlen(pathname)-1] == '/') {
-                       return _pacman_syncdb_pkg_new(db, entry, inforeq);
+                       return _pacman_syncdb_pkg_new(this, entry, inforeq);
}
}
return NULL;
}

-static
-pmpkg_t *_pacman_syncdb_scan(Database *db, const char *target, unsigned int 
inforeq)
+pmpkg_t *SyncDatabase::scan(const char *target, unsigned int inforeq)
{
char name[PKG_FULLNAME_LEN];
char *ptr = NULL;
struct archive_entry *entry = NULL;

-       ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL));
ASSERT(!_pacman_strempty(target), RET_ERR(PM_ERR_WRONG_ARGS, NULL));

// Search from start
-       db->rewind();
+       rewind();

/* search for a specific package (by name only) */
-       while (archive_read_next_header(db->handle, &entry) == ARCHIVE_OK) {
+       while (archive_read_next_header(handle, &entry) == ARCHIVE_OK) {
// make sure it's a directory
const char *pathname = archive_entry_pathname(entry);
if (pathname[strlen(pathname)-1] != '/')
@@ -302,7 +289,7 @@ pmpkg_t *_pacman_syncdb_scan(Database *db, const char 
*target, unsigned int info
*ptr = '\0';
}
if(!strcmp(name, target)) {
-                       return _pacman_syncdb_pkg_new(db, entry, inforeq);
+                       return _pacman_syncdb_pkg_new(this, entry, inforeq);
}
}
return(NULL);
@@ -354,18 +341,19 @@ int _pacman_syncdb_read(Database *db, pmpkg_t *info, 
unsigned int inforeq)
}

const pmdb_ops_t _pacman_syncdb_ops = {
-       .test = _pacman_syncdb_test,
.open = _pacman_syncdb_open,
.close = _pacman_syncdb_close,
.gettimestamp = NULL,
-       .rewind = _pacman_syncdb_rewind,
-       .readpkg = _pacman_syncdb_readpkg,
-       .scan = _pacman_syncdb_scan,
.read = _pacman_syncdb_read,
.write = NULL,
.remove = NULL,
};

+SyncDatabase::SyncDatabase(pmhandle_t *handle, const char *treename)
+       : Database(handle, treename, &_pacman_syncdb_ops)
+{
+}
+
SyncDatabase::~SyncDatabase()
{
}
diff --git a/lib/libpacman/db/syncdb.h b/lib/libpacman/db/syncdb.h
index 312dde8..907781a 100644
--- a/lib/libpacman/db/syncdb.h
+++ b/lib/libpacman/db/syncdb.h
@@ -36,7 +36,12 @@ class SyncDatabase
: public libpacman::Database
{
public:
+       SyncDatabase(pmhandle_t *handle, const char *treename);
virtual ~SyncDatabase();
+
+       virtual int rewind();
+       virtual pmpkg_t *readpkg(unsigned int inforeq);
+       virtual pmpkg_t *scan(const char *target, unsigned int inforeq);
};

class SyncPackage
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to