};
void initldb(void);
-static PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg);
+static PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg, PyLdbObject *pyldb);
static PyObject *PyExc_LdbError;
static PyTypeObject PyLdbControl;
* @param result LDB result to convert
* @return Python object with converted result (a list object)
*/
-static PyObject *PyLdbResult_FromResult(struct ldb_result *result)
+static PyObject *PyLdbResult_FromResult(struct ldb_result *result, PyLdbObject *pyldb)
{
PyLdbResultObject *ret;
PyObject *list, *controls, *referals;
return NULL;
}
+ ret->pyldb = pyldb;
+ Py_INCREF(ret->pyldb);
+
list = PyList_New(result->count);
if (list == NULL) {
PyErr_NoMemory();
}
for (i = 0; i < result->count; i++) {
- PyObject *pymessage = PyLdbMessage_FromMessage(result->msgs[i]);
+ PyObject *pymessage = PyLdbMessage_FromMessage(result->msgs[i], pyldb);
if (pymessage == NULL) {
Py_DECREF(ret);
Py_DECREF(list);
}
py_ret->mem_ctx = mem_ctx;
py_ret->dn = parent;
+ py_ret->pyldb = self->pyldb;
+ Py_INCREF(py_ret->pyldb);
return (PyObject *)py_ret;
}
/*
copy a DN as a python object
*/
-static PyObject *py_ldb_dn_copy(struct ldb_dn *dn)
+static PyObject *py_ldb_dn_copy(struct ldb_dn *dn, PyLdbObject *pyldb)
{
TALLOC_CTX *mem_ctx = NULL;
struct ldb_dn *new_dn = NULL;
}
py_ret->mem_ctx = mem_ctx;
py_ret->dn = new_dn;
+
+ py_ret->pyldb = pyldb;
+ Py_INCREF(py_ret->pyldb);
return (PyObject *)py_ret;
}
py_ret->mem_ctx = mem_ctx;
py_ret->dn = new_dn;
+ py_ret->pyldb = self->pyldb;
+ Py_INCREF(py_ret->pyldb);
+
return (PyObject *)py_ret;
}
}
py_ret->mem_ctx = mem_ctx;
py_ret->dn = ret;
+ py_ret->pyldb = (PyLdbObject *)py_ldb;
+ Py_INCREF(py_ret->pyldb);
out:
if (str != NULL) {
PyMem_Free(discard_const_p(char, str));
static void py_ldb_dn_dealloc(PyLdbDnObject *self)
{
talloc_free(self->mem_ctx);
+ Py_DECREF(self->pyldb);
PyObject_Del(self);
}
struct ldb_dn *dn = ldb_get_root_basedn(pyldb_Ldb_AS_LDBCONTEXT(self));
if (dn == NULL)
Py_RETURN_NONE;
- return py_ldb_dn_copy(dn);
+ return py_ldb_dn_copy(dn, self);
}
struct ldb_dn *dn = ldb_get_schema_basedn(pyldb_Ldb_AS_LDBCONTEXT(self));
if (dn == NULL)
Py_RETURN_NONE;
- return py_ldb_dn_copy(dn);
+ return py_ldb_dn_copy(dn, self);
}
static PyObject *py_ldb_get_config_basedn(PyLdbObject *self,
struct ldb_dn *dn = ldb_get_config_basedn(pyldb_Ldb_AS_LDBCONTEXT(self));
if (dn == NULL)
Py_RETURN_NONE;
- return py_ldb_dn_copy(dn);
+ return py_ldb_dn_copy(dn, self);
}
static PyObject *py_ldb_get_default_basedn(PyLdbObject *self,
struct ldb_dn *dn = ldb_get_default_basedn(pyldb_Ldb_AS_LDBCONTEXT(self));
if (dn == NULL)
Py_RETURN_NONE;
- return py_ldb_dn_copy(dn);
+ return py_ldb_dn_copy(dn, self);
}
static const char **PyList_AsStrList(TALLOC_CTX *mem_ctx, PyObject *list,
Py_RETURN_NONE;
}
-static PyObject *ldb_ldif_to_pyobject(struct ldb_context *ldb, struct ldb_ldif *ldif)
+static PyObject *ldb_ldif_to_pyobject(PyLdbObject *pyldb, struct ldb_ldif *ldif)
{
PyObject *obj = NULL;
PyObject *result = NULL;
+ struct ldb_context *ldb = pyldb->ldb_ctx;
if (ldif == NULL) {
Py_RETURN_NONE;
switch (ldif->changetype) {
case LDB_CHANGETYPE_NONE:
case LDB_CHANGETYPE_ADD:
- obj = PyLdbMessage_FromMessage(ldif->msg);
+ obj = PyLdbMessage_FromMessage(ldif->msg, pyldb);
break;
case LDB_CHANGETYPE_MODIFY:
- obj = PyLdbMessage_FromMessage(ldif->msg);
+ obj = PyLdbMessage_FromMessage(ldif->msg, pyldb);
break;
case LDB_CHANGETYPE_DELETE:
if (ldif->msg->num_elements != 0) {
ldif->msg->num_elements);
return NULL;
}
- obj = pyldb_Dn_FromDn(ldif->msg->dn);
+ obj = pyldb_Dn_FromDn(ldif->msg->dn, pyldb);
break;
case LDB_CHANGETYPE_MODRDN: {
struct ldb_dn *olddn = NULL;
return NULL;
}
- olddn_obj = pyldb_Dn_FromDn(olddn);
+ olddn_obj = pyldb_Dn_FromDn(olddn, pyldb);
if (olddn_obj == NULL) {
return NULL;
}
} else {
deleteoldrdn_obj = Py_False;
}
- newdn_obj = pyldb_Dn_FromDn(newdn);
+ newdn_obj = pyldb_Dn_FromDn(newdn, pyldb);
if (newdn_obj == NULL) {
deleteoldrdn_obj = NULL;
Py_CLEAR(olddn_obj);
talloc_steal(mem_ctx, ldif);
if (ldif) {
int res = 0;
- PyObject *py_ldif = ldb_ldif_to_pyobject(self->ldb_ctx, ldif);
+ PyObject *py_ldif = ldb_ldif_to_pyobject(self, ldif);
if (py_ldif == NULL) {
Py_CLEAR(list);
if (PyErr_Occurred() == NULL) {
return NULL;
}
- py_ret = PyLdbMessage_FromMessage(diff);
+ py_ret = PyLdbMessage_FromMessage(diff, self);
talloc_free(mem_ctx);
return NULL;
}
- py_ret = PyLdbResult_FromResult(res);
+ py_ret = PyLdbResult_FromResult(res, self);
talloc_free(mem_ctx);
switch (ares->type) {
case LDB_REPLY_ENTRY:
- reply->obj = PyLdbMessage_FromMessage(ares->message);
+ reply->obj = PyLdbMessage_FromMessage(ares->message, py_iter->ldb);
if (reply->obj == NULL) {
TALLOC_FREE(ares);
return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
case LDB_REPLY_DONE:
result = (struct ldb_result) { .controls = ares->controls };
- reply->obj = PyLdbResult_FromResult(&result);
+ reply->obj = PyLdbResult_FromResult(&result, py_iter->ldb);
if (reply->obj == NULL) {
TALLOC_FREE(ares);
return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
Py_CLEAR(self->msgs);
Py_CLEAR(self->referals);
Py_CLEAR(self->controls);
+ Py_DECREF(self->pyldb);
Py_TYPE(self)->tp_free(self);
}
return NULL;
}
- py_ret = PyLdbMessage_FromMessage(msg);
+ py_ret = PyLdbMessage_FromMessage(msg, (PyLdbObject *)py_ldb);
talloc_unlink(ldb_ctx, msg);
return NULL;
}
if (!ldb_attr_cmp(name, "dn")) {
- return pyldb_Dn_FromDn(msg->dn);
+ return pyldb_Dn_FromDn(msg->dn, self->pyldb);
}
el = ldb_msg_find_element(msg, name);
if (el == NULL) {
}
if (strcasecmp(name, "dn") == 0) {
- return pyldb_Dn_FromDn(msg->dn);
+ return pyldb_Dn_FromDn(msg->dn, self->pyldb);
}
el = ldb_msg_find_element(msg, name);
}
if (msg->dn != NULL) {
PyObject *value = NULL;
- PyObject *obj = pyldb_Dn_FromDn(msg->dn);
+ PyObject *obj = pyldb_Dn_FromDn(msg->dn, self->pyldb);
int res = 0;
value = Py_BuildValue("(sO)", "dn", obj);
Py_CLEAR(obj);
py_ret->mem_ctx = mem_ctx;
py_ret->msg = ret;
+ if (pydn != NULL) {
+ py_ret->pyldb = ((PyLdbDnObject *)pydn)->pyldb;
+ Py_INCREF(py_ret->pyldb);
+ }
return (PyObject *)py_ret;
}
-static PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg)
+static PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg, PyLdbObject *pyldb)
{
TALLOC_CTX *mem_ctx = NULL;
struct ldb_message *msg_ref = NULL;
}
ret->mem_ctx = mem_ctx;
ret->msg = msg_ref;
+
+ ret->pyldb = pyldb;
+ Py_INCREF(ret->pyldb);
+
return (PyObject *)ret;
}
static PyObject *py_ldb_msg_get_dn(PyLdbMessageObject *self, void *closure)
{
struct ldb_message *msg = pyldb_Message_AsMessage(self);
- return pyldb_Dn_FromDn(msg->dn);
+ return pyldb_Dn_FromDn(msg->dn, self->pyldb);
}
static int py_ldb_msg_set_dn(PyLdbMessageObject *self, PyObject *value, void *closure)
}
msg->dn = dn;
+
+ if (self->pyldb) {
+ Py_DECREF(self->pyldb);
+ }
+
+ self->pyldb = ((PyLdbDnObject *)value)->pyldb;
+ Py_INCREF(self->pyldb);
+
return 0;
}
static void py_ldb_msg_dealloc(PyLdbMessageObject *self)
{
talloc_free(self->mem_ctx);
+ /* The pyldb element will only be present if a DN is assigned */
+ if (self->pyldb) {
+ Py_DECREF(self->pyldb);
+ }
PyObject_Del(self);
}