Author: jelmer Date: 2007-10-24 12:59:04 +0000 (Wed, 24 Oct 2007) New Revision: 25716
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25716 Log: Return an iterator over tuples when parsing ldif. Modified: branches/4.0-python/ branches/4.0-python/source/lib/ldb/swig/ldb.i branches/4.0-python/source/lib/ldb/tests/python/api.py Changeset: Property changes on: branches/4.0-python ___________________________________________________________________ Name: bzr:revision-info ...skipped... Name: bzr:revision-id:v3-trunk0 ...skipped... Modified: branches/4.0-python/source/lib/ldb/swig/ldb.i =================================================================== --- branches/4.0-python/source/lib/ldb/swig/ldb.i 2007-10-24 12:57:57 UTC (rev 25715) +++ branches/4.0-python/source/lib/ldb/swig/ldb.i 2007-10-24 12:59:04 UTC (rev 25716) @@ -212,7 +212,7 @@ me->num_values = 1; me->values = talloc_array(me, struct ldb_val, me->num_values); me->values[0].length = PyString_Size(set_obj); - me->values[0].data = talloc_strdup(me->values, + me->values[0].data = (uint8_t *)talloc_strdup(me->values, PyString_AsString(set_obj)); } else if (PySequence_Check(set_obj)) { int i; @@ -221,7 +221,7 @@ for (i = 0; i < me->num_values; i++) { PyObject *obj = PySequence_GetItem(set_obj, i); me->values[i].length = PyString_Size(obj); - me->values[i].data = PyString_AsString(obj); + me->values[i].data = (uint8_t *)PyString_AsString(obj); } } else { talloc_free(me); @@ -356,6 +356,28 @@ (msgs, refs, controls) */ +typedef struct ldb_ldif ldb_ldif; + +%inline { + static PyObject *ldb_ldif_to_pyobject(ldb_ldif *ldif) + { + if (ldif == NULL) { + return Py_None; + } else { + return Py_BuildValue("(iO)", ldif->changetype, + SWIG_NewPointerObj(ldif->msg, SWIGTYPE_p_ldb_message, 0)); + } + } + + + static PyObject *next_ldif_fragment(PyObject *self, PyObject *args) + { + struct ldb_context *ldb = PyCObject_AsVoidPtr(PyTuple_GetItem(self, 0)); + const char **s = PyCObject_AsVoidPtr(PyTuple_GetItem(self, 1)); + return ldb_ldif_to_pyobject(ldb_ldif_read_string(ldb, s)); + } +} + /* * Wrap ldb functions */ @@ -424,13 +446,25 @@ return result->count > 0; } -#endif - ldb_msg *parse_ldif(const char *s) + + PyObject *parse_ldif(const char *s) { - struct ldb_ldif *ret = ldb_ldif_read_string($self, &s); + PyObject *selfobj, *callable; + PyMethodDef md = { + "next_ldif_fragment", + next_ldif_fragment, + METH_NOARGS, + NULL + }; - return ret->msg; + selfobj = Py_BuildValue("(OO)", + PyCObject_FromVoidPtr($self, NULL), + PyCObject_FromVoidPtr(&s, NULL)); + callable = PyCFunction_New(&md, selfobj); + + return PyCallIter_New(callable, Py_None); } +#endif } } ldb; Modified: branches/4.0-python/source/lib/ldb/tests/python/api.py =================================================================== --- branches/4.0-python/source/lib/ldb/tests/python/api.py 2007-10-24 12:57:57 UTC (rev 25715) +++ branches/4.0-python/source/lib/ldb/tests/python/api.py 2007-10-24 12:59:04 UTC (rev 25716) @@ -234,9 +234,10 @@ self.assertEquals("dc=foo,bar=bla", str(y + x)) def test_parse_ldif(self): - msg = self.ldb.parse_ldif("dn: foo=bar\n") - self.assertEquals("foo=bar", str(msg.dn)) - self.assertTrue(isinstance(msg, ldb.Message)) + msgs = self.ldb.parse_ldif("dn: foo=bar\n") + msg = msgs.next() + self.assertEquals("foo=bar", str(msg[1].dn)) + self.assertTrue(isinstance(msg[1], ldb.Message)) def test_canonical_string(self): x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")