/* delete all elements matching an attribute name/value return LDB Error on failure */ static int msg_delete_element(struct ldb_module *module, struct ldb_message *msg, const char *name, const struct ldb_val *val) { struct ldb_context *ldb = ldb_module_get_ctx(module); unsigned int i; int found, ret; struct ldb_message_element *el; const struct ldb_schema_attribute *a; found = find_element(msg, name); if (found == -1) { return LDB_ERR_NO_SUCH_ATTRIBUTE; } i = (unsigned int) found; el = &(msg->elements[i]); a = ldb_schema_attribute_by_name(ldb, el->name); for (i=0;i<el->num_values;i++) { bool matched; if (a->syntax->operator_fn) { ret = a->syntax->operator_fn(ldb, LDB_OP_EQUALITY, a, &el->values[i], val, &matched); if (ret != LDB_SUCCESS) return ret; } else { matched = (a->syntax->comparison_fn(ldb, ldb, &el->values[i], val) == 0); } if (matched) { if (el->num_values == 1) { return msg_delete_attribute(module, ldb, msg, name); } ret = ltdb_index_del_value(module, msg->dn, el, i); if (ret != LDB_SUCCESS) { return ret; } if (i<el->num_values-1) { memmove(&el->values[i], &el->values[i+1], sizeof(el->values[i])* (el->num_values-(i+1))); } el->num_values--; /* per definition we find in a canonicalised message an attribute value only once. So we are finished here */ return LDB_SUCCESS; } } /* Not found */ return LDB_ERR_NO_SUCH_ATTRIBUTE; }
/* delete all elements matching an attribute name/value return 0 on success, -1 on failure */ static int msg_delete_element(struct ldb_module *module, struct ldb_message *msg, const char *name, const struct ldb_val *val) { struct ldb_context *ldb = ldb_module_get_ctx(module); unsigned int i; int found, ret; struct ldb_message_element *el; const struct ldb_schema_attribute *a; found = find_element(msg, name); if (found == -1) { return -1; } el = &msg->elements[found]; a = ldb_schema_attribute_by_name(ldb, el->name); for (i=0;i<el->num_values;i++) { if (a->syntax->comparison_fn(ldb, ldb, &el->values[i], val) == 0) { if (el->num_values == 1) { return msg_delete_attribute(module, ldb, msg, name); } ret = ltdb_index_del_value(module, msg->dn, el, i); if (ret != LDB_SUCCESS) { return -1; } if (i<el->num_values-1) { memmove(&el->values[i], &el->values[i+1], sizeof(el->values[i])* (el->num_values-(i+1))); } el->num_values--; /* per definition we find in a canonicalised message an attribute value only once. So we are finished here */ return 0; } } /* Not found */ return -1; }