Author: jelmer Date: 2007-10-14 17:42:51 +0000 (Sun, 14 Oct 2007) New Revision: 25632
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25632 Log: Support setting values in messages. 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:file-ids ...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-14 15:42:31 UTC (rev 25631) +++ branches/4.0-python/source/lib/ldb/swig/ldb.i 2007-10-14 17:42:51 UTC (rev 25632) @@ -96,7 +96,7 @@ } %typemap(out) struct ldb_val { - $result = PyString_FromStringAndSize($1.data, $1.length); + $result = PyString_FromStringAndSize((const char *)$1.data, $1.length); } /* @@ -106,19 +106,12 @@ %typemap(in, numinputs=0) struct ldb_result **OUT (struct ldb_result *temp_ldb_result) { $1 = &temp_ldb_result; } -struct ldb_result { - unsigned int count; - ldb_msg **msgs; - char **refs; - struct ldb_control **controls; -}; - #ifdef SWIGPYTHON %typemap(argout) struct ldb_result ** (int i) { - resultobj = PyList_New((*$1)->count); + $result = PyList_New((*$1)->count); for (i = 0; i < (*$1)->count; i++) { - PyList_SetItem(resultobj, i, + PyList_SetItem($result, i, SWIG_NewPointerObj((*$1)->msgs[i], SWIGTYPE_p_ldb_message, 0) ); } @@ -168,26 +161,61 @@ } } ldb_dn; -%array_functions(struct ldb_message_element, ldb_message_element_array); +%array_functions(ldb_msg_element, ldb_message_element_array); -%apply ldb_msg_element **OUTPUT { ldb_msg_element **return_el }; +%rename(__delitem__) ldb_message::remove_attr; + typedef struct ldb_message { ldb_dn *dn; unsigned int num_elements; - struct ldb_message_element *elements; + ldb_msg_element *elements; %extend { - int add_value(const char *attr_name, const struct ldb_val *val, ldb_msg_element **return_el); - ldb_msg_element *find_element(const char *attr_name); - void remove_attr(const char *attr); +#ifdef SWIGPYTHON + ldb_msg_element *__getitem__(const char *attr_name) + { + ldb_msg_element *ret = ldb_msg_find_element($self, attr_name); + if (ret == NULL) { + PyErr_SetString(PyExc_KeyError, "no such element"); + return NULL; + } + + return ret; + } + + void __setitem__(const char *attr_name, PyObject *set_obj) + { + ldb_msg_element *me = talloc(NULL, ldb_msg_element); + ldb_msg_remove_attr($self, attr_name); + me->flags =0 ; + me->name = attr_name; + if (PyAnySet_Check(set_obj)) { + PyObject *iter, *obj; + int i; + me->num_values = PyObject_Size(set_obj); + me->values = talloc_array(me, struct ldb_val, me->num_values); + iter = PyObject_GetIter(set_obj); + i = 0; + while((obj = PyIter_Next(iter))) { + me->values[i].length = PyString_Size(obj); + me->values[i].data = PyString_AsString(obj); + i++; + } + } else { + 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 = PyString_AsString(set_obj); + } + ldb_msg_add($self, me, 0); + talloc_free(me); + } + + unsigned int __len__() { return $self->num_elements; } +#endif + void remove_attr(const char *name); } } ldb_msg; -/* - * Wrap struct ldb_result - */ - -%array_functions(struct ldb_message *, ldb_message_ptr_array); - /* FIXME: Convert ldb_result to 3-tuple: (msgs, refs, controls) */ @@ -196,11 +224,6 @@ * Wrap ldb functions */ -/* Error handling */ - -const char *ldb_errstring(struct ldb_context *ldb); -const char *ldb_strerror(int ldb_err); - %rename(Ldb) ldb; /* Top-level ldb operations */ typedef struct ldb_context { 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-14 15:42:31 UTC (rev 25631) +++ branches/4.0-python/source/lib/ldb/tests/python/api.py 2007-10-14 17:42:51 UTC (rev 25632) @@ -23,7 +23,23 @@ l = ldb.Ldb("foo.tdb") l.delete(ldb.Dn(l, "dc=foo")) + def test_get_config_basedn(self): + l = ldb.Ldb("foo.tdb") + self.assertEquals(None, l.get_config_basedn()) + def test_get_root_basedn(self): + l = ldb.Ldb("foo.tdb") + self.assertEquals(None, l.get_root_basedn()) + + def test_get_schema_basedn(self): + l = ldb.Ldb("foo.tdb") + self.assertEquals(None, l.get_schema_basedn()) + + def test_get_default_basedn(self): + l = ldb.Ldb("foo.tdb") + self.assertEquals(None, l.get_default_basedn()) + + class DnTests(unittest.TestCase): def setUp(self): self.ldb = ldb.Ldb("foo.tdb") @@ -32,7 +48,38 @@ x = ldb.Dn(self.ldb, "dc=foo,bar=bloe") self.assertEquals(x.__str__(), "dc=foo,bar=bloe") + def test_get_casefold(self): + x = ldb.Dn(self.ldb, "dc=foo,bar=bloe") + self.assertEquals(x.get_casefold(), "DC=FOO,BAR=bloe") + def test_validate(self): x = ldb.Dn(self.ldb, "dc=foo,bar=bloe") self.assertTrue(x.validate()) +class LdbMsgTests(unittest.TestCase): + def setUp(self): + self.ldb = ldb.Ldb("foo.tdb") + self.msg = self.ldb.search()[0] + + def test_len(self): + self.assertEquals(2, len(self.msg)) + + def test_notpresent(self): + self.assertRaises(KeyError, lambda: self.msg["foo"]) + + def test_del(self): + del self.msg["foo"] + + def test_add_value(self): + self.msg["foo"] = set("foo") + self.assertEquals(3, len(self.msg)) + + def test_set_value(self): + self.msg["foo"] = set("foo") + self.assertEquals("foo", self.msg["foo"]) + self.msg["foo"] = set("bar") + self.assertEquals("bar", self.msg["foo"]) + + def test_dn(self): + self.assertEquals("@BASEINFO", self.msg.dn.__str__()) +
