summaryrefslogtreecommitdiff
path: root/source4/lib/ldb/ldb_tdb/ldb_tdb.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2010-10-13 20:02:18 +1100
committerAndrew Tridgell <tridge@samba.org>2010-10-13 11:00:04 +0000
commit3d75111fd61d57d2a2fb9e19bf587effb0816339 (patch)
tree8e3d8005ac2091b915ad78894ee22e858dd5c454 /source4/lib/ldb/ldb_tdb/ldb_tdb.c
parentca4864cce695fa1530d8aab50dd82566fc67c6e3 (diff)
downloadsamba-3d75111fd61d57d2a2fb9e19bf587effb0816339.tar.gz
samba-3d75111fd61d57d2a2fb9e19bf587effb0816339.tar.bz2
samba-3d75111fd61d57d2a2fb9e19bf587effb0816339.zip
s4-ldb: added an optional operator_fn in the schema syntax
this function takes the operator being invoked, which will allow schema functions to provide more fine grained control over comparisons. The key bug this was introduced to fix is the incorrect handling of the LDB_OP_PRESENT test for deleted linked attributes. The backends are unaware of the deleted state of these links, so they cannot do a LDB_OP_PRESENT test on their own. Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'source4/lib/ldb/ldb_tdb/ldb_tdb.c')
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_tdb.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.c b/source4/lib/ldb/ldb_tdb/ldb_tdb.c
index 7f8342b067..f12bc58f65 100644
--- a/source4/lib/ldb/ldb_tdb/ldb_tdb.c
+++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.c
@@ -553,8 +553,16 @@ static int msg_delete_element(struct ldb_module *module,
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) {
+ 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);
}