Author: kkaempf
Date: Thu Sep 25 17:16:09 2008
New Revision: 11173
URL: http://svn.opensuse.org/viewcvs/zypp?rev=11173&view=rev
Log:
fully support Dataiterator in bindings, drop use of repo_lookup()
Modified:
trunk/sat-solver/VERSION.cmake
trunk/sat-solver/applayer/xrepokey.c
trunk/sat-solver/applayer/xrepokey.h
trunk/sat-solver/bindings/dataiterator.i
trunk/sat-solver/bindings/python/tests/repodata.py
trunk/sat-solver/bindings/python/tests/rpmdb.py
trunk/sat-solver/bindings/python/tests/search.py
trunk/sat-solver/bindings/repodata.i
trunk/sat-solver/bindings/repokey.i
trunk/sat-solver/bindings/ruby/tests/repodata.rb
trunk/sat-solver/bindings/satsolver.i
trunk/sat-solver/bindings/solvable.i
trunk/sat-solver/package/libsatsolver.changes
Modified: trunk/sat-solver/VERSION.cmake
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/VERSION.cmake?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/VERSION.cmake (original)
+++ trunk/sat-solver/VERSION.cmake Thu Sep 25 17:16:09 2008
@@ -46,6 +46,6 @@
SET(LIBSATSOLVER_MAJOR "0")
SET(LIBSATSOLVER_MINOR "10")
-SET(LIBSATSOLVER_PATCH "14")
+SET(LIBSATSOLVER_PATCH "15")
# last released 0.10.14
Modified: trunk/sat-solver/applayer/xrepokey.c
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/applayer/xrepokey.c?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/applayer/xrepokey.c (original)
+++ trunk/sat-solver/applayer/xrepokey.c Thu Sep 25 17:16:09 2008
@@ -8,7 +8,7 @@
/************************************************
* XRepokey - eXternally visible Repokey
*
- * we cannot use a Repokey pointer since it doesn't reference the Pool
+ * see xrepokey.h for docs.
*/
#include
@@ -17,11 +17,12 @@
#include "xrepokey.h"
XRepokey *
-xrepokey_new( Repodata *repodata, int keynum )
+xrepokey_new( Repokey *key, Repo *repo, Repodata *repodata )
{
XRepokey *xrepokey = (XRepokey *)malloc( sizeof( XRepokey ));
+ xrepokey->key = key;
+ xrepokey->repo = repo;
xrepokey->repodata = repodata;
- xrepokey->keynum = keynum;
return xrepokey;
}
@@ -37,6 +38,6 @@
Repokey *
xrepokey_repokey( const XRepokey *xr )
{
- return xr->repodata->keys + xr->keynum;
+ return xr->key;
}
Modified: trunk/sat-solver/applayer/xrepokey.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/applayer/xrepokey.h?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/applayer/xrepokey.h (original)
+++ trunk/sat-solver/applayer/xrepokey.h Thu Sep 25 17:16:09 2008
@@ -14,15 +14,24 @@
/************************************************
* XRepokey - eXternally visible Repokey
*
- * we cannot use a Repokey pointer since it doesn't reference the Pool
+ * we cannot just use a Repokey pointer since it doesn't reference the Pool
+ * And key might be internal (no repodata) or external (defined in repodata)
+ * So we need
+ * - the Repokey
+ * - the Repo (it has the Pool backref, and probably many Repodatas)
+ * - the Repodata (for externally defined Repokeys)
*/
typedef struct _xrepokey {
+ Repokey *key;
+ Repo *repo;
Repodata *repodata;
- int keynum;
} XRepokey;
-XRepokey *xrepokey_new( Repodata *repodata, int keynum );
+/* if repodata == 0, key is internal
+ * if repodata != 0, key is external (per repodata)
+ */
+XRepokey *xrepokey_new( Repokey *key, Repo *repo, Repodata *repodata );
void xrepokey_free( XRepokey *xr );
Repokey *xrepokey_repokey( const XRepokey *xr );
Modified: trunk/sat-solver/bindings/dataiterator.i
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/dataiterator.i?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/dataiterator.i (original)
+++ trunk/sat-solver/bindings/dataiterator.i Thu Sep 25 17:16:09 2008
@@ -26,10 +26,16 @@
filename (if matched of course). */
%constant int SEARCH_FILES = SEARCH_FILES;
- Dataiterator(Repo *repo, const char *match, int option, Id p = 0, Id keyname = 0)
+ /*
+ * Complete Dataiterator constructor, to be used via %python in Swig
+ */
+
+ Dataiterator(Repo *repo, const char *match, int option, XSolvable *xs = 0, XRepokey *key = 0)
{
Dataiterator *di = calloc(1, sizeof( Dataiterator ));
- dataiterator_init(di, repo, p, keyname, match, option);
+ Solvable *s = 0;
+ if (xs) s = xsolvable_solvable(xs);
+ dataiterator_init(di, repo, s ? s - repo->pool->solvables : 0, key ? xrepokey_repokey(key)->name : 0, match, option);
return di;
}
@@ -40,16 +46,37 @@
return xsolvable_new( $self->repo->pool, self->solvid );
}
- const char *key()
+ /*
+ * return corresponding Repokey, if defined
+ * internal attributes, like solvable.name, don't have an
+ * explicit Repokey
+ */
+ XRepokey *key()
{
- return id2str($self->repo->pool, $self->key->name);
+ return xrepokey_new($self->key, $self->repo, $self->data);
}
- const char *value()
+ const char *keyname()
{
- if ($self->key->type == REPOKEY_TYPE_ID)
- return id2str($self->repo->pool, $self->kv.id );
- return "<internal>";
+ return id2str($self->repo->pool, $self->key->name);
+ }
+
+#if defined(SWIGPYTHON)
+ PyObject *
+#endif
+#if defined(SWIGRUBY)
+ VALUE
+#endif
+#if defined(SWIGPERL)
+ SV *
+#endif
+ value()
+ {
+ Swig_Type value = dataiterator_value($self);
+#if defined(SWIGPYTHON)
+ Py_INCREF(value);
+#endif
+ return value;
}
int step()
Modified: trunk/sat-solver/bindings/python/tests/repodata.py
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/python/tests/repodata.py?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/python/tests/repodata.py (original)
+++ trunk/sat-solver/bindings/python/tests/repodata.py Thu Sep 25 17:16:09 2008
@@ -33,7 +33,7 @@
print "Repodata is at ", repodata.location(), " with ", repodata.keysize(), " keys"
for k in repodata.keys():
- print " Key ", k.name(), " is ", k.type(), " with ", k.size(), " bytes"
+ print " Key ", k.name(), " is ", k.type().__str__(), "[", k.type_id(), "] with ", k.size(), " bytes"
i = 0;
for s in repo:
Modified: trunk/sat-solver/bindings/python/tests/rpmdb.py
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/python/tests/rpmdb.py?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/python/tests/rpmdb.py (original)
+++ trunk/sat-solver/bindings/python/tests/rpmdb.py Thu Sep 25 17:16:09 2008
@@ -27,6 +27,7 @@
assert repo.size() > 0
print repo.size(), " installed packages"
+ i = 0
name = None
for s in pool:
print s
Modified: trunk/sat-solver/bindings/python/tests/search.py
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/python/tests/search.py?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/python/tests/search.py (original)
+++ trunk/sat-solver/bindings/python/tests/search.py Thu Sep 25 17:16:09 2008
@@ -17,8 +17,12 @@
pool.set_arch("i686")
repo = pool.add_solv( "os11-biarch.solv" )
repo.set_name("test")
+ i = 0
for d in repo.search("yast2", satsolver.SEARCH_STRING):
- print d.solvable(), "matches 'yast2' in ", d.key(), ": ", d.value()
+ print d.solvable(), "matches 'yast2' in ", d.keyname(), ": ", d.value()
+ i = i + 1
+ if i > 10:
+ break;
assert True
def test_repo_search_files(self):
@@ -27,8 +31,12 @@
pool.set_arch("i686")
repo = pool.add_solv( "os11-biarch.solv" )
repo.set_name("test")
+ i = 0
for d in repo.search("/usr/bin/python", satsolver.SEARCH_STRING|satsolver.SEARCH_FILES):
- print d.solvable(), "matches '/usr/bin/python' in ", d.key(), ": ", d.value()
+ print d.solvable(), "matches '/usr/bin/python' in ", d.keyname(), ": ", d.value()
+ i = i + 1
+ if i > 10:
+ break;
assert True
if __name__ == '__main__':
Modified: trunk/sat-solver/bindings/repodata.i
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/repodata.i?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/repodata.i (original)
+++ trunk/sat-solver/bindings/repodata.i Thu Sep 25 17:16:09 2008
@@ -22,7 +22,7 @@
XRepokey *key( int i )
{
if (i >= 0 && i < $self->nkeys-1)
- return xrepokey_new( $self, i+1 ); /* key 0 is reserved */
+ return xrepokey_new( $self->keys + i + 1, $self->repo, $self ); /* key 0 is reserved */
return NULL;
}
@@ -34,7 +34,7 @@
{
int i;
for (i = 1; i < $self->nkeys; ++i ) {
- rb_yield( SWIG_NewPointerObj((void*) xrepokey_new( $self, i ), SWIGTYPE_p__Repokey, 0) );
+ rb_yield( SWIG_NewPointerObj((void*) xrepokey_new( $self->keys + i, $self->repo, $self ), SWIGTYPE_p__Repokey, 0) );
}
}
#endif
Modified: trunk/sat-solver/bindings/repokey.i
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/repokey.i?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/repokey.i (original)
+++ trunk/sat-solver/bindings/repokey.i Thu Sep 25 17:16:09 2008
@@ -7,6 +7,24 @@
typedef struct _Repokey {} XRepokey; /* expose XRepokey as 'Repokey' */
%extend XRepokey {
+
+%constant int REPOKEY_TYPE_VOID = REPOKEY_TYPE_VOID;
+%constant int REPOKEY_TYPE_CONSTANT = REPOKEY_TYPE_CONSTANT;
+%constant int REPOKEY_TYPE_CONSTANTID = REPOKEY_TYPE_CONSTANTID;
+%constant int REPOKEY_TYPE_ID = REPOKEY_TYPE_ID;
+%constant int REPOKEY_TYPE_NUM = REPOKEY_TYPE_NUM;
+%constant int REPOKEY_TYPE_U32 = REPOKEY_TYPE_U32;
+%constant int REPOKEY_TYPE_DIR = REPOKEY_TYPE_DIR;
+%constant int REPOKEY_TYPE_STR = REPOKEY_TYPE_STR;
+%constant int REPOKEY_TYPE_IDARRAY = REPOKEY_TYPE_IDARRAY;
+%constant int REPOKEY_TYPE_REL_IDARRAY = REPOKEY_TYPE_REL_IDARRAY;
+%constant int REPOKEY_TYPE_DIRSTRARRAY = REPOKEY_TYPE_DIRSTRARRAY;
+%constant int REPOKEY_TYPE_DIRNUMNUMARRAY = REPOKEY_TYPE_DIRNUMNUMARRAY;
+%constant int REPOKEY_TYPE_MD5 = REPOKEY_TYPE_MD5;
+%constant int REPOKEY_TYPE_SHA1 = REPOKEY_TYPE_SHA1;
+%constant int REPOKEY_TYPE_SHA256 = REPOKEY_TYPE_SHA256;
+%constant int REPOKEY_TYPE_COUNTED = REPOKEY_TYPE_COUNTED;
+
/* no explicit constructor, Repokey is embedded in Repodata */
~XRepokey()
@@ -18,41 +36,95 @@
Repokey *key = xrepokey_repokey( $self );
return my_id2str( $self->repodata->repo->pool, key->name );
}
+ /* type id of key */
+ int type_id()
+ {
+ Repokey *key = xrepokey_repokey( $self );
+ return key->type;
+ }
+
/* type of key */
+#if defined(SWIGPYTHON)
+PyTypeObject *
+#endif
#if defined(SWIGRUBY)
- VALUE type()
+VALUE
+#endif
+#if defined(SWIGPERL)
+SV *
+#endif
+ type()
{
Repokey *key = xrepokey_repokey( $self );
- VALUE type = Qnil;
+ Swig_Type_Type type = Swig_Type_Null;
switch( key->type )
{
- case REPOKEY_TYPE_VOID: type = rb_cTrueClass; break;
- case REPOKEY_TYPE_CONSTANTID: type = rb_cString; break;
- case REPOKEY_TYPE_CONSTANT: type = rb_cInteger; break;
- case REPOKEY_TYPE_ID: type = rb_cString; break;
- case REPOKEY_TYPE_IDARRAY: type = rb_cArray; break;
- case REPOKEY_TYPE_STR: type = rb_cString; break;
- case REPOKEY_TYPE_U32: type = rb_cInteger; break;
- case REPOKEY_TYPE_REL_IDARRAY: type = rb_cArray; break;
- case REPOKEY_TYPE_DIR: type = rb_cDir; break;
- case REPOKEY_TYPE_DIRNUMNUMARRAY: type = rb_cArray; break;
- case REPOKEY_TYPE_DIRSTRARRAY: type = rb_cArray; break;
- case REPOKEY_TYPE_NUM: type = rb_cNumeric; break;
+ case REPOKEY_TYPE_VOID:
+ type = Swig_Type_Bool;
+ break;
+ case REPOKEY_TYPE_CONSTANTID:
+ type = Swig_Type_String;
+ break;
+ case REPOKEY_TYPE_CONSTANT:
+ type = Swig_Type_Int;
+ break;
+ case REPOKEY_TYPE_ID:
+ type = Swig_Type_String;
+ break;
+ case REPOKEY_TYPE_IDARRAY:
+ type = Swig_Type_Array;
+ break;
+ case REPOKEY_TYPE_STR:
+ type = Swig_Type_String;
+ break;
+ case REPOKEY_TYPE_U32:
+ type = Swig_Type_Int;
+ break;
+ case REPOKEY_TYPE_REL_IDARRAY:
+ type = Swig_Type_Array;
+ break;
+ case REPOKEY_TYPE_DIR:
+ type = Swig_Type_Directory;
+ break;
+ case REPOKEY_TYPE_DIRNUMNUMARRAY:
+ type = Swig_Type_Array;
+ break;
+ case REPOKEY_TYPE_DIRSTRARRAY:
+ type = Swig_Type_Array;
+ break;
+ case REPOKEY_TYPE_NUM:
+ type = Swig_Type_Number;
+ break;
+ case REPOKEY_TYPE_MD5:
+ type = Swig_Type_String;
+ break;
+ case REPOKEY_TYPE_SHA1:
+ type = Swig_Type_String;
+ break;
+ case REPOKEY_TYPE_SHA256:
+ type = Swig_Type_String;
+ break;
+ case REPOKEY_TYPE_COUNTED:
+ type = Swig_Type_Number;
+ break;
}
return type;
}
-#else
- int type()
- {
- Repokey *key = xrepokey_repokey( $self );
- return key->type;
- }
-#endif
/* size of key */
int size()
{
Repokey *key = xrepokey_repokey( $self );
return key->size;
}
+#if defined(SWIGRUBY)
+ %rename("to_s") string();
+#endif
+#if defined(SWIGPYTHON)
+ %rename("__str__") string();
+#endif
+ const char *string()
+ {
+ return "<Repokey>";
+ }
}
Modified: trunk/sat-solver/bindings/ruby/tests/repodata.rb
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/ruby/tests/repodata.rb?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/ruby/tests/repodata.rb (original)
+++ trunk/sat-solver/bindings/ruby/tests/repodata.rb Thu Sep 25 17:16:09 2008
@@ -2,7 +2,7 @@
# Check Repodata of Repo
#
-$:.unshift ".."
+$:.unshift "../../../build/bindings/ruby"
# test Repodata
require 'test/unit'
@@ -32,7 +32,7 @@
puts "Repodata is at '#{repodata.location}' with #{repodata.keysize} keys"
repodata.each_key { |k|
- puts " Key '#{k.name}' is #{k.type} with #{k.size} bytes"
+ puts " Key '#{k.name}' is #{k.type}[#{k.type_id}] with #{k.size} bytes"
}
i = 0
Modified: trunk/sat-solver/bindings/satsolver.i
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/satsolver.i?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/satsolver.i (original)
+++ trunk/sat-solver/bindings/satsolver.i Thu Sep 25 17:16:09 2008
@@ -23,7 +23,7 @@
/*=============================================================*/
#if defined(SWIGPYTHON)
-#define Swig_Test(x) (x == Py_None)
+#define Swig_Null_p(x) (x == Py_None)
#define Swig_True Py_True
#define Swig_False Py_False
#define Swig_Null Py_None
@@ -32,10 +32,24 @@
#define Swig_String(x) PyString_FromString(x)
#define Swig_Array() PyList_New(0)
#define Swig_Append(x,y) PyList_Append(x,y)
+
+/* And here goes 'Python is object oriented' down the drain ... */
+#define Swig_Type_Type PyTypeObject *
+#define Swig_Type_Null &PyBaseObject_Type
+#define Swig_Type_Bool &PyBool_Type
+#define Swig_Type_Int &PyInt_Type
+#define Swig_Type_Long &PyLong_Type
+#define Swig_Type_Float &PyFloat_Type
+#define Swig_Type_String &PyString_Type
+#define Swig_Type_Array &PyList_Type
+#define Swig_Type_Number &PyLong_Type
+#define Swig_Type_Directory &PyList_Type
+
+
#endif
#if defined(SWIGRUBY)
-#define Swig_Test(x) NIL_P(x)
+#define Swig_Null_p(x) NIL_P(x)
#define Swig_True Qtrue
#define Swig_False Qfalse
#define Swig_Null Qnil
@@ -44,20 +58,41 @@
#define Swig_String(x) rb_str_new2(x)
#define Swig_Array() rb_ary_new()
#define Swig_Append(x,y) rb_ary_push(x,y)
+#define Swig_Type_Type VALUE
+#define Swig_Type_Null Qnil
+#define Swig_Type_Bool rb_cTrueClass
+#define Swig_Type_Int rb_cInteger
+#define Swig_Type_Long rb_cInteger
+#define Swig_Type_Float rb_cFloat
+#define Swig_Type_String rb_cString
+#define Swig_Type_Array rb_cArray
+#define Swig_Type_Number rb_cNumeric
+#define Swig_Type_Directory rb_cDir
#include
#include
#endif
#if defined(SWIGPERL)
-#define Swig_Test(x) (x == NULL)
+#define Swig_Null_p(x) (x == NULL)
#define Swig_True (&PL_sv_yes)
#define Swig_False (&PL_sv_no)
#define Swig_Null NULL
#define Swig_Type SV *
-#define Swig_Int(x) SWIG_From_long(x)
-#define Swig_String(x) SWIG_FromCharPtr(x)
+#define Swig_Int(x) 0 /* should be SWIG_From_long(x), but Swig declares it too late. FIXME */
+#define Swig_String(x) "" /* SWIG_FromCharPtr(x), also */
#define Swig_Array(x) NULL
#define Swig_Append(x,y) av_create_and_push(&x, y)
+/* FIXME: perl types */
+#define Swig_Type_Type SV *
+#define Swig_Type_Null NULL
+#define Swig_Type_Bool NULL
+#define Swig_Type_Int NULL
+#define Swig_Type_Long NULL
+#define Swig_Type_Float NULL
+#define Swig_Type_String NULL
+#define Swig_Type_Array NULL
+#define Swig_Type_Number NULL
+#define Swig_Type_Directory NULL
#endif
/* satsolver core includes */
@@ -106,6 +141,101 @@
}
#endif
+/* convert Dataiterator to target value
+ * if *more != 0 on return, value is incomplete
+ */
+
+static Swig_Type
+dataiterator_value( Dataiterator *di )
+{
+ Swig_Type value = Swig_Null;
+
+ /*
+ * !! keep the order of case statements according to knownid.h !!
+ */
+
+ switch( di->key->type )
+ {
+ case REPOKEY_TYPE_VOID:
+ value = Swig_True;
+ break;
+ case REPOKEY_TYPE_CONSTANT:
+ case REPOKEY_TYPE_NUM:
+ case REPOKEY_TYPE_U32:
+ value = Swig_Int( di->key->size );
+ break;
+ case REPOKEY_TYPE_CONSTANTID:
+ value = Swig_Int( di->key->size );
+ break;
+ case REPOKEY_TYPE_ID:
+ if (di->data && di->data->localpool)
+ value = Swig_String( stringpool_id2str( &di->data->spool, di->kv.id ) );
+ else
+ value = Swig_String( id2str( di->repo->pool, di->kv.id ) );
+ break;
+ case REPOKEY_TYPE_DIR:
+ fprintf(stderr, "REPOKEY_TYPE_DIR: unhandled\n");
+ value = Swig_Null;
+ break;
+ case REPOKEY_TYPE_STR:
+ value = Swig_String( di->kv.str );
+ break;
+ case REPOKEY_TYPE_IDARRAY:
+ if (di->data && di->data->localpool)
+ value = Swig_String(stringpool_id2str( &di->data->spool, di->kv.id ));
+ else
+ value = Swig_String(id2str( di->repo->pool, di->kv.id ));
+ break;
+ case REPOKEY_TYPE_REL_IDARRAY:
+ fprintf(stderr, "REPOKEY_TYPE_REL_IDARRAY: unhandled\n");
+ value = Swig_Null;
+ break;
+ case REPOKEY_TYPE_DIRSTRARRAY:
+ if (di->data)
+ value = Swig_String( repodata_dir2str(di->data, di->kv.id, di->kv.str) );
+ else
+ fprintf(stderr, "REPOKEY_TYPE_DIRSTRARRAY: without repodata\n");
+ break;
+ case REPOKEY_TYPE_DIRNUMNUMARRAY:
+ value = Swig_Array();
+ if (di->data)
+ {
+ Swig_Append( value, Swig_String(repodata_dir2str(di->data, di->kv.id, 0)) );
+ Swig_Append( value, Swig_Int(di->kv.num) );
+ Swig_Append( value, Swig_Int(di->kv.num2) );
+ }
+ else
+ fprintf(stderr, "REPOKEY_TYPE_DIRNUMNUMARRAY: without repodata\n");
+ break;
+ case REPOKEY_TYPE_MD5:
+ case REPOKEY_TYPE_SHA1:
+ case REPOKEY_TYPE_SHA256:
+ if (di->data)
+ value = Swig_String( repodata_chk2str(di->data, di->key->type, (unsigned char *)di->kv.str) );
+ else
+ fprintf(stderr, "REPOKEY_TYPE_{MD5,SHA1,SHA256}: without repodata\n");
+ break;
+ case REPOKEY_TYPE_COUNTED:
+ value = Swig_String( di->kv.eof == 0 ? "open" : di->kv.eof == 1 ? "next" : "close" );
+ break;
+ default:
+ fprintf(stderr, "Unhandled type %d\n", di->key->type);
+ }
+ return value;
+#if 0
+ Swig_Type result = Swig_Array();
+ if (di->data && di->data->localpool)
+ Swig_Append( result, Swig_String( stringpool_id2str( &di->data->spool, di->key->name ) ) );
+ else
+ Swig_Append( result, Swig_String( id2str( di->repo->pool, di->key->name ) ) );
+ Swig_Append( result, value );
+
+ value = Swig_Null;
+
+ return result;
+#endif
+}
+
%}
Modified: trunk/sat-solver/bindings/solvable.i
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/solvable.i?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/bindings/solvable.i (original)
+++ trunk/sat-solver/bindings/solvable.i Thu Sep 25 17:16:09 2008
@@ -2,192 +2,6 @@
* Solvable
*/
-%{
-
-/*
- * iterating over attributes of a (x)solvable ('yield' in Ruby)
- */
-
-static int
-xsolvable_each_attr_callback( Solvable *s, Repodata *data, Repokey *key, KeyValue *kv )
-{
- static Swig_Type value = Swig_Null;
-
- /*
- * !! keep the order of case statements according to knownid.h !!
- */
-
- switch( key->type )
- {
- case REPOKEY_TYPE_VOID:
- value = Swig_True;
- break;
- case REPOKEY_TYPE_CONSTANT:
- case REPOKEY_TYPE_NUM:
- case REPOKEY_TYPE_U32:
- value = Swig_Int( key->size );
- break;
- case REPOKEY_TYPE_CONSTANTID:
- value = Swig_Int( key->size );
- break;
- case REPOKEY_TYPE_ID:
- if (data->localpool)
- value = Swig_String( stringpool_id2str( &data->spool, kv->id ) );
- else
- value = Swig_String( id2str( data->repo->pool, kv->id ) );
- break;
- case REPOKEY_TYPE_DIR:
- value = Swig_Null;
- break;
- case REPOKEY_TYPE_STR:
- value = Swig_String( kv->str );
- break;
- case REPOKEY_TYPE_IDARRAY:
- if (Swig_Test(value))
- value = Swig_Array(); /* create new Array on first call */
- if (data->localpool)
- Swig_Append( value, Swig_String( stringpool_id2str( &data->spool, kv->id ) ) );
- else
- Swig_Append( value, Swig_String( id2str( data->repo->pool, kv->id ) ) );
- if (kv->eof)
- break; /* yield ! */
- return 0; /* continue loop */
- break;
- case REPOKEY_TYPE_REL_IDARRAY:
- value = Swig_Null;
- break;
- case REPOKEY_TYPE_DIRSTRARRAY:
- value = Swig_String( repodata_dir2str(data,kv->id, kv->str) );
- break;
- case REPOKEY_TYPE_DIRNUMNUMARRAY:
- value = Swig_Array();
- Swig_Append( value, Swig_String( repodata_dir2str(data, kv->id, 0) ) );
- Swig_Append( value, Swig_Int(kv->num) );
- Swig_Append( value, Swig_Int(kv->num2) );
- break;
- case REPOKEY_TYPE_MD5:
- case REPOKEY_TYPE_SHA1:
- case REPOKEY_TYPE_SHA256:
- value = Swig_String( repodata_chk2str(data, key->type, (unsigned char *)kv->str));
- break;
- case REPOKEY_TYPE_COUNTED:
- value = Swig_String( kv->eof == 0 ? "open" : kv->eof == 1 ? "next" : "close" );
- break;
- default:
- value = Swig_Null;
- break;
- }
-
- Swig_Type result = Swig_Array();
- Swig_Append( result, Swig_String( id2str( data->repo->pool, key->name ) ) );
- Swig_Append( result, value );
-#if defined(SWIGRUBY)
- rb_yield( result );
-#endif
-
- return 0;
-}
-
-
-/*
- * searching for an attribute of a (x)solvable ('yield' in Ruby)
- */
-
-static int
-xsolvable_attr_lookup_callback( void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv )
-{
- Swig_Type *result = (Swig_Type *)cbdata;
-
- /*
- * !! keep the order of case statements according to knownid.h !!
- */
-
- switch( key->type )
- {
- case REPOKEY_TYPE_VOID:
- *result = Swig_True;
- break;
- case REPOKEY_TYPE_CONSTANT:
- *result = Swig_Int( key->size );
- break;
- case REPOKEY_TYPE_CONSTANTID:
- *result = Swig_Int( key->size );
- break;
- case REPOKEY_TYPE_ID:
- if (data->localpool)
- *result = Swig_String( stringpool_id2str( &data->spool, kv->id ) );
- else
- *result = Swig_String( id2str( data->repo->pool, kv->id ) );
- break;
- case REPOKEY_TYPE_NUM:
- *result = Swig_Int( kv->num );
- break;
- case REPOKEY_TYPE_U32:
- *result = Swig_Int( kv->num );
- break;
- case REPOKEY_TYPE_DIR:
- *result = Swig_Null; /*FIXME*/
- break;
- case REPOKEY_TYPE_STR:
- *result = Swig_String( kv->str );
- break;
- case REPOKEY_TYPE_IDARRAY:
- if (Swig_Test(*result)) {
- *result = Swig_Array(); /* create new Array on first call */
- }
- if (data->localpool)
- Swig_Append( *result, Swig_String( stringpool_id2str( &data->spool, kv->id ) ) );
- else
- Swig_Append( *result, Swig_String( id2str( data->repo->pool, kv->id ) ) );
- return kv->eof?1:0;
- break;
- case REPOKEY_TYPE_REL_IDARRAY:
- *result = Swig_Null; /*FIXME*/
- break;
- case REPOKEY_TYPE_DIRSTRARRAY:
- if (Swig_Test(*result)) {
- *result = Swig_Array(); /* create new Array on first call */
- }
- Swig_Append( *result, Swig_String( repodata_dir2str(data, kv->id, kv->str) ) );
- return kv->eof?1:0;
- break;
- case REPOKEY_TYPE_DIRNUMNUMARRAY:
- *result = Swig_Null; /*FIXME*/
- break;
- case REPOKEY_TYPE_MD5:
- *result = Swig_Null; /*FIXME*/
- break;
- case REPOKEY_TYPE_SHA1:
- *result = Swig_Null; /*FIXME*/
- break;
- case REPOKEY_TYPE_SHA256:
- *result = Swig_Null; /*FIXME*/
- break;
- default:
- *result = Swig_Null;
- return 0;
- break;
- }
- return 1;
-}
-
-
-/*
- * searching for existance of an attribute of a (x)solvable ('yield' in Ruby)
- */
-
-static int
-xsolvable_attr_exists_callback( void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv )
-{
- Swig_Type *result = (Swig_Type *)cbdata;
- *result = Swig_True;
- /* stop looping immediately */
- return 0;
-}
-
-%}
-
-
%nodefault _Solvable;
%rename(Solvable) _Solvable;
typedef struct _Solvable {} XSolvable; /* expose XSolvable as 'Solvable' */
@@ -323,12 +137,11 @@
*/
-#if defined(SWIGRUBY)
-
/*
* access attribute via []
*/
+#if defined(SWIGRUBY)
/* %rename is rejected by swig for [] */
%alias attr "[]";
VALUE attr( VALUE attrname )
@@ -365,7 +178,12 @@
SWIG_exception( SWIG_ValueError, "No such attribute name" );
Solvable *s = xsolvable_solvable($self);
- repo_lookup( s, key, xsolvable_attr_lookup_callback, &result );
+ Dataiterator di;
+ dataiterator_init(&di, s->repo, $self->id, key, 0, SEARCH_NO_STORAGE_SOLVABLE);
+ if (dataiterator_step(&di))
+ {
+ result = dataiterator_value( &di );
+ }
#if defined(SWIGPYTHON) || defined(SWIGPERL)/* needed for SWIG_Exception */
fail:
@@ -380,15 +198,28 @@
* iterate over all attributes
*/
+#if defined(SWIGRUBY)
void each_attr()
{
Solvable *s = xsolvable_solvable($self);
Dataiterator di;
dataiterator_init(&di, s->repo, $self->id, 0, 0, SEARCH_NO_STORAGE_SOLVABLE);
+ VALUE value;
while (dataiterator_step(&di))
- xsolvable_each_attr_callback( s, di.data, di.key, &di.kv );
+ {
+ value = dataiterator_value ( &di );
+ rb_yield( value );
+ }
}
-
+#endif
+#if defined(SWIGPYTHON)
+ %pythoncode %{
+ def attrs(self):
+ d = Dataiterator(self.repo(),"",SEARCH_NO_STORAGE_SOLVABLE,self)
+ while d.step():
+ yield d.value()
+ %}
+#endif
/*
* check existance of attribute
@@ -427,7 +258,10 @@
key = str2id( $self->pool, name, 0);
if (key != ID_NULL) {
Solvable *s = xsolvable_solvable($self);
- repo_lookup( s, key, xsolvable_attr_exists_callback, &result );
+ Dataiterator di;
+ dataiterator_init(&di, s->repo, $self->id, key, 0, SEARCH_NO_STORAGE_SOLVABLE);
+ if (dataiterator_step(&di))
+ result = Swig_True;
}
}
#if defined(SWIGPYTHON)
Modified: trunk/sat-solver/package/libsatsolver.changes
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/package/libsatsolver.changes?rev=11173&r1=11172&r2=11173&view=diff
==============================================================================
--- trunk/sat-solver/package/libsatsolver.changes (original)
+++ trunk/sat-solver/package/libsatsolver.changes Thu Sep 25 17:16:09 2008
@@ -1,4 +1,10 @@
-------------------------------------------------------------------
+Thu Sep 25 17:14:42 CEST 2008 - kkaempf@suse.de
+
+- fully support Dataiterator in Python and Ruby bindings.
+- 0.10.15
+
+-------------------------------------------------------------------
Thu Sep 25 13:53:54 CEST 2008 - dmacvicar@suse.de
- add support for keywords in susedata
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org