/*
delete an index entry for one message element
*/
-static int ltdb_index_del1(struct ldb_module *module, const char *dn,
- struct ldb_message_element *el, int v_idx)
+int ltdb_index_del_value(struct ldb_module *module, const char *dn,
+ struct ldb_message_element *el, int v_idx)
{
struct ldb_context *ldb = module->ldb;
struct ldb_message msg;
continue;
}
for (j=0;j<msg->elements[i].num_values;j++) {
- ret = ltdb_index_del1(module, msg->dn, &msg->elements[i], j);
+ ret = ltdb_index_del_value(module, msg->dn, &msg->elements[i], j);
if (ret == -1) {
return -1;
}
/*
delete all elements having a specified attribute name
*/
-static int msg_delete_attribute(struct ldb_context *ldb,
+static int msg_delete_attribute(struct ldb_module *module,
+ struct ldb_context *ldb,
struct ldb_message *msg, const char *name)
{
- unsigned int i, count=0;
+ unsigned int i, j, count=0;
struct ldb_message_element *el2;
el2 = ldb_malloc_array_p(ldb, struct ldb_message_element, msg->num_elements);
if (ldb_attr_cmp(msg->elements[i].name, name) != 0) {
el2[count++] = msg->elements[i];
} else {
+ for (j=0;j<msg->elements[i].num_values;j++) {
+ ltdb_index_del_value(module, msg->dn, &msg->elements[i], j);
+ }
ldb_free(ldb, msg->elements[i].values);
}
}
}
el->num_values--;
if (el->num_values == 0) {
- return msg_delete_attribute(ldb, msg, name);
+ return msg_delete_attribute(module, ldb, msg, name);
}
return 0;
}
case LDB_FLAG_MOD_REPLACE:
/* replace all elements of this attribute name with the elements
listed. The attribute not existing is not an error */
- msg_delete_attribute(ldb, &msg2, msg->elements[i].name);
+ msg_delete_attribute(module, ldb, &msg2, msg->elements[i].name);
/* add the replacement element, if not empty */
if (msg->elements[i].num_values != 0 &&
/* we could be being asked to delete all
values or just some values */
if (msg->elements[i].num_values == 0) {
- if (msg_delete_attribute(ldb, &msg2,
+ if (msg_delete_attribute(module, ldb, &msg2,
msg->elements[i].name) != 0) {
ltdb->last_err_string = "No such attribute";
goto failed;
ltdb->last_err_string = "No such attribute";
goto failed;
}
+ if (ltdb_index_del_value(module, msg->dn, &msg->elements[i], j) != 0) {
+ goto failed;
+ }
}
break;
}