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
