s4:ldb Add python binding and test for ldb_msg_diff()
authorAndrew Bartlett <abartlet@samba.org>
Mon, 24 Aug 2009 10:11:43 +0000 (20:11 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 24 Aug 2009 10:24:18 +0000 (20:24 +1000)
source4/lib/ldb/pyldb.c
source4/lib/ldb/tests/python/api.py

index d55e0aae7ca23ff5c6bb5620fb511688ac1d9593..67e1d5c9e090e84da7c129e726b0f6ff50320321 100644 (file)
@@ -845,6 +845,35 @@ static PyObject *py_ldb_parse_ldif(PyLdbObject *self, PyObject *args)
        return PyObject_GetIter(list);
 }
 
+static PyObject *py_ldb_msg_diff(PyLdbObject *self, PyObject *args)
+{
+       PyObject *py_msg_old;
+       PyObject *py_msg_new;
+       struct ldb_message *diff;
+       PyObject *py_ret;
+
+       if (!PyArg_ParseTuple(args, "OO", &py_msg_old, &py_msg_new))
+               return NULL;
+
+       if (!PyLdbMessage_Check(py_msg_old)) {
+               PyErr_SetString(PyExc_TypeError, "Expected Ldb Message for old message");
+               return NULL;
+       }
+
+       if (!PyLdbMessage_Check(py_msg_new)) {
+               PyErr_SetString(PyExc_TypeError, "Expected Ldb Message for new message");
+               return NULL;
+       }
+
+       diff = ldb_msg_diff(PyLdb_AsLdbContext(self), PyLdbMessage_AsMessage(py_msg_old), PyLdbMessage_AsMessage(py_msg_new));
+       if (diff == NULL) 
+               return NULL;
+
+       py_ret = PyLdbMessage_FromMessage(diff);
+
+       return py_ret;
+}
+
 static PyObject *py_ldb_schema_format_value(PyLdbObject *self, PyObject *args)
 {
        const struct ldb_schema_attribute *a;
@@ -1087,6 +1116,9 @@ static PyMethodDef py_ldb_methods[] = {
        { "parse_ldif", (PyCFunction)py_ldb_parse_ldif, METH_VARARGS,
                "S.parse_ldif(ldif) -> iter(messages)\n"
                "Parse a string formatted using LDIF." },
+       { "msg_diff", (PyCFunction)py_ldb_msg_diff, METH_VARARGS,
+               "S.msg_diff(Message) -> Message\n"
+               "Return an LDB Message of the difference between two Message objects." },
        { "get_opaque", (PyCFunction)py_ldb_get_opaque, METH_VARARGS,
                "S.get_opaque(name) -> value\n"
                "Get an opaque value set on this LDB connection. \n"
index 110b1cabfe764f8d7ee451dc060c1d5023faed7b..d946bf06a54c647f4d256fd9d8836a7ba86f04b8 100755 (executable)
@@ -451,6 +451,17 @@ class LdbMsgTests(unittest.TestCase):
     def test_get_unknown(self):
         self.assertEquals(None, self.msg.get("lalalala"))
 
+    def test_msg_diff(self):
+        l = ldb.Ldb()
+        msgs = l.parse_ldif("dn: foo=bar\nfoo: bar\nbaz: do\n\ndn: foo=bar\nfoo: bar\nbaz: dont\n")
+        msg1 = msgs.next()[1]
+        msg2 = msgs.next()[1]
+        msgdiff = l.msg_diff(msg1, msg2)
+        self.assertEquals("foo=bar", msgdiff.get("dn").__str__())
+        self.assertRaises(KeyError, lambda: msgdiff["foo"])
+        self.assertEquals(1, len(msgdiff))
+
+
 
 class MessageElementTests(unittest.TestCase):