commit:     64628c5c37601544f85785a3b8bb343f495200d8
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Mon May  6 18:01:46 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Mon May  6 18:01:46 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=64628c5c

libq/vdb: add switch to vdb_get_atom to make it cheap/expensive

while at it, ensure repeated calls get the atom for "free"

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 libq/vdb.c | 28 +++++++++++++++++++---------
 libq/vdb.h |  2 +-
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/libq/vdb.c b/libq/vdb.c
index 5dc5e79..810a84c 100644
--- a/libq/vdb.c
+++ b/libq/vdb.c
@@ -414,17 +414,27 @@ next_entry:
 }
 
 depend_atom *
-vdb_get_atom(vdb_pkg_ctx *pkg_ctx)
+vdb_get_atom(vdb_pkg_ctx *pkg_ctx, bool complete)
 {
-       pkg_ctx->atom = atom_explode(pkg_ctx->name);
-       if (pkg_ctx->atom == NULL)
-               return NULL;
-       pkg_ctx->atom->CATEGORY = (char *)pkg_ctx->cat_ctx->name;
+       if (pkg_ctx->atom == NULL) {
+               pkg_ctx->atom = atom_explode(pkg_ctx->name);
+               if (pkg_ctx->atom == NULL)
+                       return NULL;
+               pkg_ctx->atom->CATEGORY = (char *)pkg_ctx->cat_ctx->name;
+       }
 
-       vdb_pkg_eat(pkg_ctx, "SLOT", &pkg_ctx->slot, &pkg_ctx->slot_len);
-       pkg_ctx->atom->SLOT = pkg_ctx->slot;
-       vdb_pkg_eat(pkg_ctx, "repository", &pkg_ctx->repo, &pkg_ctx->repo_len);
-       pkg_ctx->atom->REPO = pkg_ctx->repo;
+       if (complete) {
+               if (pkg_ctx->atom->SLOT == NULL) {
+                       vdb_pkg_eat(pkg_ctx, "SLOT",
+                                       &pkg_ctx->slot, &pkg_ctx->slot_len);
+                       pkg_ctx->atom->SLOT = pkg_ctx->slot;
+               }
+               if (pkg_ctx->atom->REPO == NULL) {
+                       vdb_pkg_eat(pkg_ctx, "repository",
+                                       &pkg_ctx->repo, &pkg_ctx->repo_len);
+                       pkg_ctx->atom->REPO = pkg_ctx->repo;
+               }
+       }
 
        return pkg_ctx->atom;
 }

diff --git a/libq/vdb.h b/libq/vdb.h
index 2954bef..28ca040 100644
--- a/libq/vdb.h
+++ b/libq/vdb.h
@@ -91,6 +91,6 @@ int vdb_foreach_pkg_sorted(const char *sroot, const char 
*svdb,
                vdb_pkg_cb callback, void *priv);
 struct dirent *vdb_get_next_dir(DIR *dir);
 set *get_vdb_atoms(const char *sroot, const char *svdb, int fullcpv);
-depend_atom *vdb_get_atom(vdb_pkg_ctx *pkg_ctx);
+depend_atom *vdb_get_atom(vdb_pkg_ctx *pkg_ctx, bool complete);
 
 #endif

Reply via email to