Merge commit 'release-4-0-0alpha15' into master4-tmp
[kai/samba-autobuild/.git] / source4 / lib / ldb / pyldb.c
index 1bcdaabe13efc7dcf92014a739133e8ccfed17c9..e2a2e7180e1de8bc2994a7752faeb934ece79d2b 100644 (file)
@@ -7,6 +7,8 @@
    Copyright (C) 2006 Simo Sorce <idra@samba.org>
    Copyright (C) 2007-2010 Jelmer Vernooij <jelmer@samba.org>
    Copyright (C) 2009-2010 Matthias Dieter Wallnöfer
+   Copyright (C) 2009-2011 Andrew Tridgell
+   Copyright (C) 2009-2011 Andrew Bartlett
 
     ** NOTE! The following LGPL license applies to the ldb
     ** library. This does NOT imply that all of Samba is released
@@ -384,6 +386,62 @@ static PyObject *py_ldb_dn_canonical_ex_str(PyLdbDnObject *self)
        return PyString_FromString(ldb_dn_canonical_ex_string(self->dn, self->dn));
 }
 
+static PyObject *py_ldb_dn_extended_str(PyLdbDnObject *self, PyObject *args, PyObject *kwargs)
+{
+       const char * const kwnames[] = { "mode", NULL };
+       int mode = 1;
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i",
+                                        discard_const_p(char *, kwnames),
+                                        &mode))
+               return NULL;
+       return PyString_FromString(ldb_dn_get_extended_linearized(self->dn, self->dn, mode));
+}
+
+static PyObject *py_ldb_dn_get_extended_component(PyLdbDnObject *self, PyObject *args)
+{
+       char *name;
+       const struct ldb_val *val;
+
+       if (!PyArg_ParseTuple(args, "s", &name))
+               return NULL;
+       val = ldb_dn_get_extended_component(self->dn, name);
+       if (val == NULL) {
+               Py_RETURN_NONE;
+       }
+
+       return PyString_FromStringAndSize((const char *)val->data, val->length);
+}
+
+static PyObject *py_ldb_dn_set_extended_component(PyLdbDnObject *self, PyObject *args)
+{
+       char *name;
+       PyObject *value;
+       int err;
+
+       if (!PyArg_ParseTuple(args, "sO", &name, &value))
+               return NULL;
+
+       if (value == Py_None) {
+               err = ldb_dn_set_extended_component(self->dn, name, NULL);
+       } else {
+               struct ldb_val val;
+               if (!PyString_Check(value)) {
+                       PyErr_SetString(PyExc_TypeError, "Expected a string argument");
+                       return NULL;
+               }
+               val.data = (uint8_t *)PyString_AsString(value);
+               val.length = PyString_Size(value);
+               err = ldb_dn_set_extended_component(self->dn, name, &val);
+       }
+
+       if (err != LDB_SUCCESS) {
+               PyErr_SetString(PyExc_TypeError, "Failed to set extended component");
+               return NULL;
+       }
+
+       Py_RETURN_NONE;
+}
+
 static PyObject *py_ldb_dn_repr(PyLdbDnObject *self)
 {
        return PyString_FromFormat("Dn(%s)", PyObject_REPR(PyString_FromString(ldb_dn_get_linearized(self->dn))));
@@ -485,6 +543,9 @@ static PyMethodDef py_ldb_dn_methods[] = {
        { "canonical_ex_str", (PyCFunction)py_ldb_dn_canonical_ex_str, METH_NOARGS,
                "S.canonical_ex_str() -> string\n"
                "Canonical version of this DN (like a posix path, with terminating newline)." },
+       { "extended_str", (PyCFunction)py_ldb_dn_extended_str, METH_VARARGS | METH_KEYWORDS,
+               "S.extended_str(mode=1) -> string\n"
+               "Extended version of this DN" },
        { "parent", (PyCFunction)py_ldb_dn_get_parent, METH_NOARGS,
                "S.parent() -> dn\n"
                "Get the parent for this DN." },
@@ -497,6 +558,12 @@ static PyMethodDef py_ldb_dn_methods[] = {
        { "check_special", (PyCFunction)py_ldb_dn_check_special, METH_VARARGS,
                "S.check_special(name) -> bool\n\n"
                "Check if name is a special DN name"},
+       { "get_extended_component", (PyCFunction)py_ldb_dn_get_extended_component, METH_VARARGS,
+               "S.get_extended_component(name) -> string\n\n"
+               "returns a DN extended component as a binary string"},
+       { "set_extended_component", (PyCFunction)py_ldb_dn_set_extended_component, METH_VARARGS,
+               "S.set_extended_component(name, value) -> string\n\n"
+               "set a DN extended component as a binary string"},
        { NULL }
 };