summaryrefslogtreecommitdiffstats
path: root/lib/ldb/pyldb.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ldb/pyldb.c')
-rw-r--r--lib/ldb/pyldb.c398
1 files changed, 219 insertions, 179 deletions
diff --git a/lib/ldb/pyldb.c b/lib/ldb/pyldb.c
index f18e06e5c6..8b6cda70f2 100644
--- a/lib/ldb/pyldb.c
+++ b/lib/ldb/pyldb.c
@@ -29,10 +29,10 @@
*/
#include <Python.h>
+#include "py3compat.h"
#include "ldb_private.h"
#include "pyldb.h"
-void initldb(void);
static PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg);
static PyObject *PyExc_LdbError;
@@ -76,9 +76,9 @@ static PyObject *py_ldb_control_str(PyLdbControlObject *self)
PyErr_NoMemory();
return NULL;
}
- return PyString_FromString(control);
+ return PyStr_FromString(control);
} else {
- return PyString_FromFormat("ldb control");
+ return PyStr_FromFormat("ldb control");
}
}
@@ -93,7 +93,7 @@ static void py_ldb_control_dealloc(PyLdbControlObject *self)
static PyObject *py_ldb_control_get_oid(PyLdbControlObject *self)
{
- return PyString_FromString(self->data->oid);
+ return PyStr_FromString(self->data->oid);
}
static PyObject *py_ldb_control_get_critical(PyLdbControlObject *self)
@@ -191,7 +191,7 @@ static void PyErr_SetLdbError(PyObject *error, int ret, struct ldb_context *ldb_
static PyObject *PyObject_FromLdbValue(const struct ldb_val *val)
{
- return PyString_FromStringAndSize((const char *)val->data, val->length);
+ return PyBytes_FromStringAndSize((const char *)val->data, val->length);
}
/**
@@ -317,7 +317,7 @@ static PyObject *PyLdbResult_FromResult(struct ldb_result *result)
}
for (i = 0;result->refs && result->refs[i]; i++) {
- PyList_SetItem(referals, i, PyString_FromString(result->refs[i]));
+ PyList_SetItem(referals, i, PyStr_FromString(result->refs[i]));
}
ret->referals = referals;
return (PyObject *)ret;
@@ -375,22 +375,22 @@ static PyObject *py_ldb_dn_is_null(PyLdbDnObject *self)
static PyObject *py_ldb_dn_get_casefold(PyLdbDnObject *self)
{
- return PyString_FromString(ldb_dn_get_casefold(self->dn));
+ return PyStr_FromString(ldb_dn_get_casefold(self->dn));
}
static PyObject *py_ldb_dn_get_linearized(PyLdbDnObject *self)
{
- return PyString_FromString(ldb_dn_get_linearized(self->dn));
+ return PyStr_FromString(ldb_dn_get_linearized(self->dn));
}
static PyObject *py_ldb_dn_canonical_str(PyLdbDnObject *self)
{
- return PyString_FromString(ldb_dn_canonical_string(self->dn, self->dn));
+ return PyStr_FromString(ldb_dn_canonical_string(self->dn, self->dn));
}
static PyObject *py_ldb_dn_canonical_ex_str(PyLdbDnObject *self)
{
- return PyString_FromString(ldb_dn_canonical_ex_string(self->dn, self->dn));
+ return PyStr_FromString(ldb_dn_canonical_ex_string(self->dn, self->dn));
}
static PyObject *py_ldb_dn_extended_str(PyLdbDnObject *self, PyObject *args, PyObject *kwargs)
@@ -401,7 +401,7 @@ static PyObject *py_ldb_dn_extended_str(PyLdbDnObject *self, PyObject *args, PyO
discard_const_p(char *, kwnames),
&mode))
return NULL;
- return PyString_FromString(ldb_dn_get_extended_linearized(self->dn, self->dn, mode));
+ return PyStr_FromString(ldb_dn_get_extended_linearized(self->dn, self->dn, mode));
}
static PyObject *py_ldb_dn_get_extended_component(PyLdbDnObject *self, PyObject *args)
@@ -416,7 +416,7 @@ static PyObject *py_ldb_dn_get_extended_component(PyLdbDnObject *self, PyObject
Py_RETURN_NONE;
}
- return PyString_FromStringAndSize((const char *)val->data, val->length);
+ return PyBytes_FromStringAndSize((const char *)val->data, val->length);
}
static PyObject *py_ldb_dn_set_extended_component(PyLdbDnObject *self, PyObject *args)
@@ -424,6 +424,7 @@ static PyObject *py_ldb_dn_set_extended_component(PyLdbDnObject *self, PyObject
char *name;
PyObject *value;
int err;
+ Py_ssize_t length;
if (!PyArg_ParseTuple(args, "sO", &name, &value))
return NULL;
@@ -432,12 +433,12 @@ static PyObject *py_ldb_dn_set_extended_component(PyLdbDnObject *self, PyObject
err = ldb_dn_set_extended_component(self->dn, name, NULL);
} else {
struct ldb_val val;
- if (!PyString_Check(value)) {
+ if (!PyStr_Check(value)) {
PyErr_SetString(PyExc_TypeError, "Expected a string argument");
return NULL;
}
- val.data = (uint8_t *)PyString_AsString(value);
- val.length = PyString_Size(value);
+ val.data = (uint8_t *)PyStr_AsUTF8AndSize(value, &length);
+ val.length = length;
err = ldb_dn_set_extended_component(self->dn, name, &val);
}
@@ -451,7 +452,14 @@ static PyObject *py_ldb_dn_set_extended_component(PyLdbDnObject *self, PyObject
static PyObject *py_ldb_dn_repr(PyLdbDnObject *self)
{
- return PyString_FromFormat("Dn(%s)", PyObject_REPR(PyString_FromString(ldb_dn_get_linearized(self->dn))));
+ PyObject *str = PyStr_FromString(ldb_dn_get_linearized(self->dn));
+ PyObject *repr = PyObject_Repr(str);
+ PyObject *result = PyStr_FromFormat("Dn(%s)", PyStr_AsString(repr));
+ if (result == NULL) {
+ Py_XDECREF(str);
+ Py_XDECREF(repr);
+ }
+ return result;
}
static PyObject *py_ldb_dn_check_special(PyLdbDnObject *self, PyObject *args)
@@ -464,13 +472,14 @@ static PyObject *py_ldb_dn_check_special(PyLdbDnObject *self, PyObject *args)
return PyBool_FromLong(ldb_dn_check_special(self->dn, name));
}
-static int py_ldb_dn_compare(PyLdbDnObject *dn1, PyLdbDnObject *dn2)
+static PyObject *py_ldb_dn_richcompare(PyLdbDnObject *dn1, PyLdbDnObject *dn2, int op)
{
int ret;
- ret = ldb_dn_compare(dn1->dn, dn2->dn);
- if (ret < 0) ret = -1;
- if (ret > 0) ret = 1;
- return ret;
+ if (pyldb_Dn_Check(dn1) && pyldb_Dn_Check(dn2)) {
+ ret = ldb_dn_compare(dn1->dn, dn2->dn);
+ return PY_RICHCMP(ret, 0, op);
+ }
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *py_ldb_dn_get_parent(PyLdbDnObject *self)
@@ -572,7 +581,7 @@ static PyObject *py_ldb_dn_get_component_name(PyLdbDnObject *self, PyObject *arg
Py_RETURN_NONE;
}
- return PyString_FromString(name);
+ return PyStr_FromString(name);
}
static PyObject *py_ldb_dn_get_component_value(PyLdbDnObject *self, PyObject *args)
@@ -601,17 +610,18 @@ static PyObject *py_ldb_dn_set_component(PyLdbDnObject *self, PyObject *args)
PyObject *value = Py_None;
struct ldb_val val = { NULL, };
int err;
+ Py_ssize_t length;
if (!PyArg_ParseTuple(args, "IsO", &num, &name, &value))
return NULL;
if (value != Py_None) {
- if (!PyString_Check(value)) {
+ if (!PyStr_Check(value)) {
PyErr_SetString(PyExc_TypeError, "Expected a string argument");
return NULL;
}
- val.data = (uint8_t *)PyString_AsString(value);
- val.length = PyString_Size(value);
+ val.data = (uint8_t *)PyStr_AsUTF8AndSize(value, &length);
+ val.length = length;
}
err = ldb_dn_set_component(self->dn, num, name, val);
@@ -635,7 +645,7 @@ static PyObject *py_ldb_dn_get_rdn_name(PyLdbDnObject *self)
Py_RETURN_NONE;
}
- return PyString_FromString(name);
+ return PyStr_FromString(name);
}
static PyObject *py_ldb_dn_get_rdn_value(PyLdbDnObject *self)
@@ -822,7 +832,7 @@ static PyTypeObject PyLdbDn = {
.tp_methods = py_ldb_dn_methods,
.tp_str = (reprfunc)py_ldb_dn_get_linearized,
.tp_repr = (reprfunc)py_ldb_dn_repr,
- .tp_compare = (cmpfunc)py_ldb_dn_compare,
+ .tp_richcompare = (richcmpfunc)py_ldb_dn_richcompare,
.tp_as_sequence = &py_ldb_dn_seq,
.tp_doc = "A LDB distinguished name.",
.tp_new = py_ldb_dn_new,
@@ -836,7 +846,7 @@ static void py_ldb_debug(void *context, enum ldb_debug_level level, const char *
static void py_ldb_debug(void *context, enum ldb_debug_level level, const char *fmt, va_list ap)
{
PyObject *fn = (PyObject *)context;
- PyObject_CallFunction(fn, discard_const_p(char, "(i,O)"), level, PyString_FromFormatV(fmt, ap));
+ PyObject_CallFunction(fn, discard_const_p(char, "(i,O)"), level, PyStr_FromFormatV(fmt, ap));
}
static PyObject *py_ldb_set_debug(PyObject *self, PyObject *args)
@@ -926,7 +936,7 @@ static PyObject *py_ldb_setup_wellknown_attributes(PyLdbObject *self)
static PyObject *py_ldb_repr(PyLdbObject *self)
{
- return PyString_FromFormat("<ldb connection>");
+ return PyStr_FromFormat("<ldb connection>");
}
static PyObject *py_ldb_get_root_basedn(PyLdbObject *self)
@@ -962,11 +972,12 @@ static PyObject *py_ldb_get_default_basedn(PyLdbObject *self)
return py_ldb_dn_copy(dn);
}
-static const char **PyList_AsStringList(TALLOC_CTX *mem_ctx, PyObject *list,
+static const char **PyList_AsStrList(TALLOC_CTX *mem_ctx, PyObject *list,
const char *paramname)
{
const char **ret;
- Py_ssize_t i;
+ Py_ssize_t i, length;
+ char *content;
if (!PyList_Check(list)) {
PyErr_Format(PyExc_TypeError, "%s is not a list", paramname);
return NULL;
@@ -979,12 +990,12 @@ static const char **PyList_AsStringList(TALLOC_CTX *mem_ctx, PyObject *list,
for (i = 0; i < PyList_Size(list); i++) {
PyObject *item = PyList_GetItem(list, i);
- if (!PyString_Check(item)) {
+ if (!PyStr_Check(item)) {
PyErr_Format(PyExc_TypeError, "%s should be strings", paramname);
return NULL;
}
- ret[i] = talloc_strndup(ret, PyString_AsString(item),
- PyString_Size(item));
+ content = PyStr_AsUTF8AndSize(item, &length);
+ ret[i] = talloc_strndup(ret, content, length);
}
ret[i] = NULL;
return ret;
@@ -1010,7 +1021,7 @@ static int py_ldb_init(PyLdbObject *self, PyObject *args, PyObject *kwargs)
if (py_options == Py_None) {
options = NULL;
} else {
- options = PyList_AsStringList(ldb, py_options, "options");
+ options = PyList_AsStrList(ldb, py_options, "options");
if (options == NULL)
return -1;
}
@@ -1066,7 +1077,7 @@ static PyObject *py_ldb_connect(PyLdbObject *self, PyObject *args, PyObject *kwa
if (py_options == Py_None) {
options = NULL;
} else {
- options = PyList_AsStringList(NULL, py_options, "options");
+ options = PyList_AsStrList(NULL, py_options, "options");
if (options == NULL)
return NULL;
}
@@ -1108,7 +1119,7 @@ static PyObject *py_ldb_modify(PyLdbObject *self, PyObject *args, PyObject *kwar
if (py_controls == Py_None) {
parsed_controls = NULL;
} else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
+ const char **controls = PyList_AsStrList(mem_ctx, py_controls, "controls");
if (controls == NULL) {
talloc_free(mem_ctx);
return NULL;
@@ -1212,7 +1223,7 @@ static struct ldb_message *PyDict_AsMessage(TALLOC_CTX *mem_ctx,
}
while (PyDict_Next(py_obj, &dict_pos, &key, &value)) {
- char *key_str = PyString_AsString(key);
+ char *key_str = PyStr_AsString(key);
if (ldb_attr_cmp(key_str, "dn") != 0) {
msg_el = PyObject_AsMessageElement(msg->elements, value,
mod_flags, key_str);
@@ -1257,7 +1268,7 @@ static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args, PyObject *kwargs)
if (py_controls == Py_None) {
parsed_controls = NULL;
} else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
+ const char **controls = PyList_AsStrList(mem_ctx, py_controls, "controls");
if (controls == NULL) {
talloc_free(mem_ctx);
return NULL;
@@ -1350,7 +1361,7 @@ static PyObject *py_ldb_delete(PyLdbObject *self, PyObject *args, PyObject *kwar
if (py_controls == Py_None) {
parsed_controls = NULL;
} else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
+ const char **controls = PyList_AsStrList(mem_ctx, py_controls, "controls");
if (controls == NULL) {
talloc_free(mem_ctx);
return NULL;
@@ -1428,7 +1439,7 @@ static PyObject *py_ldb_rename(PyLdbObject *self, PyObject *args, PyObject *kwar
if (py_controls == Py_None) {
parsed_controls = NULL;
} else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
+ const char **controls = PyList_AsStrList(mem_ctx, py_controls, "controls");
if (controls == NULL) {
talloc_free(mem_ctx);
return NULL;
@@ -1553,7 +1564,7 @@ static PyObject *py_ldb_write_ldif(PyLdbObject *self, PyObject *args)
return NULL;
}
- ret = PyString_FromString(string);
+ ret = PyStr_FromString(string);
talloc_free(mem_ctx);
@@ -1646,8 +1657,8 @@ static PyObject *py_ldb_schema_format_value(PyLdbObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "sO", &element_name, &val))
return NULL;
- old_val.data = (uint8_t *)PyString_AsString(val);
- old_val.length = PyString_Size(val);
+ old_val.data = (uint8_t *)PyBytes_AsString(val);
+ old_val.length = PyBytes_Size(val);
if (old_val.data == NULL) {
PyErr_SetString(PyExc_RuntimeError, "Failed to convert passed value to String");
@@ -1671,7 +1682,7 @@ static PyObject *py_ldb_schema_format_value(PyLdbObject *self, PyObject *args)
Py_RETURN_NONE;
}
- ret = PyString_FromStringAndSize((const char *)new_val.data, new_val.length);
+ ret = PyBytes_FromStringAndSize((const char *)new_val.data, new_val.length);
talloc_free(mem_ctx);
@@ -1713,7 +1724,7 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
if (py_attrs == Py_None) {
attrs = NULL;
} else {
- attrs = PyList_AsStringList(mem_ctx, py_attrs, "attrs");
+ attrs = PyList_AsStrList(mem_ctx, py_attrs, "attrs");
if (attrs == NULL) {
talloc_free(mem_ctx);
return NULL;
@@ -1732,7 +1743,7 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
if (py_controls == Py_None) {
parsed_controls = NULL;
} else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
+ const char **controls = PyList_AsStrList(mem_ctx, py_controls, "controls");
if (controls == NULL) {
talloc_free(mem_ctx);
return NULL;
@@ -2105,7 +2116,7 @@ static PySequenceMethods py_ldb_result_seq = {
static PyObject *py_ldb_result_repr(PyLdbObject *self)
{
- return PyString_FromFormat("<ldb result>");
+ return PyStr_FromFormat("<ldb result>");
}
@@ -2124,13 +2135,13 @@ static PyTypeObject PyLdbResult = {
static PyObject *py_ldb_module_repr(PyLdbModuleObject *self)
{
- return PyString_FromFormat("<ldb module '%s'>",
+ return PyStr_FromFormat("<ldb module '%s'>",
pyldb_Module_AsModule(self)->ops->name);
}
static PyObject *py_ldb_module_str(PyLdbModuleObject *self)
{
- return PyString_FromString(pyldb_Module_AsModule(self)->ops->name);
+ return PyStr_FromString(pyldb_Module_AsModule(self)->ops->name);
}
static PyObject *py_ldb_module_start_transaction(PyLdbModuleObject *self)
@@ -2171,7 +2182,7 @@ static PyObject *py_ldb_module_search(PyLdbModuleObject *self, PyObject *args, P
if (py_attrs == Py_None) {
attrs = NULL;
} else {
- attrs = PyList_AsStringList(NULL, py_attrs, "attrs");
+ attrs = PyList_AsStrList(NULL, py_attrs, "attrs");
if (attrs == NULL)
return NULL;
}
@@ -2354,28 +2365,28 @@ static struct ldb_message_element *PyObject_AsMessageElement(
me->name = talloc_strdup(me, attr_name);
me->flags = flags;
- if (PyString_Check(set_obj)) {
+ if (PyBytes_Check(set_obj)) {
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].length = PyBytes_Size(set_obj);
me->values[0].data = talloc_memdup(me,
- (uint8_t *)PyString_AsString(set_obj), me->values[0].length+1);
+ (uint8_t *)PyBytes_AsString(set_obj), me->values[0].length+1);
} else if (PySequence_Check(set_obj)) {
Py_ssize_t i;
me->num_values = PySequence_Size(set_obj);
me->values = talloc_array(me, struct ldb_val, me->num_values);
for (i = 0; i < me->num_values; i++) {
PyObject *obj = PySequence_GetItem(set_obj, i);
- if (!PyString_Check(obj)) {
+ if (!PyBytes_Check(obj)) {
PyErr_Format(PyExc_TypeError,
- "Expected string as element %zd in list", i);
+ "Expected bytestring as element %zd in list", i);
talloc_free(me);
return NULL;
}
- me->values[i].length = PyString_Size(obj);
+ me->values[i].length = PyBytes_Size(obj);
me->values[i].data = talloc_memdup(me,
- (uint8_t *)PyString_AsString(obj), me->values[i].length+1);
+ (uint8_t *)PyBytes_AsString(obj), me->values[i].length+1);
}
} else {
PyErr_Format(PyExc_TypeError,
@@ -2453,7 +2464,7 @@ static PyObject *py_ldb_msg_element_find(PyLdbMessageElementObject *self, Py_ssi
PyErr_SetString(PyExc_IndexError, "Out of range");
return NULL;
}
- return PyString_FromStringAndSize((char *)el->values[idx].data, el->values[idx].length);
+ return PyBytes_FromStringAndSize((char *)el->values[idx].data, el->values[idx].length);
}
static PySequenceMethods py_ldb_msg_element_seq = {
@@ -2461,11 +2472,15 @@ static PySequenceMethods py_ldb_msg_element_seq = {
.sq_item = (ssizeargfunc)py_ldb_msg_element_find,
};
-static int py_ldb_msg_element_cmp(PyLdbMessageElementObject *self, PyLdbMessageElementObject *other)
+static PyObject *py_ldb_msg_element_richcmp(PyLdbMessageElementObject *self, PyLdbMessageElementObject *other, int op)
{
- int ret = ldb_msg_element_compare(pyldb_MessageElement_AsMessageElement(self),
- pyldb_MessageElement_AsMessageElement(other));
- return SIGN(ret);
+ int ret;
+ if (pyldb_MessageElement_Check(self) && pyldb_MessageElement_Check(other)) {
+ ret = ldb_msg_element_compare(pyldb_MessageElement_AsMessageElement(self),
+ pyldb_MessageElement_AsMessageElement(other));
+ return PY_RICHCMP(ret, 0, op);
+ }
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *py_ldb_msg_element_iter(PyLdbMessageElementObject *self)
@@ -2524,7 +2539,7 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
if (py_elements != NULL) {
Py_ssize_t i;
- if (PyString_Check(py_elements)) {
+ if (PyBytes_Check(py_elements)) {
el->num_values = 1;
el->values = talloc_array(el, struct ldb_val, 1);
if (el->values == NULL) {
@@ -2532,9 +2547,9 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
PyErr_NoMemory();
return NULL;
}
- el->values[0].length = PyString_Size(py_elements);
+ el->values[0].length = PyBytes_Size(py_elements);
el->values[0].data = talloc_memdup(el->values,
- (uint8_t *)PyString_AsString(py_elements), el->values[0].length+1);
+ (uint8_t *)PyBytes_AsString(py_elements), el->values[0].length+1);
} else if (PySequence_Check(py_elements)) {
el->num_values = PySequence_Size(py_elements);
el->values = talloc_array(el, struct ldb_val, el->num_values);
@@ -2549,19 +2564,19 @@ static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyOb
talloc_free(mem_ctx);
return NULL;
}
- if (!PyString_Check(item)) {
+ if (!PyBytes_Check(item)) {
PyErr_Format(PyExc_TypeError,
- "Expected string as element %zd in list", i);
+ "Expected bytestring as element %zd in list", i);
talloc_free(mem_ctx);
return NULL;
}
- el->values[i].length = PyString_Size(item);
+ el->values[i].length = PyBytes_Size(item);
el->values[i].data = talloc_memdup(el,
- (uint8_t *)PyString_AsString(item), el->values[i].length+1);
+ (uint8_t *)PyBytes_AsString(item), el->values[i].length+1);
}
} else {
PyErr_SetString(PyExc_TypeError,
- "Expected string or list");
+ "Expected bytestring or list");
talloc_free(mem_ctx);
return NULL;
}
@@ -2592,17 +2607,17 @@ static PyObject *py_ldb_msg_element_repr(PyLdbMessageElementObject *self)
PyObject *o = py_ldb_msg_element_find(self, i);
repr = PyObject_Repr(o);
if (element_str == NULL)
- element_str = talloc_strdup(NULL, PyString_AsString(repr));
+ element_str = talloc_strdup(NULL, PyStr_AsString(repr));
else
- element_str = talloc_asprintf_append(element_str, ",%s", PyString_AsString(repr));
+ element_str = talloc_asprintf_append(element_str, ",%s", PyStr_AsString(repr));
Py_DECREF(repr);
}
if (element_str != NULL) {
- ret = PyString_FromFormat("MessageElement([%s])", element_str);
+ ret = PyStr_FromFormat("MessageElement([%s])", element_str);
talloc_free(element_str);
} else {
- ret = PyString_FromString("MessageElement([])");
+ ret = PyStr_FromString("MessageElement([])");
}
return ret;
@@ -2613,7 +2628,7 @@ static PyObject *py_ldb_msg_element_str(PyLdbMessageElementObject *self)
struct ldb_message_element *el = pyldb_MessageElement_AsMessageElement(self);
if (el->num_values == 1)
- return PyString_FromStringAndSize((char *)el->values[0].data, el->values[0].length);
+ return PyStr_FromStringAndSize((char *)el->values[0].data, el->values[0].length);
else
Py_RETURN_NONE;
}
@@ -2631,7 +2646,7 @@ static PyTypeObject PyLdbMessageElement = {
.tp_repr = (reprfunc)py_ldb_msg_element_repr,
.tp_str = (reprfunc)py_ldb_msg_element_str,
.tp_methods = py_ldb_msg_element_methods,
- .tp_compare = (cmpfunc)py_ldb_msg_element_cmp,
+ .tp_richcompare = (richcmpfunc)py_ldb_msg_element_richcmp,
.tp_iter = (getiterfunc)py_ldb_msg_element_iter,
.tp_as_sequence = &py_ldb_msg_element_seq,
.tp_new = py_ldb_msg_element_new,
@@ -2700,11 +2715,11 @@ static PyObject *py_ldb_msg_keys(PyLdbMessageObject *self)
Py_ssize_t i, j = 0;
PyObject *obj = PyList_New(msg->num_elements+(msg->dn != NULL?1:0));
if (msg->dn != NULL) {
- PyList_SetItem(obj, j, PyString_FromString("dn"));
+ PyList_SetItem(obj, j, PyStr_FromString("dn"));
j++;
}
for (i = 0; i < msg->num_elements; i++) {
- PyList_SetItem(obj, j, PyString_FromString(msg->elements[i].name));
+ PyList_SetItem(obj, j, PyStr_FromString(msg->elements[i].name));
j++;
}
return obj;
@@ -2715,11 +2730,11 @@ static PyObject *py_ldb_msg_getitem_helper(PyLdbMessageObject *self, PyObject *p
struct ldb_message_element *el;
char *name;
struct ldb_message *msg = pyldb_Message_AsMessage(self);
- if (!PyString_Check(py_name)) {
- PyErr_SetNone(PyExc_TypeError);
+ if (!PyStr_Check(py_name)) {
+ PyErr_SetString(PyExc_TypeError, "Expected string");
return NULL;
}
- name = PyString_AsString(py_name);
+ name = PyStr_AsString(py_name);
if (!ldb_attr_cmp(name, "dn"))
return pyldb_Dn_FromDn(msg->dn);
el = ldb_msg_find_element(msg, name);
@@ -2880,12 +2895,12 @@ static int py_ldb_msg_setitem(PyLdbMessageObject *self, PyObject *name, PyObject
{
char *attr_name;
- if (!PyString_Check(name)) {
- PyErr_SetNone(PyExc_TypeError);
+ if (!PyStr_Check(name)) {
+ PyErr_SetString(PyExc_TypeError, "Expected string");
return -1;
}
- attr_name = PyString_AsString(name);
+ attr_name = PyStr_AsString(name);
if (value == NULL) {
/* delitem */
ldb_msg_remove_attr(self->msg, attr_name);
@@ -3003,11 +3018,19 @@ static PyGetSetDef py_ldb_msg_getset[] = {
static PyObject *py_ldb_msg_repr(PyLdbMessageObject *self)
{
- PyObject *dict = PyDict_New(), *ret;
+ PyObject *dict = PyDict_New(), *ret, *repr=NULL;
+ if (dict == NULL)
+ return NULL;
if (PyDict_Update(dict, (PyObject *)self) != 0)
return NULL;
- ret = PyString_FromFormat("Message(%s)", PyObject_REPR(dict));
+ repr = PyObject_Repr(dict);
+ if (repr == NULL) {
+ Py_DECREF(dict);
+ return NULL;
+ }
+ ret = PyStr_FromFormat("Message(%s)", PyStr_AsString(repr));
Py_DECREF(dict);
+ Py_DECREF(repr);
return ret;
}
@@ -3017,41 +3040,47 @@ static void py_ldb_msg_dealloc(PyLdbMessageObject *self)
PyObject_Del(self);
}
-static int py_ldb_msg_compare(PyLdbMessageObject *py_msg1,
- PyLdbMessageObject *py_msg2)
+static PyObject *py_ldb_msg_richcompare(PyObject *py_msg1,
+ PyObject *py_msg2, int op)
{
- struct ldb_message *msg1 = pyldb_Message_AsMessage(py_msg1),
- *msg2 = pyldb_Message_AsMessage(py_msg2);
+ struct ldb_message *msg1, *msg2;
unsigned int i;
int ret;
+ if (!PyLdbMessage_Check(py_msg1) || !PyLdbMessage_Check(py_msg2)) {
+ Py_RETURN_NOTIMPLEMENTED;
+ }
+
+ msg1 = pyldb_Message_AsMessage(py_msg1),
+ msg2 = pyldb_Message_AsMessage(py_msg2);
+
if ((msg1->dn != NULL) || (msg2->dn != NULL)) {
ret = ldb_dn_compare(msg1->dn, msg2->dn);
if (ret != 0) {
- return SIGN(ret);
+ return PY_RICHCMP(ret, 0, op);
}
}
ret = msg1->num_elements - msg2->num_elements;
if (ret != 0) {
- return SIGN(ret);
+ return PY_RICHCMP(ret, 0, op);
}
for (i = 0; i < msg1->num_elements; i++) {
ret = ldb_msg_element_compare_name(&msg1->elements[i],
&msg2->elements[i]);
if (ret != 0) {
- return SIGN(ret);
+ return PY_RICHCMP(ret, 0, op);
}
ret = ldb_msg_element_compare(&msg1->elements[i],
&msg2->elements[i]);
if (ret != 0) {
- return SIGN(ret);
+ return PY_RICHCMP(ret, 0, op);
}
}
- return 0;
+ return PY_RICHCMP(0, 0, op);
}
static PyTypeObject PyLdbMessage = {
@@ -3065,7 +3094,7 @@ static PyTypeObject PyLdbMessage = {
.tp_repr = (reprfunc)py_ldb_msg_repr,
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_iter = (getiterfunc)py_ldb_msg_iter,
- .tp_compare = (cmpfunc)py_ldb_msg_compare,
+ .tp_richcompare = (richcmpfunc)py_ldb_msg_richcompare,
.tp_doc = "A LDB Message",
};
@@ -3121,7 +3150,7 @@ static int py_module_search(struct ldb_module *mod, struct ldb_request *req)
for (len = 0; req->op.search.attrs[len]; len++);
py_attrs = PyList_New(len);
for (i = 0; i < len; i++)
- PyList_SetItem(py_attrs, i, PyString_FromString(req->op.search.attrs[i]));
+ PyList_SetItem(py_attrs, i, PyStr_FromString(req->op.search.attrs[i]));
}
py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "search"),
@@ -3379,7 +3408,7 @@ static PyObject *py_register_module(PyObject *module, PyObject *args)
return NULL;
}
- ops->name = talloc_strdup(ops, PyString_AsString(PyObject_GetAttrString(input, discard_const_p(char, "name"))));
+ ops->name = talloc_strdup(ops, PyStr_AsString(PyObject_GetAttrString(input, discard_const_p(char, "name"))));
Py_INCREF(input);
ops->private_data = input;
@@ -3412,7 +3441,7 @@ static PyObject *py_timestring(PyObject *module, PyObject *args)
if (!PyArg_ParseTuple(args, "l", &t_val))
return NULL;
tresult = ldb_timestring(NULL, (time_t) t_val);
- ret = PyString_FromString(tresult);
+ ret = PyStr_FromString(tresult);
talloc_free(tresult);
return ret;
}
@@ -3454,7 +3483,7 @@ static PyObject *py_binary_encode(PyObject *self, PyObject *args)
PyErr_SetString(PyExc_TypeError, "unable to encode binary string");
return NULL;
}
- ret = PyString_FromString(encoded);
+ ret = PyStr_FromString(encoded);
talloc_free(encoded);
return ret;
}
@@ -3506,102 +3535,111 @@ static PyMethodDef py_ldb_global_methods[] = {
{ NULL }
};
-void initldb(void)
+static struct PyModuleDef moduledef = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "ldb",
+ .m_doc = PyDoc_STR("An interface to LDB, a LDAP-like API that can either to talk an embedded database (TDB-based) or a standards-compliant LDAP server."),
+ .m_size = -1,
+ .m_methods = py_ldb_global_methods,
+};
+
+MODULE_INIT_FUNC(ldb)
{
PyObject *m;
if (PyType_Ready(&PyLdbDn) < 0)
- return;
+ return NULL;
if (PyType_Ready(&PyLdbMessage) < 0)
- return;
+ return NULL;
if (PyType_Ready(&PyLdbMessageElement) < 0)
- return;
+ return NULL;
if (PyType_Ready(&PyLdb) < 0)
- return;
+ return NULL;
if (PyType_Ready(&PyLdbModule) < 0)
- return;
+ return NULL;
if (PyType_Ready(&PyLdbTree) < 0)
- return;
+ return NULL;
if (PyType_Ready(&PyLdbResult) < 0)
- return;
+ return NULL;
if (PyType_Ready(&PyLdbControl) < 0)
- return;
+ return NULL;
- m = Py_InitModule3("ldb", py_ldb_global_methods,
- "An interface to LDB, a LDAP-like API that can either to talk an embedded database (TDB-based) or a standards-compliant LDAP server.");
+ m = PyModule_Create(&moduledef);
if (m == NULL)
- return;
-
- PyModule_AddObject(m, "SEQ_HIGHEST_SEQ", PyInt_FromLong(LDB_SEQ_HIGHEST_SEQ));
- PyModule_AddObject(m, "SEQ_HIGHEST_TIMESTAMP", PyInt_FromLong(LDB_SEQ_HIGHEST_TIMESTAMP));
- PyModule_AddObject(m, "SEQ_NEXT", PyInt_FromLong(LDB_SEQ_NEXT));
- PyModule_AddObject(m, "SCOPE_DEFAULT", PyInt_FromLong(LDB_SCOPE_DEFAULT));
- PyModule_AddObject(m, "SCOPE_BASE", PyInt_FromLong(LDB_SCOPE_BASE));
- PyModule_AddObject(m, "SCOPE_ONELEVEL", PyInt_FromLong(LDB_SCOPE_ONELEVEL));
- PyModule_AddObject(m, "SCOPE_SUBTREE", PyInt_FromLong(LDB_SCOPE_SUBTREE));
-
- PyModule_AddObject(m, "CHANGETYPE_NONE", PyInt_FromLong(LDB_CHANGETYPE_NONE));
- PyModule_AddObject(m, "CHANGETYPE_ADD", PyInt_FromLong(LDB_CHANGETYPE_ADD));
- PyModule_AddObject(m, "CHANGETYPE_DELETE", PyInt_FromLong(LDB_CHANGETYPE_DELETE));
- PyModule_AddObject(m, "CHANGETYPE_MODIFY", PyInt_FromLong(LDB_CHANGETYPE_MODIFY));
-
- PyModule_AddObject(m, "FLAG_MOD_ADD", PyInt_FromLong(LDB_FLAG_MOD_ADD));
- PyModule_AddObject(m, "FLAG_MOD_REPLACE", PyInt_FromLong(LDB_FLAG_MOD_REPLACE));
- PyModule_AddObject(m, "FLAG_MOD_DELETE", PyInt_FromLong(LDB_FLAG_MOD_DELETE));
-
- PyModule_AddObject(m, "SUCCESS", PyInt_FromLong(LDB_SUCCESS));
- PyModule_AddObject(m, "ERR_OPERATIONS_ERROR", PyInt_FromLong(LDB_ERR_OPERATIONS_ERROR));
- PyModule_AddObject(m, "ERR_PROTOCOL_ERROR", PyInt_FromLong(LDB_ERR_PROTOCOL_ERROR));
- PyModule_AddObject(m, "ERR_TIME_LIMIT_EXCEEDED", PyInt_FromLong(LDB_ERR_TIME_LIMIT_EXCEEDED));
- PyModule_AddObject(m, "ERR_SIZE_LIMIT_EXCEEDED", PyInt_FromLong(LDB_ERR_SIZE_LIMIT_EXCEEDED));
- PyModule_AddObject(m, "ERR_COMPARE_FALSE", PyInt_FromLong(LDB_ERR_COMPARE_FALSE));
- PyModule_AddObject(m, "ERR_COMPARE_TRUE", PyInt_FromLong(LDB_ERR_COMPARE_TRUE));
- PyModule_AddObject(m, "ERR_AUTH_METHOD_NOT_SUPPORTED", PyInt_FromLong(LDB_ERR_AUTH_METHOD_NOT_SUPPORTED));
- PyModule_AddObject(m, "ERR_STRONG_AUTH_REQUIRED", PyInt_FromLong(LDB_ERR_STRONG_AUTH_REQUIRED));
- PyModule_AddObject(m, "ERR_REFERRAL", PyInt_FromLong(LDB_ERR_REFERRAL));
- PyModule_AddObject(m, "ERR_ADMIN_LIMIT_EXCEEDED", PyInt_FromLong(LDB_ERR_ADMIN_LIMIT_EXCEEDED));
- PyModule_AddObject(m, "ERR_UNSUPPORTED_CRITICAL_EXTENSION", PyInt_FromLong(LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION));
- PyModule_AddObject(m, "ERR_CONFIDENTIALITY_REQUIRED", PyInt_FromLong(LDB_ERR_CONFIDENTIALITY_REQUIRED));
- PyModule_AddObject(m, "ERR_SASL_BIND_IN_PROGRESS", PyInt_FromLong(LDB_ERR_SASL_BIND_IN_PROGRESS));
- PyModule_AddObject(m, "ERR_NO_SUCH_ATTRIBUTE", PyInt_FromLong(LDB_ERR_NO_SUCH_ATTRIBUTE));
- PyModule_AddObject(m, "ERR_UNDEFINED_ATTRIBUTE_TYPE", PyInt_FromLong(LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE));
- PyModule_AddObject(m, "ERR_INAPPROPRIATE_MATCHING", PyInt_FromLong(LDB_ERR_INAPPROPRIATE_MATCHING));
- PyModule_AddObject(m, "ERR_CONSTRAINT_VIOLATION", PyInt_FromLong(LDB_ERR_CONSTRAINT_VIOLATION));
- PyModule_AddObject(m, "ERR_ATTRIBUTE_OR_VALUE_EXISTS", PyInt_FromLong(LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS));
- PyModule_AddObject(m, "ERR_INVALID_ATTRIBUTE_SYNTAX", PyInt_FromLong(LDB_ERR_INVALID_ATTRIBUTE_SYNTAX));
- PyModule_AddObject(m, "ERR_NO_SUCH_OBJECT", PyInt_FromLong(LDB_ERR_NO_SUCH_OBJECT));
- PyModule_AddObject(m, "ERR_ALIAS_PROBLEM", PyInt_FromLong(LDB_ERR_ALIAS_PROBLEM));
- PyModule_AddObject(m, "ERR_INVALID_DN_SYNTAX", PyInt_FromLong(LDB_ERR_INVALID_DN_SYNTAX));
- PyModule_AddObject(m, "ERR_ALIAS_DEREFERINCING_PROBLEM", PyInt_FromLong(LDB_ERR_ALIAS_DEREFERENCING_PROBLEM));
- PyModule_AddObject(m, "ERR_INAPPROPRIATE_AUTHENTICATION", PyInt_FromLong(LDB_ERR_INAPPROPRIATE_AUTHENTICATION));
- PyModule_AddObject(m, "ERR_INVALID_CREDENTIALS", PyInt_FromLong(LDB_ERR_INVALID_CREDENTIALS));
- PyModule_AddObject(m, "ERR_INSUFFICIENT_ACCESS_RIGHTS", PyInt_FromLong(LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS));
- PyModule_AddObject(m, "ERR_BUSY", PyInt_FromLong(LDB_ERR_BUSY));
- PyModule_AddObject(m, "ERR_UNAVAILABLE", PyInt_FromLong(LDB_ERR_UNAVAILABLE));
- PyModule_AddObject(m, "ERR_UNWILLING_TO_PERFORM", PyInt_FromLong(LDB_ERR_UNWILLING_TO_PERFORM));
- PyModule_AddObject(m, "ERR_LOOP_DETECT", PyInt_FromLong(LDB_ERR_LOOP_DETECT));
- PyModule_AddObject(m, "ERR_NAMING_VIOLATION", PyInt_FromLong(LDB_ERR_NAMING_VIOLATION));
- PyModule_AddObject(m, "ERR_OBJECT_CLASS_VIOLATION", PyInt_FromLong(LDB_ERR_OBJECT_CLASS_VIOLATION));
- PyModule_AddObject(m, "ERR_NOT_ALLOWED_ON_NON_LEAF", PyInt_FromLong(LDB_ERR_NOT_ALLOWED_ON_NON_LEAF));
- PyModule_AddObject(m, "ERR_NOT_ALLOWED_ON_RDN", PyInt_FromLong(LDB_ERR_NOT_ALLOWED_ON_RDN));
- PyModule_AddObject(m, "ERR_ENTRY_ALREADY_EXISTS", PyInt_FromLong(LDB_ERR_ENTRY_ALREADY_EXISTS));
- PyModule_AddObject(m, "ERR_OBJECT_CLASS_MODS_PROHIBITED", PyInt_FromLong(LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED));
- PyModule_AddObject(m, "ERR_AFFECTS_MULTIPLE_DSAS", PyInt_FromLong(LDB_ERR_AFFECTS_MULTIPLE_DSAS));
- PyModule_AddObject(m, "ERR_OTHER", PyInt_FromLong(LDB_ERR_OTHER));
-
- PyModule_AddObject(m, "FLG_RDONLY", PyInt_FromLong(LDB_FLG_RDONLY));
- PyModule_AddObject(m, "FLG_NOSYNC", PyInt_FromLong(LDB_FLG_NOSYNC));
- PyModule_AddObject(m, "FLG_RECONNECT", PyInt_FromLong(LDB_FLG_RECONNECT));
- PyModule_AddObject(m, "FLG_NOMMAP", PyInt_FromLong(LDB_FLG_NOMMAP));
-
- PyModule_AddObject(m, "__docformat__", PyString_FromString("restructuredText"));
+ return NULL;
+
+#define ADD_LDB_INT(val) PyModule_AddIntConstant(m, #val, LDB_## val)
+
+ ADD_LDB_INT(SEQ_HIGHEST_SEQ);
+ ADD_LDB_INT(SEQ_HIGHEST_TIMESTAMP);
+ ADD_LDB_INT(SEQ_NEXT);
+ ADD_LDB_INT(SCOPE_DEFAULT);
+ ADD_LDB_INT(SCOPE_BASE);
+ ADD_LDB_INT(SCOPE_ONELEVEL);
+ ADD_LDB_INT(SCOPE_SUBTREE);
+
+ ADD_LDB_INT(CHANGETYPE_NONE);
+ ADD_LDB_INT(CHANGETYPE_ADD);
+ ADD_LDB_INT(CHANGETYPE_DELETE);
+ ADD_LDB_INT(CHANGETYPE_MODIFY);
+
+ ADD_LDB_INT(FLAG_MOD_ADD);
+ ADD_LDB_INT(FLAG_MOD_REPLACE);
+ ADD_LDB_INT(FLAG_MOD_DELETE);
+
+ ADD_LDB_INT(SUCCESS);
+ ADD_LDB_INT(ERR_OPERATIONS_ERROR);
+ ADD_LDB_INT(ERR_PROTOCOL_ERROR);
+ ADD_LDB_INT(ERR_TIME_LIMIT_EXCEEDED);
+ ADD_LDB_INT(ERR_SIZE_LIMIT_EXCEEDED);
+ ADD_LDB_INT(ERR_COMPARE_FALSE);
+ ADD_LDB_INT(ERR_COMPARE_TRUE);
+ ADD_LDB_INT(ERR_AUTH_METHOD_NOT_SUPPORTED);
+ ADD_LDB_INT(ERR_STRONG_AUTH_REQUIRED);
+ ADD_LDB_INT(ERR_REFERRAL);
+ ADD_LDB_INT(ERR_ADMIN_LIMIT_EXCEEDED);
+ ADD_LDB_INT(ERR_UNSUPPORTED_CRITICAL_EXTENSION);
+ ADD_LDB_INT(ERR_CONFIDENTIALITY_REQUIRED);
+ ADD_LDB_INT(ERR_SASL_BIND_IN_PROGRESS);
+ ADD_LDB_INT(ERR_NO_SUCH_ATTRIBUTE);
+ ADD_LDB_INT(ERR_UNDEFINED_ATTRIBUTE_TYPE);
+ ADD_LDB_INT(ERR_INAPPROPRIATE_MATCHING);
+ ADD_LDB_INT(ERR_CONSTRAINT_VIOLATION);
+ ADD_LDB_INT(ERR_ATTRIBUTE_OR_VALUE_EXISTS);
+ ADD_LDB_INT(ERR_INVALID_ATTRIBUTE_SYNTAX);
+ ADD_LDB_INT(ERR_NO_SUCH_OBJECT);
+ ADD_LDB_INT(ERR_ALIAS_PROBLEM);
+ ADD_LDB_INT(ERR_INVALID_DN_SYNTAX);
+ PyModule_AddIntConstant(m, "ERR_ALIAS_DEREFERINCING_PROBLEM", LDB_ERR_ALIAS_DEREFERENCING_PROBLEM);
+ ADD_LDB_INT(ERR_INAPPROPRIATE_AUTHENTICATION);
+ ADD_LDB_INT(ERR_INVALID_CREDENTIALS);
+ ADD_LDB_INT(ERR_INSUFFICIENT_ACCESS_RIGHTS);
+ ADD_LDB_INT(ERR_BUSY);
+ ADD_LDB_INT(ERR_UNAVAILABLE);
+ ADD_LDB_INT(ERR_UNWILLING_TO_PERFORM);
+ ADD_LDB_INT(ERR_LOOP_DETECT);
+ ADD_LDB_INT(ERR_NAMING_VIOLATION);
+ ADD_LDB_INT(ERR_OBJECT_CLASS_VIOLATION);
+ ADD_LDB_INT(ERR_NOT_ALLOWED_ON_NON_LEAF);
+ ADD_LDB_INT(ERR_NOT_ALLOWED_ON_RDN);
+ ADD_LDB_INT(ERR_ENTRY_ALREADY_EXISTS);
+ ADD_LDB_INT(ERR_OBJECT_CLASS_MODS_PROHIBITED);
+ ADD_LDB_INT(ERR_AFFECTS_MULTIPLE_DSAS);
+ ADD_LDB_INT(ERR_OTHER);
+
+ ADD_LDB_INT(FLG_RDONLY);
+ ADD_LDB_INT(FLG_NOSYNC);
+ ADD_LDB_INT(FLG_RECONNECT);
+ ADD_LDB_INT(FLG_NOMMAP);
+
+ PyModule_AddStringConstant(m, "__docformat__", "restructuredText");
PyExc_LdbError = PyErr_NewException(discard_const_p(char, "_ldb.LdbError"), NULL, NULL);
PyModule_AddObject(m, "LdbError", PyExc_LdbError);
@@ -3623,9 +3661,9 @@ void initldb(void)
PyModule_AddObject(m, "Tree", (PyObject *)&PyLdbTree);
PyModule_AddObject(m, "Control", (PyObject *)&PyLdbControl);
- PyModule_AddObject(m, "__version__", PyString_FromString(PACKAGE_VERSION));
+ PyModule_AddStringConstant(m, "__version__", PACKAGE_VERSION);
-#define ADD_LDB_STRING(val) PyModule_AddObject(m, #val, PyString_FromString(LDB_## val))
+#define ADD_LDB_STRING(val) PyModule_AddStringConstant(m, #val, LDB_## val)
ADD_LDB_STRING(SYNTAX_DN);
ADD_LDB_STRING(SYNTAX_DIRECTORY_STRING);
@@ -3635,4 +3673,6 @@ void initldb(void)
ADD_LDB_STRING(SYNTAX_UTC_TIME);
ADD_LDB_STRING(OID_COMPARATOR_AND);
ADD_LDB_STRING(OID_COMPARATOR_OR);
+
+ return m;
}