obey droporphaned map in keep_orhans mode
[platform/upstream/libsolv.git] / doc / libsolv-bindings.3
index a6c7b14..87e949a 100644 (file)
@@ -1,13 +1,13 @@
 '\" t
-.\"     Title: libsolv-bindings
+.\"     Title: Libsolv-Bindings
 .\"    Author: [see the "Author" section]
-.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\"      Date: 06/07/2013
+.\" Generator: DocBook XSL Stylesheets v1.78.0 <http://docbook.sf.net/>
+.\"      Date: 04/04/2014
 .\"    Manual: LIBSOLV
 .\"    Source: libsolv
 .\"  Language: English
 .\"
-.TH "LIBSOLV\-BINDINGS" "3" "06/07/2013" "libsolv" "LIBSOLV"
+.TH "LIBSOLV\-BINDINGS" "3" "04/04/2014" "libsolv" "LIBSOLV"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -72,7 +72,7 @@ Swig encapsulates all objects as tied hashes, thus the attributes can be accesse
 .RE
 .\}
 .sp
-An special exception to this are iterator objects, they are encapsulated as tied arrays so that it is possible to iterate with a for() statement:
+A special exception to this are iterator objects, they are encapsulated as tied arrays so that it is possible to iterate with a for() statement:
 .sp
 .if n \{\
 .RS 4
@@ -85,9 +85,9 @@ my \fI$iter\fR \fB=\fR \fI$pool\fR\fB\->solvables_iter()\fR;
 .RE
 .\}
 .sp
-As a downside of this approach, iterator objects can have no attributes\&.
+As a downside of this approach, iterator objects cannot have attributes\&.
 .sp
-If an array needs to be passwd to a method it is usually done by reference, if a method returns an array it returns it on the stack:
+If an array needs to be passed to a method it is usually done by reference, if a method returns an array it returns it on the stack:
 .sp
 .if n \{\
 .RS 4
@@ -99,7 +99,7 @@ my \fI@problems\fR \fB=\fR \fI$solver\fR\fB\->solve(\e\fR\fI@jobs\fR\fB)\fR;
 .RE
 .\}
 .sp
-Due to a bug in swig, stringification does not work for libsolv\(cqs object\&. Instead you have to call the object\(cqs str() method\&.
+Due to a bug in swig, stringification does not work for libsolv\(cqs objects\&. Instead, you have to call the object\(cqs str() method\&.
 .sp
 .if n \{\
 .RS 4
@@ -156,7 +156,7 @@ Attributes can be accessed as usual:
 .\}
 .nf
 \fIpool\fR\fB\&.appdata = 42\fR
-\fBprint "appdata is %\fR\fId\fR\fB" % (\fR\fIpool\fR\fB\&.appdata)\fR
+\fBprint "appdata is %d" % (\fR\fIpool\fR\fB\&.appdata)\fR
 .fi
 .if n \{\
 .RE
@@ -174,13 +174,13 @@ Iterators also work as expected:
 .RE
 .\}
 .sp
-Arrays are passed an returned as list objects:
+Arrays are passed and returned as list objects:
 .sp
 .if n \{\
 .RS 4
 .\}
 .nf
-\fIjobs\fR \fB=\fR \fI[\fR\fB]\fR
+\fIjobs\fR \fB= []\fR
 \fIproblems\fR \fB=\fR \fIsolver\fR\fB\&.solve(\fR\fIjobs\fR\fB)\fR
 .fi
 .if n \{\
@@ -263,13 +263,13 @@ Iterators also work as expected:
 .RE
 .\}
 .sp
-Arrays are passed an returned as array objects:
+Arrays are passed and returned as array objects:
 .sp
 .if n \{\
 .RS 4
 .\}
 .nf
-\fIjobs\fR \fB=\fR \fI[\fR\fB]\fR
+\fIjobs\fR \fB= []\fR
 \fIproblems\fR \fB=\fR \fIsolver\fR\fB\&.solve(\fR\fIjobs\fR\fB)\fR
 .fi
 .if n \{\
@@ -370,7 +370,7 @@ The keyname Id of the name of the solvable\&.
 .PP
 \fB\&...\fR
 .RS 4
-see the libsolv\-knownid manpage for a list of fixed Ids\&.
+see the libsolv\-constantids manpage for a list of fixed Ids\&.
 .RE
 .SH "THE POOL CLASS"
 .sp
@@ -390,7 +390,7 @@ my \fI$pool\fR \fB= solv::Pool\->new()\fR;
 .RE
 .\}
 .sp
-Create a new pool instance\&. In most cases you just need one pool\&.
+Create a new pool instance\&. In most cases you just need one pool\&. Note that the returned object "owns" the pool, i\&.e\&. if the object is freed, the pool is also freed\&. You can use the disown method to break this ownership relation\&.
 .SS "ATTRIBUTES"
 .sp
 .if n \{\
@@ -452,6 +452,21 @@ Look up a Repository by its id\&.
 .\}
 .sp
 Define which repository contains all the installed packages\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBconst char *errstr;\fR             /* read only */
+my \fI$err\fR \fB=\fR \fI$pool\fR\fB\->{errstr}\fR;
+\fIerr\fR \fB=\fR \fIpool\fR\fB\&.errstr\fR
+\fIerr\fR \fB=\fR \fIpool\fR\fB\&.errstr\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return the last error string that was stored in the pool\&.
 .SS "CONSTANTS"
 .PP
 \fBPOOL_FLAG_PROMOTEEPOCH\fR
@@ -461,7 +476,7 @@ Promote the epoch of the providing dependency to the requesting dependency if it
 .PP
 \fBPOOL_FLAG_FORBIDSELFCONFLICTS\fR
 .RS 4
-Disallow the installation of packages that conflict with themselfs\&. Debian always allowd self\-conflicting packages, rpm used to forbid them but switched to also allowing them recently\&.
+Disallow the installation of packages that conflict with themselves\&. Debian always allows self\-conflicting packages, rpm used to forbid them but switched to also allowing them recently\&.
 .RE
 .PP
 \fBPOOL_FLAG_OBSOLETEUSESPROVIDES\fR
@@ -476,7 +491,7 @@ An implicit obsoletes is the internal mechanism to remove the old package on an
 .PP
 \fBPOOL_FLAG_OBSOLETEUSESCOLORS\fR
 .RS 4
-Rpm\(cqs multilib implementation (used in RedHat and Fedora) distinguishes between 32bit and 64bit packages (the terminology is that they have a different color)\&. If obsolteusescolors is set, packages with different colors will not obsolete each other\&.
+Rpm\(cqs multilib implementation (used in RedHat and Fedora) distinguishes between 32bit and 64bit packages (the terminology is that they have a different color)\&. If obsoleteusescolors is set, packages with different colors will not obsolete each other\&.
 .RE
 .PP
 \fBPOOL_FLAG_IMPLICITOBSOLETEUSESCOLORS\fR
@@ -486,7 +501,7 @@ Same as POOL_FLAG_OBSOLETEUSESCOLORS, but used to find out if packages of the sa
 .PP
 \fBPOOL_FLAG_NOINSTALLEDOBSOLETES\fR
 .RS 4
-New versions of rpm consider the obsoletes of installed packages when checking for dependency, thus you may not install a package that is obsoleted by some other installed package, unless you also deinstall the other package\&.
+New versions of rpm consider the obsoletes of installed packages when checking for dependency, thus you may not install a package that is obsoleted by some other installed package, unless you also erase the other package\&.
 .RE
 .PP
 \fBPOOL_FLAG_HAVEDISTEPOCH\fR
@@ -518,7 +533,22 @@ Make the addfileprovides method only add files from the standard locations (i\&.
 .RE
 .\}
 .sp
-Free a pool\&. This is currently done with a method instead of relying on reference counting or garbage collection because it\(cqs hard to track every reference to a pool\&.
+Force a free of the pool\&. After this call, you must not access any object that still references the pool\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBvoid disown()\fR
+\fI$pool\fR\fB\->disown()\fR;
+\fIpool\fR\fB\&.disown()\fR
+\fIpool\fR\fB\&.disown()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Break the ownership relation betwen the binding object and the pool\&. After this call, the pool will not get freed even if the object goes out of scope\&. This also means that you must manually call the free method to free the pool data\&.
 .sp
 .if n \{\
 .RS 4
@@ -619,7 +649,7 @@ Set the architecture for your system\&. The architecture is used to determine wh
 .RE
 .\}
 .sp
-Add a Repository with the specified name to the pool\&. The reposiory is empty on creation, use the repository methods to populate it with packages\&.
+Add a Repository with the specified name to the pool\&. The repository is empty on creation, use the repository methods to populate it with packages\&.
 .sp
 .if n \{\
 .RS 4
@@ -707,7 +737,7 @@ Some package managers like rpm allow dependencies on files contained in other pa
 .RE
 .\}
 .sp
-Create the internal \(lqwhatprovides\(rq hash over all of the provides of all packages\&. This method must be called before doing any lookups on provides\&. It\(cqs encuraged to do it right after all repos are set up, usually right after the call to addfileprovides()\&.
+Create the internal \(lqwhatprovides\(rq hash over all of the provides of all packages\&. This method must be called before doing any lookups on provides\&. It\(cqs encouraged to do it right after all repos are set up, usually right after the call to addfileprovides()\&.
 .sp
 .if n \{\
 .RS 4
@@ -767,7 +797,7 @@ my \fI$bool\fR \fB=\fR \fI$pool\fR\fB\->isknownarch(\fR\fI$id\fR\fB)\fR;
 .RE
 .\}
 .sp
-Return true if the specified Id describs a known architecture\&.
+Return true if the specified Id describes a known architecture\&.
 .sp
 .if n \{\
 .RS 4
@@ -888,7 +918,7 @@ Get/Set fixed jobs stored in the pool\&. Those jobs are automatically appended t
 Set the callback function called when repository metadata needs to be loaded on demand\&. To make use of this feature, you need to create repodata stubs that tell the library which data is available but not loaded\&. If later on the data needs to be accessed, the callback function is called with a repodata argument\&. You can then load the data (maybe fetching it first from an remote server)\&. The callback should return true if the data has been made available\&.
 .SS "DATA RETRIEVAL METHODS"
 .sp
-In the following functions, the \fIkeyname\fR argument describes what to retrive\&. For the standard cases you can use the available Id constants\&. For example,
+In the following functions, the \fIkeyname\fR argument describes what to retrieve\&. For the standard cases you can use the available Id constants\&. For example,
 .sp
 .if n \{\
 .RS 4
@@ -988,7 +1018,20 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBDataiterator Dataiterator(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fImatch\fR\fB, int\fR \fIflags\fR\fB)\fR
+\fBDataiterator Dataiterator(Id\fR \fIkeyname\fR\fB, const char *\fR\fImatch\fR \fB= 0, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$di\fR \fB=\fR \fI$pool\fR\fB\->Dataiterator(\fR\fI$keyname\fR\fB,\fR \fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
+\fIdi\fR \fB=\fR \fIpool\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+\fIdi\fR \fB=\fR \fIpool\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDataiterator Dataiterator_solvid(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fImatch\fR \fB= 0, int\fR \fIflags\fR \fB= 0)\fR
 my \fI$di\fR \fB=\fR \fI$pool\fR\fB\->Dataiterator(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
 \fIdi\fR \fB=\fR \fIpool\fR\fB\&.Dataiterator(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
 \fIdi\fR \fB=\fR \fIpool\fR\fB\&.Dataiterator(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
@@ -1009,7 +1052,7 @@ my \fI$di\fR \fB=\fR \fI$pool\fR\fB\->Dataiterator(\fR\fI$solvid\fR\fB,\fR \fI$k
 .RE
 .\}
 .sp
-Iterate over the matching data elements\&. See the Dataiterator class for more information\&.
+Iterate over the matching data elements\&. See the Dataiterator class for more information\&. The Dataiterator method iterates over all solvables in the pool, whereas the Dataiterator_solvid only iterates over the specified solvable\&.
 .SS "ID METHODS"
 .sp
 The following methods deal with Ids, i\&.e\&. integers representing objects in the pool\&. They are considered \(lqlow level\(rq, in most cases you would not use them but instead the object orientated methods\&.
@@ -1272,7 +1315,7 @@ Same as calling the str() method\&.
 The dependencies are equal if they are part of the same pool and have the same ids\&.
 .SH "THE REPOSITORY CLASS"
 .sp
-A Repository describes a group of packages, normally comming from the same source\&. Repositories are created by the Pool\(cqs add_repo() method\&.
+A Repository describes a group of packages, normally coming from the same source\&. Repositories are created by the Pool\(cqs add_repo() method\&.
 .SS "ATTRIBUTES"
 .sp
 .if n \{\
@@ -1324,7 +1367,7 @@ The repositories name\&. To libsolv, the name is just a string with no specific
 .RS 4
 .\}
 .nf
-\fBint prioprity;\fR                  /* read/write */
+\fBint priority;\fR                   /* read/write */
 \fI$repo\fR\fB\->{priority}\fR
 \fIrepo\fR\fB\&.priority\fR
 \fIrepo\fR\fB\&.priority\fR
@@ -1339,7 +1382,7 @@ The priority of the repository\&. A higher number means that packages of this re
 .RS 4
 .\}
 .nf
-\fBint subprioprity;\fR               /* read/write */
+\fBint subpriority;\fR                /* read/write */
 \fI$repo\fR\fB\->{subpriority}\fR
 \fIrepo\fR\fB\&.subpriority\fR
 \fIrepo\fR\fB\&.subpriority\fR
@@ -1398,7 +1441,7 @@ Return a Datapos object of the repodata\(cqs metadata\&. You can use the lookup
 .PP
 \fBREPO_REUSE_REPODATA\fR
 .RS 4
-Reuse the last repository data aera (\(lqrepodata\(rq) instead of creating a new one\&.
+Reuse the last repository data area (\(lqrepodata\(rq) instead of creating a new one\&.
 .RE
 .PP
 \fBREPO_NO_INTERNALIZE\fR
@@ -1590,7 +1633,7 @@ my \fI$repodata\fR \fB=\fR \fI$repo\fR\fB\->first_repodata()\fR;
 .RE
 .\}
 .sp
-Checks if all repodatas but the first repodata are extensions, and return the first repodata if this is the case\&. Useful if you want to do a store/retrive sequence on the repository to reduce the memory using and enable paging, as this does not work if the rpository contains multiple non\-extension repodata areas\&.
+Checks if all repodatas but the first repodata are extensions, and return the first repodata if this is the case\&. Useful if you want to do a store/retrieve sequence on the repository to reduce the memory using and enable paging, as this does not work if the repository contains multiple non\-extension repodata areas\&.
 .sp
 .if n \{\
 .RS 4
@@ -1611,10 +1654,23 @@ Create a Selection consisting of all packages in the repository\&.
 .RS 4
 .\}
 .nf
-\fBDataiterator Dataiterator(Id\fR \fIp\fR\fB, Id\fR \fIkey\fR\fB, const char *\fR\fImatch\fR\fB, int\fR \fIflags\fR\fB)\fR
-my \fI$di\fR \fB=\fR \fI$repo\fR\fB\->Dataiterator(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
-\fIdi\fR \fB=\fR \fIrepo\fR\fB\&.Dataiterator(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
-\fIdi\fR \fB=\fR \fIrepo\fR\fB\&.Dataiterator(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+\fBDataiterator Dataiterator(Id\fR \fIkey\fR\fB, const char *\fR\fImatch\fR \fB= 0, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$di\fR \fB=\fR \fI$repo\fR\fB\->Dataiterator(\fR\fI$keyname\fR\fB,\fR \fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
+\fIdi\fR \fB=\fR \fIrepo\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+\fIdi\fR \fB=\fR \fIrepo\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDataiterator Dataiterator_meta(Id\fR \fIkey\fR\fB, const char *\fR\fImatch\fR \fB= 0, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$di\fR \fB=\fR \fI$repo\fR\fB\->Dataiterator_meta(\fR\fI$keyname\fR\fB,\fR \fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
+\fIdi\fR \fB=\fR \fIrepo\fR\fB\&.Dataiterator_meta(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+\fIdi\fR \fB=\fR \fIrepo\fR\fB\&.Dataiterator_meta(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1632,7 +1688,7 @@ my \fI$di\fR \fB=\fR \fI$repo\fR\fB\->Dataiterator(\fR\fI$solvid\fR\fB,\fR \fI$k
 .RE
 .\}
 .sp
-Iterate over the matching data elements in this repository\&. See the Dataiterator class for more information\&.
+Iterate over the matching data elements in this repository\&. See the Dataiterator class for more information\&. The Dataiterator() method iterates over all solvables in a repository, whereas the Dataiterator_meta method only iterates over the repository\(cqs meta data\&.
 .sp
 .if n \{\
 .RS 4
@@ -1685,9 +1741,9 @@ Add a single empty solvable to the repository\&. Returns a Solvable object, see
 .\}
 .nf
 \fBbool add_solv(const char *\fR\fIname\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_solv(\fR\fI$name\fR\fB,\fR \fI$flags\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_solv(\fR\fIname\fR\fB,\fR \fIflags\fR\fB)\fR
-\fIrepo\fR\fB\&.add_solv(\fR\fIname\fR\fB,\fR \fIflags\fR\fB)\fR
+\fI$repo\fR\fB\->add_solv(\fR\fI$name\fR\fB)\fR;
+\fIrepo\fR\fB\&.add_solv(\fR\fIname\fR\fB)\fR
+\fIrepo\fR\fB\&.add_solv(\fR\fIname\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1698,9 +1754,9 @@ Add a single empty solvable to the repository\&. Returns a Solvable object, see
 .\}
 .nf
 \fBbool add_solv(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_solv(\fR\fI$fp\fR\fB,\fR \fI$flags\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_solv(\fR\fIfp\fR\fB,\fR \fIflags\fR\fB)\fR
-\fIrepo\fR\fB\&.add_solv(\fR\fIfp\fR\fB,\fR \fIflags\fR\fB)\fR
+\fI$repo\fR\fB\->add_solv(\fR\fI$fp\fR\fB)\fR;
+\fIrepo\fR\fB\&.add_solv(\fR\fIfp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_solv(\fR\fIfp\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1713,9 +1769,9 @@ Read a \(lqsolv\(rq file and add its contents to the repository\&. These files c
 .\}
 .nf
 \fBbool add_rpmdb(int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_rpmdb(\fR\fI$flags\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_rpmdb(\fR\fIflags\fR\fB)\fR
-\fIrepo\fR\fB\&.add_rpmdb(\fR\fIflags\fR\fB)\fR
+\fI$repo\fR\fB\->add_rpmdb()\fR;
+\fIrepo\fR\fB\&.add_rpmdb()\fR
+\fIrepo\fR\fB\&.add_rpmdb()\fR
 .fi
 .if n \{\
 .RE
@@ -1726,9 +1782,9 @@ Read a \(lqsolv\(rq file and add its contents to the repository\&. These files c
 .\}
 .nf
 \fBbool add_rpmdb_reffp(FILE *\fR\fIreffp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_rpmdb_reffp(\fR\fI$reffp\fR\fB,\fR \fI$flags\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_rpmdb_reffp(\fR\fI$reffp\fR\fB,\fR \fIflags\fR\fB)\fR
-\fIrepo\fR\fB\&.add_rpmdb_reffp(\fR\fI$reffp\fR\fB,\fR \fIflags\fR\fB)\fR
+\fI$repo\fR\fB\->add_rpmdb_reffp(\fR\fI$reffp\fR\fB)\fR;
+\fIrepo\fR\fB\&.add_rpmdb_reffp(\fR\fIreffp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_rpmdb_reffp(\fR\fIreffp\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1740,10 +1796,10 @@ Add the contents of the rpm database to the repository\&. If a solv file contain
 .RS 4
 .\}
 .nf
-\fBbool add_rpm(const char *\fR\fIname\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_rpm(\fR\fI$name\fR\fB,\fR \fI$flags\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_rpm(\fR\fIname\fR\fB,\fR \fIflags\fR\fB)\fR
-\fIrepo\fR\fB\&.add_rpm(\fR\fIname\fR\fB,\fR \fIflags\fR\fB)\fR
+\fBSolvable add_rpm(const char *\fR\fIfilename\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$solvable\fR \fB=\fR \fI$repo\fR\fB\->add_rpm(\fR\fI$filename\fR\fB)\fR;
+\fIsolvable\fR \fB=\fR \fIrepo\fR\fB\&.add_rpm(\fR\fIfilename\fR\fB)\fR
+\fIsolvable\fR \fB=\fR \fIrepo\fR\fB\&.add_rpm(\fR\fIfilename\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1770,10 +1826,10 @@ Add all pubkeys contained in the rpm database to the repository\&. Note that new
 .RS 4
 .\}
 .nf
-\fBbool add_pubkey(const char *\fR\fIkeyfile\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_pubkey(\fR\fI$keyfile\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_pubkey(\fR\fI$keyfile\fR\fB)\fR
-\fIrepo\fR\fB\&.add_pubkey(\fR\fI$keyfile\fR\fB)\fR
+\fBSolvable add_pubkey(const char *\fR\fIkeyfile\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$solvable\fR \fB=\fR \fI$repo\fR\fB\->add_pubkey(\fR\fI$keyfile\fR\fB)\fR;
+\fIsolvable\fR \fB=\fR \fIrepo\fR\fB\&.add_pubkey(\fR\fIkeyfile\fR\fB)\fR
+\fIsolvable\fR \fB=\fR \fIrepo\fR\fB\&.add_pubkey(\fR\fIkeyfile\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1786,9 +1842,9 @@ Add a pubkey from a file to the repository\&.
 .\}
 .nf
 \fBbool add_rpmmd(FILE *\fR\fIfp\fR\fB, const char *\fR\fIlanguage\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_rpmmd(\fR\fI$fp\fR\fB,\fR \fI$language\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_rpmmd(\fR\fIfp\fR\fB,\fR \fIlanguage\fR\fB)\fR
-\fIrepo\fR\fB\&.add_rpmmd(\fR\fIfp\fR\fB,\fR \fIlanguage\fR\fB)\fR
+\fI$repo\fR\fB\->add_rpmmd(\fR\fI$fp\fR\fB,\fR \fIundef\fR\fB)\fR;
+\fIrepo\fR\fB\&.add_rpmmd(\fR\fIfp\fR\fB,\fR \fINone\fR\fB)\fR
+\fIrepo\fR\fB\&.add_rpmmd(\fR\fIfp\fR\fB,\fR \fInil\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1875,10 +1931,10 @@ Add the contents of the debian repository metadata (the "packages" file) to the
 .RS 4
 .\}
 .nf
-\fBbool add_deb(const char *\fR\fIfilename\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
-\fI$repo\fR\fB\->add_deb(\fR\fI$filename\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_deb(\fR\fIfilename\fR\fB)\fR
-\fIrepo\fR\fB\&.add_deb(\fR\fIfilename\fR\fB)\fR
+\fBSolvable add_deb(const char *\fR\fIfilename\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$solvable\fR \fB=\fR \fI$repo\fR\fB\->add_deb(\fR\fI$filename\fR\fB)\fR;
+\fIsolvable\fR \fB=\fR \fIrepo\fR\fB\&.add_deb(\fR\fIfilename\fR\fB)\fR
+\fIsolvable\fR \fB=\fR \fIrepo\fR\fB\&.add_deb(\fR\fIfilename\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1892,8 +1948,8 @@ Add the metadata of a single deb package to the repository\&.
 .nf
 \fBbool add_mdk(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
 \fI$repo\fR\fB\->add_mdk(\fR\fI$fp\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_mdk(\fR\fI$fp\fR\fB)\fR
-\fIrepo\fR\fB\&.add_mdk(\fR\fI$fp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_mdk(\fR\fIfp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_mdk(\fR\fIfp\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1907,8 +1963,8 @@ Add the contents of the mageia/mandriva repository metadata (the "synthesis\&.hd
 .nf
 \fBbool add_mdk_info(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
 \fI$repo\fR\fB\->add_mdk(\fR\fI$fp\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_mdk(\fR\fI$fp\fR\fB)\fR
-\fIrepo\fR\fB\&.add_mdk(\fR\fI$fp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_mdk(\fR\fIfp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_mdk(\fR\fIfp\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1922,8 +1978,8 @@ Extend the packages from the synthesis file with the info\&.xml and files\&.xml
 .nf
 \fBbool add_arch_repo(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
 \fI$repo\fR\fB\->add_arch_repo(\fR\fI$fp\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_arch_repo(\fR\fI$fp\fR\fB)\fR
-\fIrepo\fR\fB\&.add_arch_repo(\fR\fI$fp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_arch_repo(\fR\fIfp\fR\fB)\fR
+\fIrepo\fR\fB\&.add_arch_repo(\fR\fIfp\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -1937,8 +1993,8 @@ Add the contents of the archlinux repository metadata (the "\&.db\&.tar" file) t
 .nf
 \fBbool add_arch_local(const char *\fR\fIdir\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
 \fI$repo\fR\fB\->add_arch_local(\fR\fI$dir\fR\fB)\fR;
-\fIrepo\fR\fB\&.add_arch_local(\fR\fI$dir\fR\fB)\fR
-\fIrepo\fR\fB\&.add_arch_local(\fR\fI$dir\fR\fB)\fR
+\fIrepo\fR\fB\&.add_arch_local(\fR\fIdir\fR\fB)\fR
+\fIrepo\fR\fB\&.add_arch_local(\fR\fIdir\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -2240,7 +2296,7 @@ my \fI@deps\fR \fB=\fR \fI$solvable\fR\fB\->lookup_deparray(\fR\fI$keyname\fR\fB
 .RE
 .\}
 .sp
-Generic lookup methods\&. Retrieve data stored for the specific keyname\&. The lookup_idarray() method will return an array of Ids, use lookup_deparray if you want an array of Dependency objects instead\&. Some Id arrays contain two parts of data divided by a specific marker, for example the provides array uses the SOLVABLE_FILEMARKER id to store both the ids provided by the package and the ids added by the addfileprovides method\&. The default, \-1, translates to the correct marker for the keyname and returns the first part of the array, use 1 to select the second part or 0 to retrive all ids including the marker\&.
+Generic lookup methods\&. Retrieve data stored for the specific keyname\&. The lookup_idarray() method will return an array of Ids, use lookup_deparray if you want an array of Dependency objects instead\&. Some Id arrays contain two parts of data divided by a specific marker, for example the provides array uses the SOLVABLE_FILEMARKER id to store both the ids provided by the package and the ids added by the addfileprovides method\&. The default, \-1, translates to the correct marker for the keyname and returns the first part of the array, use 1 to select the second part or 0 to retrieve all ids including the marker\&.
 .sp
 .if n \{\
 .RS 4
@@ -2261,6 +2317,33 @@ Return a tuple containing the on\-media location and an optional media number fo
 .RS 4
 .\}
 .nf
+\fBDataiterator Dataiterator(Id\fR \fIkeyname\fR\fB, const char *\fR\fImatch\fR \fB= 0, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$di\fR \fB=\fR \fI$solvable\fR\fB\->Dataiterator(\fR\fI$keyname\fR\fB,\fR \fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
+\fIdi\fR \fB=\fR \fIsolvable\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+\fIdi\fR \fB=\fR \fIsolvable\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBfor my\fR \fI$d\fR \fB(\fR\fI@$di\fR\fB)\fR
+\fBfor\fR \fId\fR \fBin\fR \fIdi\fR\fB:\fR
+\fBfor\fR \fId\fR \fBin\fR \fIdi\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Iterate over the matching data elements\&. See the Dataiterator class for more information\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
 \fBvoid add_deparray(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR;
 \fI$solvable\fR\fB\->add_deparray(\fR\fI$keyname\fR\fB,\fR \fI$dep\fR\fB)\fR;
 \fIsolvable\fR\fB\&.add_deparray(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
@@ -2276,6 +2359,21 @@ Add a new dependency to the attributes stored in keyname\&.
 .RS 4
 .\}
 .nf
+\fBvoid unset(Id\fR \fIkeyname\fR\fB)\fR;
+\fI$solvable\fR\fB\->unset(\fR\fI$keyname\fR\fB)\fR;
+\fIsolvable\fR\fB\&.unset(\fR\fIkeyname\fR\fB)\fR
+\fIsolvable\fR\fB\&.unset(\fR\fIkeyname\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Delete data stored for the specific keyname\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
 \fBbool installable()\fR;
 \fI$solvable\fR\fB\->installable()\fR
 \fIsolvable\fR\fB\&.installable()\fR
@@ -2306,6 +2404,36 @@ Return true if the solvable is installed on the system\&.
 .RS 4
 .\}
 .nf
+\fBbool identical(Solvable *\fR\fIother\fR\fB)\fR
+\fI$solvable\fR\fB\->identical(\fR\fI$other\fR\fB)\fR
+\fI$solvable\fR\fB\&.identical(\fR\fIother\fR\fB)\fR
+\fI$solvable\fR\fB\&.identical?(\fR\fIother\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return true if the two solvables are identical\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint evrcmp(Solvable *\fR\fIother\fR\fB)\fR
+\fI$solvable\fR\fB\->evrcmp(\fR\fIother\fR\fB)\fR
+\fI$solvable\fR\fB\&.evrcmp(\fR\fIother\fR\fB)\fR
+\fI$solvable\fR\fB\&.evrcmp(\fR\fIother\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Returns \-1 if the epoch/version/release of the solvable is less then the one from the other solvable, 1 if it is greater, and 0 if they are equal\&. Note that "equal" does not mean that the evr is identical\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
 \fBSelection Selection(int\fR \fIsetflags\fR \fB= 0)\fR
 my \fI$sel\fR \fB=\fR \fI$solvable\fR\fB\->Selection()\fR;
 \fIsel\fR \fB=\fR \fIsolvable\fR\fB\&.Selection()\fR
@@ -2525,16 +2653,15 @@ The solvable containing the value that was matched\&.
 .\}
 .sp
 The id of the solvable that matched\&.
-.SS "METHODS"
 .sp
 .if n \{\
 .RS 4
 .\}
 .nf
-\fBId key_id()\fR;
-\fI$d\fR\fB\->key_id()\fR
-\fId\fR\fB\&.key_id()\fR
-\fId\fR\fB\&.key_id()\fR
+\fBId\fR \fIkey_id\fR;
+\fI$d\fR\fB\->{\fR\fIkey_id\fR\fB}\fR
+\fId\fR\fB\&.key_id\fR
+\fId\fR\fB\&.key_id\fR
 .fi
 .if n \{\
 .RE
@@ -2544,10 +2671,10 @@ The id of the solvable that matched\&.
 .RS 4
 .\}
 .nf
-\fBconst char *key_idstr()\fR;
-\fI$d\fR\fB\->key_idstr()\fR
-\fId\fR\fB\&.key_idstr()\fR
-\fId\fR\fB\&.key_idstr()\fR
+\fBconst char *\fR\fIkey_idstr\fR;
+\fI$d\fR\fB\->{\fR\fIkey_idstr\fR\fB}\fR
+\fId\fR\fB\&.key_idstr\fR
+\fId\fR\fB\&.key_idstr\fR
 .fi
 .if n \{\
 .RE
@@ -2559,10 +2686,10 @@ The keyname that matched, either as id or string\&.
 .RS 4
 .\}
 .nf
-\fBId type_id()\fR;
-\fI$d\fR\fB\->type_id()\fR
-\fId\fR\fB\&.type_id()\fR
-\fId\fR\fB\&.type_id()\fR
+\fBId\fR \fItype_id\fR;
+\fI$d\fR\fB\->{\fR\fItype_id\fR\fB}\fR
+\fId\fR\fB\&.type_id\fR
+\fId\fR\fB\&.type_id\fR
 .fi
 .if n \{\
 .RE
@@ -2572,10 +2699,10 @@ The keyname that matched, either as id or string\&.
 .RS 4
 .\}
 .nf
-\fBconst char *type_idstr()\fR;
-\fI$d\fR\fB\->type_idstr()\fR;
-\fId\fR\fB\&.type_idstr()\fR
-\fId\fR\fB\&.type_idstr()\fR
+\fBconst char *\fR\fItype_idstr\fR;
+\fI$d\fR\fB\->{\fR\fItype_idstr\fR\fB}\fR;
+\fId\fR\fB\&.type_idstr\fR
+\fId\fR\fB\&.type_idstr\fR
 .fi
 .if n \{\
 .RE
@@ -2587,10 +2714,10 @@ The key type of the value that was matched, either as id or string\&.
 .RS 4
 .\}
 .nf
-\fBId id()\fR;
-\fI$d\fR\fB\->id()\fR
-\fId\fR\fB\&.id()\fR
-\fId\fR\fB\&.id()\fR
+\fBId\fR \fIid\fR;
+\fI$d\fR\fB\->{id}\fR
+\fId\fR\fB\&.id\fR
+\fId\fR\fB\&.id\fR
 .fi
 .if n \{\
 .RE
@@ -2600,10 +2727,10 @@ The key type of the value that was matched, either as id or string\&.
 .RS 4
 .\}
 .nf
-\fBId idstr()\fR;
-\fI$d\fR\fB\->idstr()\fR
-\fId\fR\fB\&.idstr()\fR
-\fId\fR\fB\&.idstr()\fR
+\fBId\fR \fIidstr\fR;
+\fI$d\fR\fB\->{idstr}\fR
+\fId\fR\fB\&.idstr\fR
+\fId\fR\fB\&.idstr\fR
 .fi
 .if n \{\
 .RE
@@ -2615,10 +2742,10 @@ The Id of the value that was matched (only valid for id types), either as id or
 .RS 4
 .\}
 .nf
-\fBconst char *str()\fR;
-\fI$d\fR\fB\->str()\fR
-\fId\fR\fB\&.str()\fR
-\fId\fR\fB\&.str()\fR
+\fBconst char *\fR\fIstr\fR;
+\fI$d\fR\fB\->{str}\fR
+\fId\fR\fB\&.str\fR
+\fId\fR\fB\&.str\fR
 .fi
 .if n \{\
 .RE
@@ -2630,10 +2757,10 @@ The string value that was matched (only valid for string types)\&.
 .RS 4
 .\}
 .nf
-\fBunsigned long long num()\fR;
-\fI$d\fR\fB\->num()\fR
-\fId\fR\fB\&.num()\fR
-\fId\fR\fB\&.num()\fR
+\fBunsigned long long\fR \fInum\fR;
+\fI$d\fR\fB\->{num}\fR
+\fId\fR\fB\&.num\fR
+\fId\fR\fB\&.num\fR
 .fi
 .if n \{\
 .RE
@@ -2645,10 +2772,10 @@ The numeric value that was matched (only valid for numeric types)\&.
 .RS 4
 .\}
 .nf
-\fBunsigned int num2()\fR;
-\fI$d\fR\fB\->num2()\fR
-\fId\fR\fB\&.num2()\fR
-\fId\fR\fB\&.num2()\fR
+\fBunsigned int\fR \fInum2\fR;
+\fI$d\fR\fB\->{num2}\fR
+\fId\fR\fB\&.num2\fR
+\fId\fR\fB\&.num2\fR
 .fi
 .if n \{\
 .RE
@@ -2660,6 +2787,22 @@ The secondary numeric value that was matched (only valid for types containing tw
 .RS 4
 .\}
 .nf
+\fBunsigned int\fR \fIbinary\fR;
+\fI$d\fR\fB\->{binary}\fR
+\fId\fR\fB\&.binary\fR
+\fId\fR\fB\&.binary\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The value in binary form, useful for checksums and other data that cannot be represented as a string\&.
+.SS "METHODS"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
 \fBDatapos pos()\fR;
 my \fI$pos\fR \fB=\fR \fI$d\fR\fB\->pos()\fR;
 \fIpos\fR \fB=\fR \fId\fR\fB\&.pos()\fR
@@ -2707,17 +2850,17 @@ Selections are a way to easily deal with sets of packages\&. There are multiple
 .PP
 \fBSELECTION_NAME\fR
 .RS 4
-Create the selection by matching package names
+Create the selection by matching package names\&.
 .RE
 .PP
 \fBSELECTION_PROVIDES\fR
 .RS 4
-Create the selection by matching package provides
+Create the selection by matching package provides\&.
 .RE
 .PP
 \fBSELECTION_FILELIST\fR
 .RS 4
-Create the selection by matching package files
+Create the selection by matching package files\&.
 .RE
 .PP
 \fBSELECTION_CANON\fR
@@ -2972,7 +3115,7 @@ Allow to break the dependencies of the matching packages\&. Handle with care\&.
 .PP
 \fBSOLVER_MULTIVERSION\fR
 .RS 4
-Mark the matched packages for multiversion install\&. If they get to be installed because of some other job, the installation will keep the old version of the package installed (for rpm by using \(oq`\-i\*(Aq\*(Aq instead of ``\-U\(cq\*(Aq)\&.
+Mark the matched packages for multiversion install\&. If they get to be installed because of some other job, the installation will keep the old version of the package installed (for rpm this is done by using \(lq\-i\(rq instead of \(lq\-U\(rq)\&.
 .RE
 .PP
 \fBSOLVER_LOCK\fR
@@ -2982,7 +3125,7 @@ Do not change the state of the matched packages, i\&.e\&. when they are installe
 .PP
 \fBSOLVER_DISTUPGRADE\fR
 .RS 4
-Update the matching installed packages to the best version included in one of the repositories\&. After this operation, all come from one of the available repositories except orphaned packages\&. Orphaned packages are packages that have no relation to the packages in the repositories, i\&.e\&. no package in the repositories have the same name or obsolete the orphaned package\&. This action brings the installed packages in sync with the ones in the repository\&. It also turns of arch/vendor/version locking for the affected packages to simulate a fresh installation\&. This means that distupgrade can actually downgrade packages if only lower versions of a package are available in the repositories\&.
+Update the matching installed packages to the best version included in one of the repositories\&. After this operation, all come from one of the available repositories except orphaned packages\&. Orphaned packages are packages that have no relation to the packages in the repositories, i\&.e\&. no package in the repositories have the same name or obsolete the orphaned package\&. This action brings the installed packages in sync with the ones in the repository\&. By default it also turns of arch/vendor/version locking for the affected packages to simulate a fresh installation\&. This means that distupgrade can actually downgrade packages if only lower versions of a package are available in the repositories\&. You can tweak this behavior with the SOLVER_FLAG_DUP_ solver flags\&.
 .RE
 .PP
 \fBSOLVER_DROP_ORPHANED\fR
@@ -2997,7 +3140,7 @@ Fix dependency problems of matching installed packages\&. The default is to igno
 .PP
 \fBSOLVER_USERINSTALLED\fR
 .RS 4
-The matching installed packages are considered to be installed by a user, thus not installed to fulfil some dependency\&. This is needed input for the calculation of unneeded packages for jobs that have the SOLVER_CLEANDEPS flag set\&.
+The matching installed packages are considered to be installed by a user, thus not installed to fulfill some dependency\&. This is needed input for the calculation of unneeded packages for jobs that have the SOLVER_CLEANDEPS flag set\&.
 .RE
 .PP
 \fBSOLVER_JOBMASK\fR
@@ -3009,7 +3152,7 @@ Action modifier constants:
 .PP
 \fBSOLVER_WEAK\fR
 .RS 4
-Makes the job a weak job\&. The solver tries to fulfil weak jobs, but does not report a problem if it is not possible to do so\&.
+Makes the job a weak job\&. The solver tries to fulfill weak jobs, but does not report a problem if it is not possible to do so\&.
 .RE
 .PP
 \fBSOLVER_ESSENTIAL\fR
@@ -3211,7 +3354,7 @@ So if a package "screen\-1\-1" is installed for the x86_64 architecture and vers
 Dependency solving is what this library is about\&. A solver object is needed for solving to store the result of the solver run\&. The solver object can be used multiple times for different jobs, reusing it allows the solver to re\-use the dependency rules it already computed\&.
 .SS "CONSTANTS"
 .sp
-Flags to modify some of the solver\(cqs behaviour:
+Flags to modify some of the solver\(cqs behavior:
 .PP
 \fBSOLVER_FLAG_ALLOW_DOWNGRADE\fR
 .RS 4
@@ -3235,7 +3378,27 @@ Allow the solver to change the name of an installed package, i\&.e\&. install a
 .PP
 \fBSOLVER_FLAG_ALLOW_UNINSTALL\fR
 .RS 4
-Allow the solver to deinstall installed packages to fulfil the jobs\&. This flag also includes the above flags\&. You may want to set this flag if you only have SOLVER_ERASE jobs, as in that case it\(cqs better for the user to check the transaction overview instead of approving every single package that needs to be deinstalled\&.
+Allow the solver to erase installed packages to fulfill the jobs\&. This flag also includes the above flags\&. You may want to set this flag if you only have SOLVER_ERASE jobs, as in that case it\(cqs better for the user to check the transaction overview instead of approving every single package that needs to be erased\&.
+.RE
+.PP
+\fBSOLVER_FLAG_DUP_ALLOW_DOWNGRADE\fR
+.RS 4
+Like SOLVER_FLAG_ALLOW_DOWNGRADE, but used in distupgrade mode\&.
+.RE
+.PP
+\fBSOLVER_FLAG_DUP_ALLOW_ARCHCHANGE\fR
+.RS 4
+Like SOLVER_FLAG_ALLOW_ARCHCHANGE, but used in distupgrade mode\&.
+.RE
+.PP
+\fBSOLVER_FLAG_DUP_ALLOW_VENDORCHANGE\fR
+.RS 4
+Like SOLVER_FLAG_ALLOW_VENDORCHANGE, but used in distupgrade mode\&.
+.RE
+.PP
+\fBSOLVER_FLAG_DUP_ALLOW_NAMECHANGE\fR
+.RS 4
+Like SOLVER_FLAG_ALLOW_NAMECHANGE, but used in distupgrade mode\&.
 .RE
 .PP
 \fBSOLVER_FLAG_NO_UPDATEPROVIDE\fR
@@ -3255,7 +3418,7 @@ Do not process optional (aka weak) dependencies\&.
 .PP
 \fBSOLVER_FLAG_ADD_ALREADY_RECOMMENDED\fR
 .RS 4
-Install recommened or supplemented packages even if they have no connection to the current transaction\&. You can use this feature to implement a simple way for the user to install new recommended packages that were not available in the past\&.
+Install recommended or supplemented packages even if they have no connection to the current transaction\&. You can use this feature to implement a simple way for the user to install new recommended packages that were not available in the past\&.
 .RE
 .PP
 \fBSOLVER_FLAG_NO_INFARCHCHECK\fR
@@ -3292,7 +3455,7 @@ A rule to implement the update policy of installed packages\&. Every installed p
 .PP
 \fBSOLVER_RULE_FEATURE\fR
 .RS 4
-Feature rules are fallback rules used when a update rule is disabled\&. They include all packages that may replace the installed package ignoring the update policy, i\&.e\&. they contain downgrades, arch changes and so on\&. Without them, the solver would simply deinstall installed packages if their update rule gets disabled\&.
+Feature rules are fallback rules used when a update rule is disabled\&. They include all packages that may replace the installed package ignoring the update policy, i\&.e\&. they contain downgrades, arch changes and so on\&. Without them, the solver would simply erase installed packages if their update rule gets disabled\&.
 .RE
 .PP
 \fBSOLVER_RULE_JOB\fR
@@ -3312,7 +3475,7 @@ Infarch rules are also negative assertions, they disallow the installation of pa
 .PP
 \fBSOLVER_RULE_CHOICE\fR
 .RS 4
-Choice rules are used to make sure that the solver preferes updating to installing different packages when some dependency is provided by multiple packages with different names\&. The solver may always break choice rules, so you will not see them when a problem is found\&.
+Choice rules are used to make sure that the solver prefers updating to installing different packages when some dependency is provided by multiple packages with different names\&. The solver may always break choice rules, so you will not see them when a problem is found\&.
 .RE
 .PP
 \fBSOLVER_RULE_LEARNT\fR
@@ -3329,7 +3492,7 @@ This rule was added to prevent the installation of a package of an architecture
 .PP
 \fBSOLVER_RULE_RPM_NOTHING_PROVIDES_DEP\fR
 .RS 4
-The package contanis a required dependency which was not provided by any package\&.
+The package contains a required dependency which was not provided by any package\&.
 .RE
 .PP
 \fBSOLVER_RULE_RPM_PACKAGE_REQUIRES\fR
@@ -3406,7 +3569,7 @@ The solver ask for permission before changing the vendor of installed packages\&
 .PP
 \fBPOLICY_ILLEGAL_NAMECHANGE\fR
 .RS 4
-The solver ask for permission before replacing an installed packages with a packge that has a different name\&.
+The solver ask for permission before replacing an installed packages with a package that has a different name\&.
 .RE
 .sp
 Solution element type constants
@@ -3465,6 +3628,63 @@ The problem can be solved by allowing to replace the package with some other pac
 .RS 4
 The problem can be solved by allowing to replace the package with some other package that has a different name\&.
 .RE
+.sp
+Reason constants
+.PP
+\fBSOLVER_REASON_UNRELATED\fR
+.RS 4
+The package status did not change as it was not related to any job\&.
+.RE
+.PP
+\fBSOLVER_REASON_UNIT_RULE\fR
+.RS 4
+The package was installed/erased/kept because of a unit rule, i\&.e\&. a rule where all literals but one were false\&.
+.RE
+.PP
+\fBSOLVER_REASON_KEEP_INSTALLED\fR
+.RS 4
+The package was chosen when trying to keep as many packages installed as possible\&.
+.RE
+.PP
+\fBSOLVER_REASON_RESOLVE_JOB\fR
+.RS 4
+The decision happened to fulfill a job rule\&.
+.RE
+.PP
+\fBSOLVER_REASON_UPDATE_INSTALLED\fR
+.RS 4
+The decision happened to fulfill a package update request\&.
+.RE
+.PP
+\fBSOLVER_REASON_CLEANDEPS_ERASE\fR
+.RS 4
+The package was erased when cleaning up dependencies from other erased packages\&.
+.RE
+.PP
+\fBSOLVER_REASON_RESOLVE\fR
+.RS 4
+The package was installed to fulfill package dependencies\&.
+.RE
+.PP
+\fBSOLVER_REASON_WEAKDEP\fR
+.RS 4
+The package was installed because of a weak dependency (Recommends or Supplements)\&.
+.RE
+.PP
+\fBSOLVER_REASON_RESOLVE_ORPHAN\fR
+.RS 4
+The decision about the package was made when deciding the fate of orphaned packages\&.
+.RE
+.PP
+\fBSOLVER_REASON_RECOMMENDED\fR
+.RS 4
+This is a special case of SOLVER_REASON_WEAKDEP\&.
+.RE
+.PP
+\fBSOLVER_REASON_SUPPLEMENTED\fR
+.RS 4
+This is a special case of SOLVER_REASON_WEAKDEP\&.
+.RE
 .SS "ATTRIBUTES"
 .sp
 .if n \{\
@@ -3488,9 +3708,9 @@ Back pointer to pool\&.
 .\}
 .nf
 \fBint set_flag(int\fR \fIflag\fR\fB, int\fR \fIvalue\fR\fB)\fR
-my \fI$oldvalue\fR \fB=\fR \fI$pool\fR\fB\->set_flag(\fR\fI$flag\fR\fB,\fR \fI$value\fR\fB)\fR;
-\fIoldvalue\fR \fB=\fR \fIpool\fR\fB\&.set_flag(\fR\fIflag\fR\fB,\fR \fIvalue\fR\fB)\fR
-\fIoldvalue\fR \fB=\fR \fIpool\fR\fB\&.set_flag(\fR\fIflag\fR\fB,\fR \fIvalue\fR\fB)\fR
+my \fI$oldvalue\fR \fB=\fR \fI$solver\fR\fB\->set_flag(\fR\fI$flag\fR\fB,\fR \fI$value\fR\fB)\fR;
+\fIoldvalue\fR \fB=\fR \fIsolver\fR\fB\&.set_flag(\fR\fIflag\fR\fB,\fR \fIvalue\fR\fB)\fR
+\fIoldvalue\fR \fB=\fR \fIsolver\fR\fB\&.set_flag(\fR\fIflag\fR\fB,\fR \fIvalue\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -3501,9 +3721,9 @@ my \fI$oldvalue\fR \fB=\fR \fI$pool\fR\fB\->set_flag(\fR\fI$flag\fR\fB,\fR \fI$v
 .\}
 .nf
 \fBint get_flag(int\fR \fIflag\fR\fB)\fR
-my \fI$value\fR \fB=\fR \fI$pool\fR\fB\->get_flag(\fR\fI$flag\fR\fB)\fR;
-\fIvalue\fR \fB=\fR \fIpool\fR\fB\&.get_flag(\fR\fIflag\fR\fB)\fR
-\fIvalue\fR \fB=\fR \fIpool\fR\fB\&.get_flag(\fR\fIflag\fR\fB)\fR
+my \fI$value\fR \fB=\fR \fI$solver\fR\fB\->get_flag(\fR\fI$flag\fR\fB)\fR;
+\fIvalue\fR \fB=\fR \fIsolver\fR\fB\&.get_flag(\fR\fIflag\fR\fB)\fR
+\fIvalue\fR \fB=\fR \fIsolver\fR\fB\&.get_flag(\fR\fIflag\fR\fB)\fR
 .fi
 .if n \{\
 .RE
@@ -3540,6 +3760,21 @@ my \fI$trans\fR \fB=\fR \fI$solver\fR\fB\->transaction()\fR;
 .\}
 .sp
 Return the transaction to implement the calculated package changes\&. A transaction is available even if problems were found, this is useful for interactive user interfaces that show both the job result and the problems\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint\fR \fIreason\fR \fB= describe_decision(Solvable *\fR\fIs\fR\fB, Rule *\fR\fIOUTPUT\fR\fB)\fR
+my \fB(\fR\fI$reason\fR\fB,\fR \fI$rule\fR\fB) =\fR \fI$solver\fR\fB\->describe_decision(\fR\fI$solvable\fR\fB)\fR;
+\fB(\fR\fIreason\fR\fB,\fR \fIrule\fR\fB) =\fR \fIsolver\fR\fB\&.describe_decision(\fR\fIsolvable\fR\fB)\fR
+\fB(\fR\fIreason\fR\fB,\fR \fIrule\fR\fB) =\fR \fIsolver\fR\fB\&.describe_decision(\fR\fIsolvable\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return the reason why a specific solvable was installed or erased\&. For most of the reasons the rule that triggered the decision is also returned\&.
 .SH "THE PROBLEM CLASS"
 .sp
 Problems are the way of the solver to interact with the user\&. You can simply list all problems and terminate your program, but a better way is to present solutions to the user and let him pick the ones he likes\&.
@@ -3589,7 +3824,7 @@ my \fI$probrule\fR \fB=\fR \fI$problem\fR\fB\->findproblemrule()\fR;
 .RE
 .\}
 .sp
-Return the rule that caused the problem\&. Of cource in most situations there is no single responsible rule, but many rules that interconnect with each created the problem\&. Nevertheless, the solver uses some heuristic approch to find a rule that somewhat describes the problem best to the user\&.
+Return the rule that caused the problem\&. Of course in most situations there is no single responsible rule, but many rules that interconnect with each created the problem\&. Nevertheless, the solver uses some heuristic approach to find a rule that somewhat describes the problem best to the user\&.
 .sp
 .if n \{\
 .RS 4
@@ -3635,6 +3870,21 @@ my \fI$cnt\fR \fB=\fR \fI$problem\fR\fB\->solution_count()\fR;
 .\}
 .sp
 Return the number of solutions without creating solution objects\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$problem\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIproblem\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIproblem\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing the problem\&. This is a convenience function, it is a shorthand for calling findproblemrule(), then ruleinfo() on the problem rule and problemstr() on the ruleinfo object\&.
 .SH "THE RULE CLASS"
 .sp
 Rules are the basic block of sat solving\&. Each package dependency gets translated into one or multiple rules\&.
@@ -3903,7 +4153,7 @@ my \fI@solutionelements\fR \fB=\fR \fI$solution\fR\fB\->elements()\fR;
 .RE
 .\}
 .sp
-Return an array containing the elements describing what neeeds to be done to implement the specific solution\&. If expandreplaces is true, elements of type SOLVER_SOLUTION_REPLACE will be replaced by one or more elements replace elements describing the policy mismatches\&.
+Return an array containing the elements describing what needs to be done to implement the specific solution\&. If expandreplaces is true, elements of type SOLVER_SOLUTION_REPLACE will be replaced by one or more elements replace elements describing the policy mismatches\&.
 .sp
 .if n \{\
 .RS 4
@@ -4118,7 +4368,7 @@ This element does nothing\&. Used to map element types that do not match the vie
 .PP
 \fBSOLVER_TRANSACTION_INSTALL\fR
 .RS 4
-This element installes a package\&.
+This element installs a package\&.
 .RE
 .PP
 \fBSOLVER_TRANSACTION_ERASE\fR
@@ -4454,7 +4704,7 @@ erase  B
 .RE
 .\}
 .sp
-in active mode\&. If the mode containes SOLVER_TRANSACTION_SHOW_ALL, the passive mode list will be unchanged but the active mode list will just contain A\-2\-1\&.
+in active mode\&. If the mode contains SOLVER_TRANSACTION_SHOW_ALL, the passive mode list will be unchanged but the active mode list will just contain A\-2\-1\&.
 .SH "THE TRANSACTIONCLASS CLASS"
 .sp
 Objects of this type are returned by the classify() Transaction method\&.
@@ -4740,6 +4990,21 @@ Finalize the checksum and return the result as hex string\&.
 .RS 4
 .\}
 .nf
+\fBconst char *typestr()\fR
+my \fI$typestr\fR \fB=\fR \fI$chksum\fR\fB\->typestr()\fR;
+\fItypestr\fR \fB=\fR \fIchksum\fR\fB\&.typestr\fR
+\fItypestr\fR \fB=\fR \fIchksum\fR\fB\&.typestr\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return the type of the checksum as a string, e\&.g\&. "sha256"\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
 \fB<equality>\fR
 \fBif (\fR\fI$chksum1\fR \fB==\fR \fI$chksum2\fR\fB)\fR
 \fBif\fR \fIchksum1\fR \fB==\fR \fIchksum2\fR\fB:\fR
@@ -4861,7 +5126,7 @@ Flush the file\&. Returns false if there was an error\&. Flushing a closed file
 Close the file\&. This is needed for languages like Ruby, that do not destruct objects right after they are no longer referenced\&. In that case, it is good style to close open files so that the file descriptors are freed right away\&. Returns false if there was an error\&.
 .SH "THE REPODATA CLASS"
 .sp
-The Repodata stores attrinbutes for packages and the repository itself, each repository can have multiple repodata areas\&. You normally only need to directly access them if you implement lazy downloading of repository data\&. Repodata areas are created by calling the repository\(cqs add_repodata() method or by using repo_add methods without the REPO_REUSE_REPODATA or REPO_USE_LOADING flag\&.
+The Repodata stores attributes for packages and the repository itself, each repository can have multiple repodata areas\&. You normally only need to directly access them if you implement lazy downloading of repository data\&. Repodata areas are created by calling the repository\(cqs add_repodata() method or by using repo_add methods without the REPO_REUSE_REPODATA or REPO_USE_LOADING flag\&.
 .SS "ATTRIBUTES"
 .sp
 .if n \{\
@@ -4893,7 +5158,7 @@ Back pointer to repository object\&.
 .\}
 .sp
 The id of the repodata area\&. Repodata ids of different repositories overlap\&.
-.SS "METHODS ===="
+.SS "METHODS"
 .sp
 .if n \{\
 .RS 4
@@ -5025,7 +5290,7 @@ my \fI$chksum\fR \fB=\fR \fI$data\fR\fB\->lookup_checksum(\fR\fI$solvid\fR\fB,\f
 .RE
 .\}
 .sp
-Lookup functions\&. Return the data element stored in the specified solvable\&. The methods probably only make sense to retrive data from the special SOLVID_META solvid that stores repodata meta information\&.
+Lookup functions\&. Return the data element stored in the specified solvable\&. The methods probably only make sense to retrieve data from the special SOLVID_META solvid that stores repodata meta information\&.
 .SS "DATA STORAGE METHODS"
 .sp
 .if n \{\
@@ -5122,7 +5387,7 @@ my \fI$handle\fR \fB=\fR \fI$data\fR\fB\->new_handle()\fR;
 Data storage methods\&. Probably only useful to store data in the special SOLVID_META solvid that stores repodata meta information\&. Note that repodata areas can have their own Id pool (see the REPO_LOCALPOOL flag), so be careful if you need to store ids\&. Arrays are created by calling the add function for every element\&. A flexarray is an array of sub\-structures, call new_handle to create a new structure, use the handle as solvid to fill the structure with data and call add_flexarray to put the structure in an array\&.
 .SH "THE DATAPOS CLASS"
 .sp
-Datapos objects describe a specific position in the repository data area\&. Thus they are only valid until the repository is modified in some way\&. Datapos objects can be created by the pos() and parentpos() methods of a Datamatch object or by accesing the \(lqmeta\(rq attribute of a repository\&.
+Datapos objects describe a specific position in the repository data area\&. Thus they are only valid until the repository is modified in some way\&. Datapos objects can be created by the pos() and parentpos() methods of a Datamatch object or by accessing the \(lqmeta\(rq attribute of a repository\&.
 .SS "ATTRIBUTES"
 .sp
 .if n \{\
@@ -5266,6 +5531,33 @@ my \fI$chksum\fR \fB=\fR \fI$datapos\fR\fB\->lookup_checksum(\fR\fI$keyname\fR\f
 .\}
 .sp
 Lookup functions\&. Note that the returned Ids are always translated into the Ids of the global pool even if the repodata area contains its own pool\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDataiterator Dataiterator(Id\fR \fIkeyname\fR\fB, const char *\fR\fImatch\fR \fB= 0, int\fR \fIflags\fR \fB= 0)\fR
+my \fI$di\fR \fB=\fR \fI$datapos\fR\fB\->Dataiterator(\fR\fI$keyname\fR\fB,\fR \fI$match\fR\fB,\fR \fI$flags\fR\fB)\fR;
+\fIdi\fR \fB=\fR \fIdatapos\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+\fIdi\fR \fB=\fR \fIdatapos\fR\fB\&.Dataiterator(\fR\fIkeyname\fR\fB,\fR \fImatch\fR\fB,\fR \fIflags\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBfor my\fR \fI$d\fR \fB(\fR\fI@$di\fR\fB)\fR
+\fBfor\fR \fId\fR \fBin\fR \fIdi\fR\fB:\fR
+\fBfor\fR \fId\fR \fBin\fR \fIdi\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Iterate over the matching data elements\&. See the Dataiterator class for more information\&.
 .SH "AUTHOR"
 .sp
 Michael Schroeder <mls@suse\&.de>