From 21ddc105e8185242f889ea8df5d7889effa5adf5 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Mon, 27 May 2013 17:23:48 +0200 Subject: [PATCH] add documentation for the Solvable class --- doc/libsolv-bindings.3 | 389 ++++++++++++++++++++++++++++++++++++++++++++++- doc/libsolv-bindings.txt | 190 ++++++++++++++++++++++- 2 files changed, 573 insertions(+), 6 deletions(-) diff --git a/doc/libsolv-bindings.3 b/doc/libsolv-bindings.3 index 150fafd..2f262df 100644 --- a/doc/libsolv-bindings.3 +++ b/doc/libsolv-bindings.3 @@ -2,12 +2,12 @@ .\" Title: libsolv-bindings .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 05/17/2013 +.\" Date: 05/27/2013 .\" Manual: LIBSOLV .\" Source: libsolv .\" Language: English .\" -.TH "LIBSOLV\-BINDINGS" "3" "05/17/2013" "libsolv" "LIBSOLV" +.TH "LIBSOLV\-BINDINGS" "3" "05/27/2013" "libsolv" "LIBSOLV" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -543,7 +543,7 @@ my \fI$id\fR \fB=\fR \fI$pool\fR\fB\->lookup_id(\fR\fI$solvid\fR\fB,\fR \fI$keyn .RS 4 .\} .nf -\fBunsigned int lookup_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned int\fR \fInotfound\fR \fB= 0)\fR +\fBunsigned long long lookup_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInotfound\fR \fB= 0)\fR my \fI$num\fR \fB=\fR \fI$pool\fR\fB\->lookup_num(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR; \fInum\fR \fB=\fR \fIpool\fR\fB\&.lookup_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR \fInum\fR \fB=\fR \fIpool\fR\fB\&.lookup_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR @@ -569,6 +569,19 @@ my \fI$bool\fR \fB=\fR \fI$pool\fR\fB\->lookup_void(\fR\fI$solvid\fR\fB,\fR \fI$ .RS 4 .\} .nf +\fBQueue lookup_idarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR +my \fI@ids\fR \fB=\fR \fI$pool\fR\fB\->lookup_idarray(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR; +\fIids\fR \fB=\fR \fIpool\fR\fB\&.lookup_idarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR +\fIids\fR \fB=\fR \fIpool\fR\fB\&.lookup_idarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf \fBChksum *lookup_checksum(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR my \fI$chksum\fR \fB=\fR \fI$pool\fR\fB\->lookup_checksum(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR; \fIchksum\fR \fB=\fR \fIpool\fR\fB\&.lookup_checksum(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR @@ -1588,7 +1601,375 @@ Add repository metadata in the susetags format to the repository\&. Like with ad Add the installed SUSE products database to the repository\&. The \fIdir\fR parameter is usually "/etc/products\&.d"\&. .SH "THE SOLVABLE CLASS" .sp -xxx +A solvable describes all the information of one package\&. Each solvable belongs to one repository, it can be added and filled manually but in most cases solvables will get created by the repo_add methods\&. +.SS "ATTRIBUTES" +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBRepo *repo;\fR /* read only */ +\fI$solvable\fR\fB\->{\*(Aqrepo\*(Aq}\fR +\fIsolvable\fR\fB\&.repo\fR +\fIsolvable\fR\fB\&.repo\fR +.fi +.if n \{\ +.RE +.\} +.sp +The repository this solvable belongs to\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBPool *pool;\fR /* read only */ +\fI$solvable\fR\fB\->{\*(Aqpool\*(Aq}\fR +\fIsolvable\fR\fB\&.pool\fR +\fIsolvable\fR\fB\&.pool\fR +.fi +.if n \{\ +.RE +.\} +.sp +The pool this solvable belongs to, same as the pool of the repo\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBId id;\fR /* read only */ +\fI$solvable\fR\fB\->{\*(Aqid\*(Aq}\fR +\fIsolvable\fR\fB\&.id\fR +\fIsolvable\fR\fB\&.id\fR +.fi +.if n \{\ +.RE +.\} +.sp +The specific id of the solvable\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBchar *name;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqname\*(Aq}\fR +\fIsolvable\fR\fB\&.name\fR +\fIsolvable\fR\fB\&.name\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBchar *evr;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqevr\*(Aq}\fR +\fIsolvable\fR\fB\&.evr\fR +\fIsolvable\fR\fB\&.evr\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBchar *arch;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqarch\*(Aq}\fR +\fIsolvable\fR\fB\&.arch\fR +\fIsolvable\fR\fB\&.arch\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBchar *vendor;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqvendor\*(Aq}\fR +\fIsolvable\fR\fB\&.vendor\fR +\fIsolvable\fR\fB\&.vendor\fR +.fi +.if n \{\ +.RE +.\} +.sp +Easy access to often used attributes of solvables\&. They are internally stored as Ids\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBId nameid;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqnameid\*(Aq}\fR +\fIsolvable\fR\fB\&.nameid\fR +\fIsolvable\fR\fB\&.nameid\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBId evrid;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqevrid\*(Aq}\fR +\fIsolvable\fR\fB\&.evrid\fR +\fIsolvable\fR\fB\&.evrid\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBId archid;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqarchid\*(Aq}\fR +\fIsolvable\fR\fB\&.archid\fR +\fIsolvable\fR\fB\&.archid\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBId vendorid;\fR /* read/write */ +\fI$solvable\fR\fB\->{\*(Aqvendorid\*(Aq}\fR +\fIsolvable\fR\fB\&.vendorid\fR +\fIsolvable\fR\fB\&.vendorid\fR +.fi +.if n \{\ +.RE +.\} +.sp +Raw interface to the ids\&. Useful if you want to search for a specific id and want to avoid the string compare overhead\&. +.SS "METHODS" +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBconst char *lookup_str(Id\fR \fIkeyname\fR\fB)\fR +my \fI$string\fR \fB=\fR \fI$solvable\fR\fB\->lookup_str(\fR\fI$keyname\fR\fB)\fR; +\fIstring\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_str(\fR\fIkeyname\fR\fB)\fR +\fIstring\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_str(\fR\fIkeyname\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBId lookup_id(Id\fR \fIkeyname\fR\fB)\fR +my \fI$id\fR \fB=\fR \fI$solvable\fR\fB\->lookup_id(\fR\fI$keyname\fR\fB)\fR; +\fIid\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_id(\fR\fIsolvid\fR\fB)\fR +\fIid\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_id(\fR\fIsolvid\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBunsigned long long lookup_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInotfound\fR \fB= 0)\fR +my \fI$num\fR \fB=\fR \fI$solvable\fR\fB\->lookup_num(\fR\fI$keyname\fR\fB)\fR; +\fInum\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_num(\fR\fIkeyname\fR\fB)\fR +\fInum\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_num(\fR\fIkeyname\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBbool lookup_void(Id\fR \fIkeyname\fR\fB)\fR +my \fI$bool\fR \fB=\fR \fI$solvable\fR\fB\->lookup_void(\fR\fI$keyname\fR\fB)\fR; +\fIbool\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_void(\fR\fIkeyname\fR\fB)\fR +\fIbool\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_void(\fR\fIkeyname\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBChksum *lookup_checksum(Id\fR \fIkeyname\fR\fB)\fR +my \fI$chksum\fR \fB=\fR \fI$solvable\fR\fB\->lookup_checksum(\fR\fI$keyname\fR\fB)\fR; +\fIchksum\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_checksum(\fR\fIkeyname\fR\fB)\fR +\fIchksum\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_checksum(\fR\fIkeyname\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBQueue lookup_idarray(Id\fR \fIkeyname\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR +my \fI@ids\fR \fB=\fR \fI$solvable\fR\fB\->lookup_idarray(\fR\fI$keyname\fR\fB)\fR; +\fIids\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_idarray(\fR\fIkeyname\fR\fB)\fR +\fIids\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_idarray(\fR\fIkeyname\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBQueue lookup_deparray(Id\fR \fIkeyname\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR +my \fI@deps\fR \fB=\fR \fI$solvable\fR\fB\->lookup_deparray(\fR\fI$keyname\fR\fB)\fR; +\fIids\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_deparray(\fR\fIkeyname\fR\fB)\fR +\fIids\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_deparray(\fR\fIkeyname\fR\fB)\fR +.fi +.if n \{\ +.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\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBconst char *lookup_location(unsigned int *\fR\fIOUTPUT\fR\fB)\fR; +my \fB(\fR\fI$location\fR\fB,\fR \fI$medianr\fR\fB) =\fR \fI$solvable\fR\fB\->lookup_location()\fR; +\fIlocation\fR\fB,\fR \fImedianr\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR +\fIlocation\fR\fB,\fR \fImedianr\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR +.fi +.if n \{\ +.RE +.\} +.sp +Return a tuple containing the on\-media location and an optional media number for multi\-part repositories (e\&.g\&. repositories spawning multiple DVDs)\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBvoid add_deparray(Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR; +\fI$solvable\fR\fB\->add_deparray(\fR\fI$keyname\fR\fB,\fR \fI$depid\fR\fB)\fR; +\fIsolvable\fR\fB\&.add_deparray(\fR\fIkeyname\fR\fB,\fR \fIdepid\fR\fB)\fR +\fIsolvable\fR\fB\&.add_deparray(\fR\fIkeyname\fR\fB,\fR \fIdepid\fR\fB)\fR +.fi +.if n \{\ +.RE +.\} +.sp +Add a new dependency to the attributes stored in keyname\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBbool installable()\fR; +\fI$solvable\fR\fB\->installable()\fR +\fIsolvable\fR\fB\&.installable()\fR +\fIsolvable\fR\fB\&.installable?\fR +.fi +.if n \{\ +.RE +.\} +.sp +Return true if the solvable is installable on the system\&. Solvables are not installable if the system does not support their architecture\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBbool isinstalled()\fR; +\fI$solvable\fR\fB\->isinstalled()\fR +\fIsolvable\fR\fB\&.isinstalled()\fR +\fIsolvable\fR\fB\&.isinstalled?\fR +.fi +.if n \{\ +.RE +.\} +.sp +Return true if the solvable is installed on the system\&. +.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 +\fIsel\fR \fB=\fR \fIsolvable\fR\fB\&.Selection()\fR +.fi +.if n \{\ +.RE +.\} +.sp +Create a Selection containing just the single solvable\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fBconst char *str()\fR +my \fI$str\fR \fB=\fR \fI$solvable\fR\fB\->str()\fR; +\fIstr\fR \fB=\fR \fI$solvable\fR\fB\&.str()\fR +\fIstr\fR \fB=\fR \fI$solvable\fR\fB\&.str()\fR +.fi +.if n \{\ +.RE +.\} +.sp +Return a string describing the solvable\&. The string consists of the name, version, and architecture of the Solvable\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fB\fR +my \fI$str\fR \fB= "\fR\fI$solvable\fR\fB"\fR; +\fIstr\fR \fB= str(\fR\fIsolvable\fR\fB)\fR +\fIstr\fR \fB=\fR \fIsolvable\fR\fB\&.to_s\fR +.fi +.if n \{\ +.RE +.\} +.sp +Same as calling the str() method\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fB\fR +\fBif (\fR\fI$solvable1\fR \fB==\fR \fI$solvable2\fR\fB)\fR +\fBif\fR \fIsolvable1\fR \fB==\fR \fIsolvable2\fR\fB:\fR +\fBif\fR \fIsolvable1\fR \fB==\fR \fIsolvable2\fR +.fi +.if n \{\ +.RE +.\} +.sp +Two solvables are equal if they are part of the same pool and have the same ids\&. .SH "THE DATAITERATOR CLASS" .sp xxx diff --git a/doc/libsolv-bindings.txt b/doc/libsolv-bindings.txt index deab4df..8d726c4 100644 --- a/doc/libsolv-bindings.txt +++ b/doc/libsolv-bindings.txt @@ -297,7 +297,7 @@ desired solvable by Id. id = pool.lookup_id(solvid, keyname) id = pool.lookup_id(solvid, keyname) - unsigned int lookup_num(Id solvid, Id keyname, unsigned int notfound = 0) + unsigned long long lookup_num(Id solvid, Id keyname, unsigned long long notfound = 0) my $num = $pool->lookup_num($solvid, $keyname); num = pool.lookup_num(solvid, keyname) num = pool.lookup_num(solvid, keyname) @@ -307,6 +307,11 @@ desired solvable by Id. bool = pool.lookup_void(solvid, keyname) bool = pool.lookup_void(solvid, keyname) + Queue lookup_idarray(Id solvid, Id keyname) + my @ids = $pool->lookup_idarray($solvid, $keyname); + ids = pool.lookup_idarray(solvid, keyname) + ids = pool.lookup_idarray(solvid, keyname) + Chksum *lookup_checksum(Id solvid, Id keyname) my $chksum = $pool->lookup_checksum($solvid, $keyname); chksum = pool.lookup_checksum(solvid, keyname) @@ -891,9 +896,190 @@ vendors, it is usually provided in the content file. Add the installed SUSE products database to the repository. The _dir_ parameter is usually "/etc/products.d". + THE SOLVABLE CLASS ------------------ -xxx +A solvable describes all the information of one package. Each solvable belongs to +one repository, it can be added and filled manually but in most cases solvables +will get created by the repo_add methods. + +=== ATTRIBUTES === + + Repo *repo; /* read only */ + $solvable->{'repo'} + solvable.repo + solvable.repo + +The repository this solvable belongs to. + + Pool *pool; /* read only */ + $solvable->{'pool'} + solvable.pool + solvable.pool + +The pool this solvable belongs to, same as the pool of the repo. + + Id id; /* read only */ + $solvable->{'id'} + solvable.id + solvable.id + +The specific id of the solvable. + + char *name; /* read/write */ + $solvable->{'name'} + solvable.name + solvable.name + + char *evr; /* read/write */ + $solvable->{'evr'} + solvable.evr + solvable.evr + + char *arch; /* read/write */ + $solvable->{'arch'} + solvable.arch + solvable.arch + + char *vendor; /* read/write */ + $solvable->{'vendor'} + solvable.vendor + solvable.vendor + +Easy access to often used attributes of solvables. They are +internally stored as Ids. + + Id nameid; /* read/write */ + $solvable->{'nameid'} + solvable.nameid + solvable.nameid + + Id evrid; /* read/write */ + $solvable->{'evrid'} + solvable.evrid + solvable.evrid + + Id archid; /* read/write */ + $solvable->{'archid'} + solvable.archid + solvable.archid + + Id vendorid; /* read/write */ + $solvable->{'vendorid'} + solvable.vendorid + solvable.vendorid + +Raw interface to the ids. Useful if you want to search for +a specific id and want to avoid the string compare overhead. + +=== METHODS === + + const char *lookup_str(Id keyname) + my $string = $solvable->lookup_str($keyname); + string = solvable.lookup_str(keyname) + string = solvable.lookup_str(keyname) + + Id lookup_id(Id keyname) + my $id = $solvable->lookup_id($keyname); + id = solvable.lookup_id(solvid) + id = solvable.lookup_id(solvid) + + unsigned long long lookup_num(Id solvid, Id keyname, unsigned long long notfound = 0) + my $num = $solvable->lookup_num($keyname); + num = solvable.lookup_num(keyname) + num = solvable.lookup_num(keyname) + + bool lookup_void(Id keyname) + my $bool = $solvable->lookup_void($keyname); + bool = solvable.lookup_void(keyname) + bool = solvable.lookup_void(keyname) + + Chksum *lookup_checksum(Id keyname) + my $chksum = $solvable->lookup_checksum($keyname); + chksum = solvable.lookup_checksum(keyname) + chksum = solvable.lookup_checksum(keyname) + + Queue lookup_idarray(Id keyname, Id marker = -1) + my @ids = $solvable->lookup_idarray($keyname); + ids = solvable.lookup_idarray(keyname) + ids = solvable.lookup_idarray(keyname) + + Queue lookup_deparray(Id keyname, Id marker = -1) + my @deps = $solvable->lookup_deparray($keyname); + ids = solvable.lookup_deparray(keyname) + ids = solvable.lookup_deparray(keyname) + +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. + + const char *lookup_location(unsigned int *OUTPUT); + my ($location, $medianr) = $solvable->lookup_location(); + location, medianr = solvable.lookup_location() + location, medianr = solvable.lookup_location() + +Return a tuple containing the on-media location and an optional +media number for multi-part repositories (e.g. repositories +spawning multiple DVDs). + + void add_deparray(Id keyname, DepId id, Id marker = -1); + $solvable->add_deparray($keyname, $depid); + solvable.add_deparray(keyname, depid) + solvable.add_deparray(keyname, depid) + +Add a new dependency to the attributes stored in keyname. + + bool installable(); + $solvable->installable() + solvable.installable() + solvable.installable? + +Return true if the solvable is installable on the system. Solvables +are not installable if the system does not support their architecture. + + bool isinstalled(); + $solvable->isinstalled() + solvable.isinstalled() + solvable.isinstalled? + +Return true if the solvable is installed on the system. + + Selection *Selection(int setflags = 0) + my $sel = $solvable->Selection(); + sel = solvable.Selection() + sel = solvable.Selection() + +Create a Selection containing just the single solvable. + + const char *str() + my $str = $solvable->str(); + str = $solvable.str() + str = $solvable.str() + +Return a string describing the solvable. The string consists of the name, +version, and architecture of the Solvable. + + + my $str = "$solvable"; + str = str(solvable) + str = solvable.to_s + +Same as calling the str() method. + + + if ($solvable1 == $solvable2) + if solvable1 == solvable2: + if solvable1 == solvable2 + +Two solvables are equal if they are part of the same pool and have the same +ids. THE DATAITERATOR CLASS ---------------------- -- 2.7.4