From 49176461a6b476e673e232075c95f07963750f74 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 7 Jul 2010 09:39:39 -0500 Subject: Unify caching concerns in package accessors Move almost all of the caching related stuff into a single #define (which should maybe even just be a static function) so we don't duplicate logic all over the place. This also makes the code a heck of a lot shorter and means further changes to this stuff don't have to touch each and every getter function. Signed-off-by: Dan McGee --- lib/libalpm/package.c | 211 +++++++------------------------------------------- 1 file changed, 30 insertions(+), 181 deletions(-) (limited to 'lib/libalpm/package.c') diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 717d32ce..8c572810 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -100,18 +100,19 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg) return(retval); } +#define LAZY_LOAD(info, errret) \ + do { \ + ALPM_LOG_FUNC; \ + ASSERT(handle != NULL, return(errret)); \ + ASSERT(pkg != NULL, return(errret)); \ + if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & info)) { \ + _alpm_db_read(pkg->origin_data.db, pkg, info); \ + } \ + } while(0) + const char SYMEXPORT *alpm_pkg_get_filename(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } - + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->filename; } @@ -129,267 +130,115 @@ const char SYMEXPORT *alpm_pkg_get_version(pmpkg_t *pkg) const char SYMEXPORT *alpm_pkg_get_desc(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->desc; } const char SYMEXPORT *alpm_pkg_get_url(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->url; } time_t SYMEXPORT alpm_pkg_get_builddate(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(0)); - ASSERT(pkg != NULL, return(0)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, 0); return pkg->builddate; } time_t SYMEXPORT alpm_pkg_get_installdate(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(0)); - ASSERT(pkg != NULL, return(0)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, 0); return pkg->installdate; } const char SYMEXPORT *alpm_pkg_get_packager(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->packager; } const char SYMEXPORT *alpm_pkg_get_md5sum(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->md5sum; } const char SYMEXPORT *alpm_pkg_get_arch(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->arch; } off_t SYMEXPORT alpm_pkg_get_size(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(-1)); - ASSERT(pkg != NULL, return(-1)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, -1); return pkg->size; } off_t SYMEXPORT alpm_pkg_get_isize(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(-1)); - ASSERT(pkg != NULL, return(-1)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, -1); return pkg->isize; } pmpkgreason_t SYMEXPORT alpm_pkg_get_reason(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(-1)); - ASSERT(pkg != NULL, return(-1)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, -1); return pkg->reason; } alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->licenses; } alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->groups; } int SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(-1)); - ASSERT(pkg != NULL, return(-1)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, -1); return pkg->force; } alpm_list_t SYMEXPORT *alpm_pkg_get_depends(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DEPENDS)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DEPENDS); - } + LAZY_LOAD(INFRQ_DEPENDS, NULL); return pkg->depends; } alpm_list_t SYMEXPORT *alpm_pkg_get_optdepends(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DEPENDS)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DEPENDS); - } + LAZY_LOAD(INFRQ_DEPENDS, NULL); return pkg->optdepends; } alpm_list_t SYMEXPORT *alpm_pkg_get_conflicts(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DEPENDS)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DEPENDS); - } + LAZY_LOAD(INFRQ_DEPENDS, NULL); return pkg->conflicts; } alpm_list_t SYMEXPORT *alpm_pkg_get_provides(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DEPENDS)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DEPENDS); - } + LAZY_LOAD(INFRQ_DEPENDS, NULL); return pkg->provides; } alpm_list_t SYMEXPORT *alpm_pkg_get_deltas(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DELTAS)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DELTAS); - } + LAZY_LOAD(INFRQ_DELTAS, NULL); return pkg->deltas; } alpm_list_t SYMEXPORT *alpm_pkg_get_replaces(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } + LAZY_LOAD(INFRQ_DESC, NULL); return pkg->replaces; } -- cgit v1.2.3-24-g4f1b From d1126db1281596ba8ea960bfa963e86731d28b5e Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 11 May 2008 12:00:18 -0500 Subject: Allow local and sync db to be treated separately Implement this seemingly simple change in package.h: typedef enum _pmpkgfrom_t { - PKG_FROM_CACHE = 1, - PKG_FROM_FILE + PKG_FROM_FILE = 1, + PKG_FROM_LOCALDB, + PKG_FROM_SYNCDB } pmpkgfrom_t; which requires flushing out several assumptions from around the codebase with regards to usage of the PKG_FROM_CACHE value. Make some changes where required to allow the switch, and now the correct value should be set (via a crude hack) depending on whether a package was loaded as an entry in a local db or a sync db. This patch underwent some big rebasing from Allan and Dan. Signed-off-by: Dan McGee Signed-off-by: Allan McRae --- lib/libalpm/package.c | 53 ++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'lib/libalpm/package.c') diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 8c572810..d30e6138 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -63,7 +63,7 @@ int SYMEXPORT alpm_pkg_free(pmpkg_t *pkg) ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); /* Only free packages loaded in user space */ - if(pkg->origin != PKG_FROM_CACHE) { + if(pkg->origin == PKG_FROM_FILE) { _alpm_pkg_free(pkg); } @@ -83,8 +83,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg) ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); /* We only inspect packages from sync repositories */ - ASSERT(pkg->origin == PKG_FROM_CACHE, RET_ERR(PM_ERR_PKG_INVALID, -1)); - ASSERT(pkg->origin_data.db != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1)); + ASSERT(pkg->origin == PKG_FROM_SYNCDB, RET_ERR(PM_ERR_PKG_INVALID, -1)); fpath = _alpm_filecache_find(alpm_pkg_get_filename(pkg)); @@ -105,7 +104,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg) ALPM_LOG_FUNC; \ ASSERT(handle != NULL, return(errret)); \ ASSERT(pkg != NULL, return(errret)); \ - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & info)) { \ + if(pkg->origin != PKG_FROM_FILE && !(pkg->infolevel & info)) { \ _alpm_db_read(pkg->origin_data.db, pkg, info); \ } \ } while(0) @@ -250,7 +249,7 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_files(pmpkg_t *pkg) ASSERT(handle != NULL, return(NULL)); ASSERT(pkg != NULL, return(NULL)); - if(pkg->origin == PKG_FROM_CACHE && pkg->origin_data.db == handle->db_local + if(pkg->origin == PKG_FROM_LOCALDB && !(pkg->infolevel & INFRQ_FILES)) { _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES); } @@ -265,7 +264,7 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_backup(pmpkg_t *pkg) ASSERT(handle != NULL, return(NULL)); ASSERT(pkg != NULL, return(NULL)); - if(pkg->origin == PKG_FROM_CACHE && pkg->origin_data.db == handle->db_local + if(pkg->origin == PKG_FROM_LOCALDB && !(pkg->infolevel & INFRQ_FILES)) { _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES); } @@ -276,7 +275,7 @@ pmdb_t SYMEXPORT *alpm_pkg_get_db(pmpkg_t *pkg) { /* Sanity checks */ ASSERT(pkg != NULL, return(NULL)); - ASSERT(pkg->origin == PKG_FROM_CACHE, return(NULL)); + ASSERT(pkg->origin != PKG_FROM_FILE, return(NULL)); return(pkg->origin_data.db); } @@ -296,15 +295,7 @@ void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg) ASSERT(handle != NULL, return(NULL)); ASSERT(pkg != NULL, return(NULL)); - if(pkg->origin == PKG_FROM_CACHE) { - char clfile[PATH_MAX]; - snprintf(clfile, PATH_MAX, "%s/%s/%s-%s/changelog", - alpm_option_get_dbpath(), - alpm_db_get_name(handle->db_local), - alpm_pkg_get_name(pkg), - alpm_pkg_get_version(pkg)); - return fopen(clfile, "r"); - } else if(pkg->origin == PKG_FROM_FILE) { + if(pkg->origin == PKG_FROM_FILE) { struct archive *archive = NULL; struct archive_entry *entry; const char *pkgfile = pkg->origin_data.file; @@ -331,7 +322,16 @@ void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg) /* we didn't find a changelog */ archive_read_finish(archive); errno = ENOENT; + } else { + char clfile[PATH_MAX]; + snprintf(clfile, PATH_MAX, "%s/%s/%s-%s/changelog", + alpm_option_get_dbpath(), + alpm_db_get_name(handle->db_local), + alpm_pkg_get_name(pkg), + alpm_pkg_get_version(pkg)); + return fopen(clfile, "r"); } + return(NULL); } @@ -351,9 +351,8 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size, const pmpkg_t *pkg, const void *fp) { size_t ret = 0; - if(pkg->origin == PKG_FROM_CACHE) { - ret = fread(ptr, 1, size, (FILE*)fp); - } else if(pkg->origin == PKG_FROM_FILE) { + + if(pkg->origin == PKG_FROM_FILE) { ssize_t sret = archive_read_data((struct archive*)fp, ptr, size); /* Report error (negative values) */ if(sret < 0) { @@ -362,6 +361,8 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size, } else { ret = (size_t)sret; } + } else { + ret = fread(ptr, 1, size, (FILE*)fp); } return(ret); } @@ -370,11 +371,11 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size, int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp) { int ret = 0; - if(pkg->origin == PKG_FROM_CACHE) { - ret = feof((FILE*)fp); - } else if(pkg->origin == PKG_FROM_FILE) { + if(pkg->origin == PKG_FROM_FILE) { // note: this doesn't quite work, no feof in libarchive ret = archive_read_data((struct archive*)fp, NULL, 0); + } else { + ret = feof((FILE*)fp); } return(ret); } @@ -391,10 +392,10 @@ int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp) int SYMEXPORT alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp) { int ret = 0; - if(pkg->origin == PKG_FROM_CACHE) { - ret = fclose((FILE*)fp); - } else if(pkg->origin == PKG_FROM_FILE) { + if(pkg->origin == PKG_FROM_FILE) { ret = archive_read_finish((struct archive *)fp); + } else { + ret = fclose((FILE*)fp); } return(ret); } @@ -407,7 +408,7 @@ int SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg) ASSERT(handle != NULL, return(-1)); ASSERT(pkg != NULL, return(-1)); - if(pkg->origin == PKG_FROM_CACHE && pkg->origin_data.db == handle->db_local + if(pkg->origin == PKG_FROM_LOCALDB && !(pkg->infolevel & INFRQ_SCRIPTLET)) { _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_SCRIPTLET); } -- cgit v1.2.3-24-g4f1b From 6cebd4e6028f717663cda0af1221f3ac74d5ab9f Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 11 May 2008 16:00:33 -0500 Subject: Complete rework of package accessor logic Hopefully we've finally arrived at package handling nirvana, or at least this commit will get us a heck of a lot closer. The former method of getting the depends list for a package was the following: 1. call alpm_pkg_get_depends() 2. this method would check if the package came from the cache 3. if so, ensure our cache level is correct, otherwise call db_load 4. finally return the depends list Why did this suck? Because getting the depends list from the package shouldn't care about whether the package was loaded from a file, from the 'package cache', or some other system which we can't even use because the damn thing is so complicated. It should just return the depends list. So what does this commit change? It adds a pointer to a struct of function pointers to every package for all of these 'package operations' as I've decided to call them (I know, sounds completely straightforward, right?). So now when we call an alpm_pkg_get-* function, we don't do any of the cache logic or anything else there- we let the actual backend handle it by delegating all work to the method at pkg->ops->get_depends. Now that be_package has achieved equal status with be_files, we can treat packages from these completely different load points differently. We know a package loaded from a zip file will have all of its fields populated, so we can set up all its accessor functions to be direct accessors. On the other hand, the packages loaded from the local and sync DBs are not always fully-loaded, so their accessor functions are routed through the same logic as before. Net result? More code. However, this code now make it roughly 52 times easier to open the door to something like a read-only tar.gz database backend. Are you still reading? I'm impressed. Looking at the patch will probably be clearer than this long-winded explanation. Signed-off-by: Dan McGee [Allan: rebase and adjust] Signed-off-by: Allan McRae --- lib/libalpm/package.c | 174 +++++++++++++++++++++++++++----------------------- 1 file changed, 93 insertions(+), 81 deletions(-) (limited to 'lib/libalpm/package.c') diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index d30e6138..4f7cc2db 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -99,176 +99,187 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg) return(retval); } -#define LAZY_LOAD(info, errret) \ - do { \ - ALPM_LOG_FUNC; \ - ASSERT(handle != NULL, return(errret)); \ - ASSERT(pkg != NULL, return(errret)); \ - if(pkg->origin != PKG_FROM_FILE && !(pkg->infolevel & info)) { \ - _alpm_db_read(pkg->origin_data.db, pkg, info); \ - } \ - } while(0) - +/* Default package accessor functions. These will get overridden by any + * backend logic that needs lazy access, such as the local database through + * a lazy-laod cache. However, the defaults will work just fine for fully- + * populated package structures. */ +const char *_pkg_get_filename(pmpkg_t *pkg) { return pkg->filename; } +const char *_pkg_get_name(pmpkg_t *pkg) { return pkg->name; } +const char *_pkg_get_version(pmpkg_t *pkg) { return pkg->version; } +const char *_pkg_get_desc(pmpkg_t *pkg) { return pkg->desc; } +const char *_pkg_get_url(pmpkg_t *pkg) { return pkg->url; } +time_t _pkg_get_builddate(pmpkg_t *pkg) { return pkg->builddate; } +time_t _pkg_get_installdate(pmpkg_t *pkg) { return pkg->installdate; } +const char *_pkg_get_packager(pmpkg_t *pkg) { return pkg->packager; } +const char *_pkg_get_md5sum(pmpkg_t *pkg) { return pkg->md5sum; } +const char *_pkg_get_arch(pmpkg_t *pkg) { return pkg->arch; } +off_t _pkg_get_size(pmpkg_t *pkg) { return pkg->size; } +off_t _pkg_get_isize(pmpkg_t *pkg) { return pkg->isize; } +pmpkgreason_t _pkg_get_reason(pmpkg_t *pkg) { return pkg->reason; } +int _pkg_has_force(pmpkg_t *pkg) { return pkg->force; } + +alpm_list_t *_pkg_get_licenses(pmpkg_t *pkg) { return pkg->licenses; } +alpm_list_t *_pkg_get_groups(pmpkg_t *pkg) { return pkg->groups; } +alpm_list_t *_pkg_get_depends(pmpkg_t *pkg) { return pkg->depends; } +alpm_list_t *_pkg_get_optdepends(pmpkg_t *pkg) { return pkg->optdepends; } +alpm_list_t *_pkg_get_conflicts(pmpkg_t *pkg) { return pkg->conflicts; } +alpm_list_t *_pkg_get_provides(pmpkg_t *pkg) { return pkg->provides; } +alpm_list_t *_pkg_get_replaces(pmpkg_t *pkg) { return pkg->replaces; } +alpm_list_t *_pkg_get_deltas(pmpkg_t *pkg) { return pkg->deltas; } +alpm_list_t *_pkg_get_files(pmpkg_t *pkg) { return pkg->files; } +alpm_list_t *_pkg_get_backup(pmpkg_t *pkg) { return pkg->backup; } + +/** The standard package operations struct. Get fields directly from the + * struct itself with no abstraction layer or any type of lazy loading. + */ +struct pkg_operations default_pkg_ops = { + .get_filename = _pkg_get_filename, + .get_name = _pkg_get_name, + .get_version = _pkg_get_version, + .get_desc = _pkg_get_desc, + .get_url = _pkg_get_url, + .get_builddate = _pkg_get_builddate, + .get_installdate = _pkg_get_installdate, + .get_packager = _pkg_get_packager, + .get_md5sum = _pkg_get_md5sum, + .get_arch = _pkg_get_arch, + .get_size = _pkg_get_size, + .get_isize = _pkg_get_isize, + .get_reason = _pkg_get_reason, + .has_force = _pkg_has_force, + .get_licenses = _pkg_get_licenses, + .get_groups = _pkg_get_groups, + .get_depends = _pkg_get_depends, + .get_optdepends = _pkg_get_optdepends, + .get_conflicts = _pkg_get_conflicts, + .get_provides = _pkg_get_provides, + .get_replaces = _pkg_get_replaces, + .get_deltas = _pkg_get_deltas, + .get_files = _pkg_get_files, + .get_backup = _pkg_get_backup, +}; + +/* Public functions for getting package information. These functions + * delegate the hard work to the function callbacks attached to each + * package, which depend on where the package was loaded from. */ const char SYMEXPORT *alpm_pkg_get_filename(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->filename; + return pkg->ops->get_filename(pkg); } const char SYMEXPORT *alpm_pkg_get_name(pmpkg_t *pkg) { - ASSERT(pkg != NULL, return(NULL)); - return pkg->name; + return pkg->ops->get_name(pkg); } const char SYMEXPORT *alpm_pkg_get_version(pmpkg_t *pkg) { - ASSERT(pkg != NULL, return(NULL)); - return pkg->version; + return pkg->ops->get_version(pkg); } const char SYMEXPORT *alpm_pkg_get_desc(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->desc; + return pkg->ops->get_desc(pkg); } const char SYMEXPORT *alpm_pkg_get_url(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->url; + return pkg->ops->get_url(pkg); } time_t SYMEXPORT alpm_pkg_get_builddate(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, 0); - return pkg->builddate; + return pkg->ops->get_builddate(pkg); } time_t SYMEXPORT alpm_pkg_get_installdate(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, 0); - return pkg->installdate; + return pkg->ops->get_installdate(pkg); } const char SYMEXPORT *alpm_pkg_get_packager(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->packager; + return pkg->ops->get_packager(pkg); } const char SYMEXPORT *alpm_pkg_get_md5sum(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->md5sum; + return pkg->ops->get_md5sum(pkg); } const char SYMEXPORT *alpm_pkg_get_arch(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->arch; + return pkg->ops->get_arch(pkg); } off_t SYMEXPORT alpm_pkg_get_size(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, -1); - return pkg->size; + return pkg->ops->get_size(pkg); } off_t SYMEXPORT alpm_pkg_get_isize(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, -1); - return pkg->isize; + return pkg->ops->get_isize(pkg); } pmpkgreason_t SYMEXPORT alpm_pkg_get_reason(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, -1); - return pkg->reason; + return pkg->ops->get_reason(pkg); } -alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(pmpkg_t *pkg) +int SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->licenses; + return pkg->ops->has_force(pkg); } -alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg) +alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->groups; + return pkg->ops->get_licenses(pkg); } -int SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg) +alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, -1); - return pkg->force; + return pkg->ops->get_groups(pkg); } alpm_list_t SYMEXPORT *alpm_pkg_get_depends(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DEPENDS, NULL); - return pkg->depends; + return pkg->ops->get_depends(pkg); } alpm_list_t SYMEXPORT *alpm_pkg_get_optdepends(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DEPENDS, NULL); - return pkg->optdepends; + return pkg->ops->get_optdepends(pkg); } alpm_list_t SYMEXPORT *alpm_pkg_get_conflicts(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DEPENDS, NULL); - return pkg->conflicts; + return pkg->ops->get_conflicts(pkg); } alpm_list_t SYMEXPORT *alpm_pkg_get_provides(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DEPENDS, NULL); - return pkg->provides; + return pkg->ops->get_provides(pkg); } -alpm_list_t SYMEXPORT *alpm_pkg_get_deltas(pmpkg_t *pkg) +alpm_list_t SYMEXPORT *alpm_pkg_get_replaces(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DELTAS, NULL); - return pkg->deltas; + return pkg->ops->get_replaces(pkg); } -alpm_list_t SYMEXPORT *alpm_pkg_get_replaces(pmpkg_t *pkg) +alpm_list_t SYMEXPORT *alpm_pkg_get_deltas(pmpkg_t *pkg) { - LAZY_LOAD(INFRQ_DESC, NULL); - return pkg->replaces; + return pkg->ops->get_deltas(pkg); } alpm_list_t SYMEXPORT *alpm_pkg_get_files(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_LOCALDB - && !(pkg->infolevel & INFRQ_FILES)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES); - } - return pkg->files; + return pkg->ops->get_files(pkg); } alpm_list_t SYMEXPORT *alpm_pkg_get_backup(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_LOCALDB - && !(pkg->infolevel & INFRQ_FILES)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES); - } - return pkg->backup; + return pkg->ops->get_backup(pkg); } pmdb_t SYMEXPORT *alpm_pkg_get_db(pmpkg_t *pkg) @@ -517,6 +528,7 @@ pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg) /* internal */ newpkg->origin = pkg->origin; + newpkg->ops = pkg->ops; if(newpkg->origin == PKG_FROM_FILE) { newpkg->origin_data.file = strdup(pkg->origin_data.file); } else { -- cgit v1.2.3-24-g4f1b From b9a531c2d7e3eefab5d987d83a1cb869e1220fac Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 11 May 2008 16:49:01 -0500 Subject: Move changelog functions to callback struct Signed-off-by: Dan McGee --- lib/libalpm/package.c | 78 +++------------------------------------------------ 1 file changed, 4 insertions(+), 74 deletions(-) (limited to 'lib/libalpm/package.c') diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 4f7cc2db..2d0ec010 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -300,50 +300,7 @@ pmdb_t SYMEXPORT *alpm_pkg_get_db(pmpkg_t *pkg) */ void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg) { - ALPM_LOG_FUNC; - - /* Sanity checks */ - ASSERT(handle != NULL, return(NULL)); - ASSERT(pkg != NULL, return(NULL)); - - if(pkg->origin == PKG_FROM_FILE) { - struct archive *archive = NULL; - struct archive_entry *entry; - const char *pkgfile = pkg->origin_data.file; - - if((archive = archive_read_new()) == NULL) { - RET_ERR(PM_ERR_LIBARCHIVE, NULL); - } - - archive_read_support_compression_all(archive); - archive_read_support_format_all(archive); - - if (archive_read_open_filename(archive, pkgfile, - ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) { - RET_ERR(PM_ERR_PKG_OPEN, NULL); - } - - while(archive_read_next_header(archive, &entry) == ARCHIVE_OK) { - const char *entry_name = archive_entry_pathname(entry); - - if(strcmp(entry_name, ".CHANGELOG") == 0) { - return(archive); - } - } - /* we didn't find a changelog */ - archive_read_finish(archive); - errno = ENOENT; - } else { - char clfile[PATH_MAX]; - snprintf(clfile, PATH_MAX, "%s/%s/%s-%s/changelog", - alpm_option_get_dbpath(), - alpm_db_get_name(handle->db_local), - alpm_pkg_get_name(pkg), - alpm_pkg_get_version(pkg)); - return fopen(clfile, "r"); - } - - return(NULL); + return pkg->ops->changelog_open(pkg); } /** @@ -361,34 +318,13 @@ void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg) size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size, const pmpkg_t *pkg, const void *fp) { - size_t ret = 0; - - if(pkg->origin == PKG_FROM_FILE) { - ssize_t sret = archive_read_data((struct archive*)fp, ptr, size); - /* Report error (negative values) */ - if(sret < 0) { - pm_errno = PM_ERR_LIBARCHIVE; - ret = 0; - } else { - ret = (size_t)sret; - } - } else { - ret = fread(ptr, 1, size, (FILE*)fp); - } - return(ret); + return pkg->ops->changelog_read(ptr, size, pkg, fp); } /* int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp) { - int ret = 0; - if(pkg->origin == PKG_FROM_FILE) { - // note: this doesn't quite work, no feof in libarchive - ret = archive_read_data((struct archive*)fp, NULL, 0); - } else { - ret = feof((FILE*)fp); - } - return(ret); + return pkg->ops->changelog_feof(pkg, fp); } */ @@ -402,13 +338,7 @@ int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp) */ int SYMEXPORT alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp) { - int ret = 0; - if(pkg->origin == PKG_FROM_FILE) { - ret = archive_read_finish((struct archive *)fp); - } else { - ret = fclose((FILE*)fp); - } - return(ret); + return pkg->ops->changelog_close(pkg, fp); } int SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg) -- cgit v1.2.3-24-g4f1b From 522ef5e981580a52ee0ffa37178d7ddf116ebd51 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 12 May 2008 07:49:01 +1000 Subject: Move the cache stuff where it should be Cache bullshit only has relevance to be_files, so move it there. Signed-off-by: Dan McGee [Allan: BIG rebase] Signed-off-by: Allan McRae --- lib/libalpm/package.c | 1 - 1 file changed, 1 deletion(-) (limited to 'lib/libalpm/package.c') diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 2d0ec010..57dc50f2 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -42,7 +42,6 @@ #include "log.h" #include "util.h" #include "db.h" -#include "cache.h" #include "delta.h" #include "handle.h" #include "deps.h" -- cgit v1.2.3-24-g4f1b From c56b576f6fef464f82f425219ef386fe8b742899 Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Mon, 2 Aug 2010 14:40:04 +1000 Subject: Fix documentation syntax and typo Signed-off-by: Allan McRae --- lib/libalpm/package.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/libalpm/package.c') diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 57dc50f2..682ff90c 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -100,7 +100,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg) /* Default package accessor functions. These will get overridden by any * backend logic that needs lazy access, such as the local database through - * a lazy-laod cache. However, the defaults will work just fine for fully- + * a lazy-load cache. However, the defaults will work just fine for fully- * populated package structures. */ const char *_pkg_get_filename(pmpkg_t *pkg) { return pkg->filename; } const char *_pkg_get_name(pmpkg_t *pkg) { return pkg->name; } -- cgit v1.2.3-24-g4f1b From fc32faaa6ab4081e2046b2a81e4f9949af2f7282 Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Sat, 9 Oct 2010 20:16:15 +1000 Subject: Completely separate local and sync db handling Put the db_operations struct to use and completely split the handling of the sync and local databases. Signed-off-by: Allan McRae --- lib/libalpm/package.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/libalpm/package.c') diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 682ff90c..09bf78eb 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -350,7 +350,7 @@ int SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg) if(pkg->origin == PKG_FROM_LOCALDB && !(pkg->infolevel & INFRQ_SCRIPTLET)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_SCRIPTLET); + _alpm_local_db_read(pkg->origin_data.db, pkg, INFRQ_SCRIPTLET); } return pkg->scriptlet; } -- cgit v1.2.3-24-g4f1b