- add Datapos lookup functions, add lookup_idarray/deparray for XSolvables
authorMichael Schroeder <mls@suse.de>
Wed, 18 Jan 2012 13:08:19 +0000 (14:08 +0100)
committerMichael Schroeder <mls@suse.de>
Wed, 18 Jan 2012 13:08:19 +0000 (14:08 +0100)
bindings/solv.i
examples/p5solv
examples/pysolv
examples/rbsolv

index 929cf7f..768c50b 100644 (file)
@@ -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);
   }
index 7a57f1c..fd9915a 100755 (executable)
@@ -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);
index bd547bc..88380af 100755 (executable)
@@ -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
index 8ffd639..00e8f05 100755 (executable)
@@ -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