From d528e9d1f4b1dae5a7924c9400e9126a36a34b7f Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 18 Jan 2012 14:08:19 +0100 Subject: [PATCH] - add Datapos lookup functions, add lookup_idarray/deparray for XSolvables --- bindings/solv.i | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ examples/p5solv | 10 +++---- examples/pysolv | 22 +++++++-------- examples/rbsolv | 10 +++---- 4 files changed, 105 insertions(+), 21 deletions(-) diff --git a/bindings/solv.i b/bindings/solv.i index 929cf7f..768c50b 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -1319,6 +1319,38 @@ typedef struct { } } +%extend Datapos { + Id lookup_id(Id keyname) { + Pool *pool = $self->repo->pool; + Datapos oldpos = pool->pos; + Id r; + pool->pos = *$self; + r = pool_lookup_id(pool, SOLVID_POS, keyname); + pool->pos = oldpos; + return r; + } + const char *lookup_str(Id keyname) { + Pool *pool = $self->repo->pool; + Datapos oldpos = pool->pos; + const char *r; + pool->pos = *$self; + r = pool_lookup_str(pool, SOLVID_POS, keyname); + pool->pos = oldpos; + return r; + } + %newobject lookup_checksum; + Chksum *lookup_checksum(Id keyname) { + Pool *pool = $self->repo->pool; + Datapos oldpos = pool->pos; + Id type = 0; + const unsigned char *b; + pool->pos = *$self; + b = pool_lookup_bin_checksum(pool, SOLVID_POS, keyname, &type); + pool->pos = oldpos; + return solv_chksum_create_from_bin(type, b); + } +} + %extend Datamatch { ~Datamatch() { dataiterator_free($self); @@ -1358,6 +1390,26 @@ typedef struct { int num2() { return $self->kv.num2; } + %newobject pos; + Datapos *pos() { + Pool *pool = $self->pool; + Datapos *pos, oldpos = pool->pos; + dataiterator_setpos($self); + pos = solv_calloc(1, sizeof(*pos)); + *pos = pool->pos; + pool->pos = oldpos; + return pos; + } + %newobject parentpos; + Datapos *parentpos() { + Pool *pool = $self->pool; + Datapos *pos, oldpos = pool->pos; + dataiterator_setpos_parent($self); + pos = solv_calloc(1, sizeof(*pos)); + *pos = pool->pos; + pool->pos = oldpos; + return pos; + } void setpos() { dataiterator_setpos($self); } @@ -1601,6 +1653,38 @@ typedef struct { const unsigned char *b = pool_lookup_bin_checksum($self->pool, $self->id, keyname, &type); return solv_chksum_create_from_bin(type, b); } + Queue lookup_idarray(Id keyname, Id marker = 1) { + Solvable *s = $self->pool->solvables + $self->id; + Queue r; + queue_init(&r); + if (marker == 1) { + if (keyname == SOLVABLE_PROVIDES) + marker = -SOLVABLE_FILEMARKER; + else if (keyname == SOLVABLE_REQUIRES) + marker = -SOLVABLE_PREREQMARKER; + else + marker = 0; + } + solvable_lookup_deparray(s, keyname, &r, marker); + return r; + } + %typemap(out) Queue lookup_deparray Queue2Array(Dep *, 1, new_Dep(arg1->pool, id)); + %newobject lookup_deparray; + Queue lookup_deparray(Id keyname, Id marker = 1) { + Solvable *s = $self->pool->solvables + $self->id; + Queue r; + queue_init(&r); + if (marker == 1) { + if (keyname == SOLVABLE_PROVIDES) + marker = -SOLVABLE_FILEMARKER; + else if (keyname == SOLVABLE_REQUIRES) + marker = -SOLVABLE_PREREQMARKER; + else + marker = 0; + } + solvable_lookup_deparray(s, keyname, &r, marker); + return r; + } const char *lookup_location(unsigned int *OUTPUT) { return solvable_get_location($self->pool->solvables + $self->id, OUTPUT); } diff --git a/examples/p5solv b/examples/p5solv index 7a57f1c..fd9915a 100755 --- a/examples/p5solv +++ b/examples/p5solv @@ -201,10 +201,10 @@ sub find { my $di = $self->{'handle'}->Dataiterator($solv::SOLVID_META, $solv::REPOSITORY_REPOMD_TYPE, $what, $solv::Dataiterator::SEARCH_STRING); $di->prepend_keyname($solv::REPOSITORY_REPOMD); for my $d (@$di) { - $d->setpos_parent(); - my $filename = $d->{'pool'}->lookup_str($solv::SOLVID_POS, $solv::REPOSITORY_REPOMD_LOCATION); + my $dp = $d->parentpos(); + my $filename = $dp->lookup_str($solv::REPOSITORY_REPOMD_LOCATION); next unless $filename; - my $chksum = $d->{'pool'}->lookup_checksum($solv::SOLVID_POS, $solv::REPOSITORY_REPOMD_CHECKSUM); + my $chksum = $dp->lookup_checksum($solv::REPOSITORY_REPOMD_CHECKSUM); if (!$chksum) { print "no $filename file checksum!\n"; return (undef, undef); @@ -326,8 +326,8 @@ sub find { my $di = $self->{'handle'}->Dataiterator($solv::SOLVID_META, $solv::SUSETAGS_FILE_NAME, $what, $solv::Dataiterator::SEARCH_STRING); $di->prepend_keyname($solv::SUSETAGS_FILE); for my $d (@$di) { - $d->setpos_parent(); - my $chksum = $d->{'pool'}->lookup_checksum($solv::SOLVID_POS, $solv::SUSETAGS_FILE_CHECKSUM); + my $dp = $d->parentpos(); + my $chksum = $dp->lookup_checksum($solv::SUSETAGS_FILE_CHECKSUM); return ($what, $chksum); } return (undef, undef); diff --git a/examples/pysolv b/examples/pysolv index bd547bc..88380af 100755 --- a/examples/pysolv +++ b/examples/pysolv @@ -345,9 +345,9 @@ class repo_repomd(repo_generic): di = self.handle.Dataiterator(solv.SOLVID_META, solv.REPOSITORY_REPOMD_TYPE, what, Dataiterator.SEARCH_STRING) di.prepend_keyname(solv.REPOSITORY_REPOMD) for d in di: - d.setpos_parent() - filename = d.pool.lookup_str(solv.SOLVID_POS, solv.REPOSITORY_REPOMD_LOCATION) - chksum = d.pool.lookup_checksum(solv.SOLVID_POS, solv.REPOSITORY_REPOMD_CHECKSUM) + dp = d.parentpos() + filename = dp.lookup_str(solv.REPOSITORY_REPOMD_LOCATION) + chksum = dp.lookup_checksum(solv.REPOSITORY_REPOMD_CHECKSUM) if filename and not chksum: print "no %s file checksum!" % filename filename = None @@ -458,8 +458,8 @@ class repo_susetags(repo_generic): di = self.handle.Dataiterator(solv.SOLVID_META, solv.SUSETAGS_FILE_NAME, what, Dataiterator.SEARCH_STRING) di.prepend_keyname(solv.SUSETAGS_FILE) for d in di: - d.setpos_parent() - chksum = d.pool.lookup_checksum(solv.SOLVID_POS, solv.SUSETAGS_FILE_CHECKSUM) + dp = d.parentpos() + chksum = dp.lookup_checksum(solv.SUSETAGS_FILE_CHECKSUM) return (what, chksum) return (None, None) @@ -952,24 +952,24 @@ if cmd == 'install' or cmd == 'erase' or cmd == 'up' or cmd == 'dup' or cmd == ' di = p.repo.Dataiterator(solv.SOLVID_META, solv.DELTA_PACKAGE_NAME, pname, Dataiterator.SEARCH_STRING) di.prepend_keyname(solv.REPOSITORY_DELTAINFO) for d in di: - d.setpos_parent() - if pool.lookup_id(solv.SOLVID_POS, solv.DELTA_PACKAGE_EVR) != p.evrid or pool.lookup_id(solv.SOLVID_POS, solv.DELTA_PACKAGE_ARCH) != p.archid: + dp = d.parentpos() + if dp.lookup_id(solv.DELTA_PACKAGE_EVR) != p.evrid or dp.lookup_id(solv.DELTA_PACKAGE_ARCH) != p.archid: continue - baseevrid = pool.lookup_id(solv.SOLVID_POS, solv.DELTA_BASE_EVR) + baseevrid = dp.lookup_id(solv.DELTA_BASE_EVR) candidate = None for installedp in pool.whatprovides(p.nameid): if installedp.isinstalled() and installedp.nameid == p.nameid and installedp.archid == p.archid and installedp.evrid == baseevrid: candidate = installedp if not candidate: continue - seq = pool.lookup_str(solv.SOLVID_POS, solv.DELTA_SEQ_NAME) + '-' + pool.lookup_str(solv.SOLVID_POS, solv.DELTA_SEQ_EVR) + '-' + pool.lookup_str(solv.SOLVID_POS, solv.DELTA_SEQ_NUM) + seq = dp.lookup_str(solv.DELTA_SEQ_NAME) + '-' + dp.lookup_str(solv.DELTA_SEQ_EVR) + '-' + dp.lookup_str(solv.DELTA_SEQ_NUM) st = subprocess.call(['/usr/bin/applydeltarpm', '-a', p.arch, '-c', '-s', seq]) if st: continue - chksum = pool.lookup_checksum(solv.SOLVID_POS, solv.DELTA_CHECKSUM) + chksum = dp.lookup_checksum(solv.DELTA_CHECKSUM) if not chksum: continue - dloc = pool.lookup_str(solv.SOLVID_POS, solv.DELTA_LOCATION_DIR) + '/' + pool.lookup_str(solv.SOLVID_POS, solv.DELTA_LOCATION_NAME) + '-' + pool.lookup_str(solv.SOLVID_POS, solv.DELTA_LOCATION_EVR) + '.' + pool.lookup_str(solv.SOLVID_POS, solv.DELTA_LOCATION_SUFFIX) + dloc = dp.lookup_str(solv.DELTA_LOCATION_DIR) + '/' + dp.lookup_str(solv.DELTA_LOCATION_NAME) + '-' + dp.lookup_str(solv.DELTA_LOCATION_EVR) + '.' + dp.lookup_str(solv.DELTA_LOCATION_SUFFIX) f = repo.download(dloc, False, chksum) if not f: continue diff --git a/examples/rbsolv b/examples/rbsolv index 8ffd639..00e8f05 100755 --- a/examples/rbsolv +++ b/examples/rbsolv @@ -220,10 +220,10 @@ class Repo_rpmmd < Repo_generic di = @handle.Dataiterator(Solv::SOLVID_META, Solv::REPOSITORY_REPOMD_TYPE, what, Solv::Dataiterator::SEARCH_STRING) di.prepend_keyname(Solv::REPOSITORY_REPOMD) for d in di - d.setpos_parent() - filename = d.pool.lookup_str(Solv::SOLVID_POS, Solv::REPOSITORY_REPOMD_LOCATION) + dp = d.parentpos() + filename = dp.lookup_str(Solv::REPOSITORY_REPOMD_LOCATION) next unless filename - checksum = d.pool.lookup_checksum(Solv::SOLVID_POS, Solv::REPOSITORY_REPOMD_CHECKSUM) + checksum = dp.lookup_checksum(Solv::REPOSITORY_REPOMD_CHECKSUM) if !checksum puts "no #{filename} checksum!" return nil, nil @@ -337,8 +337,8 @@ class Repo_susetags < Repo_generic di = @handle.Dataiterator(Solv::SOLVID_META, Solv::SUSETAGS_FILE_NAME, what, Solv::Dataiterator::SEARCH_STRING) di.prepend_keyname(Solv::SUSETAGS_FILE) for d in di - d.setpos_parent() - checksum = d.pool.lookup_checksum(Solv::SOLVID_POS, Solv::SUSETAGS_FILE_CHECKSUM) + dp = d.parentpos() + checksum = dp.lookup_checksum(Solv::SUSETAGS_FILE_CHECKSUM) return what, checksum end return nil, nil -- 2.7.4