svn commit: samba r4281 - in
branches/SAMBA_4_0/source/lib/ldb/ldb_tdb: .
tridge at samba.org
tridge at samba.org
Sun Dec 19 10:56:29 GMT 2004
Author: tridge
Date: 2004-12-19 10:56:29 +0000 (Sun, 19 Dec 2004)
New Revision: 4281
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4281
Log:
fixed an ldb indexing bug in ldb found by volker.
index entries were not always being removed on modify
Modified:
branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c
branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h
Changeset:
Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c 2004-12-19 07:50:19 UTC (rev 4280)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_index.c 2004-12-19 10:56:29 UTC (rev 4281)
@@ -746,8 +746,8 @@
/*
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;
@@ -826,7 +826,7 @@
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;
}
Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c 2004-12-19 07:50:19 UTC (rev 4280)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c 2004-12-19 10:56:29 UTC (rev 4281)
@@ -403,10 +403,11 @@
/*
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);
@@ -419,6 +420,9 @@
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);
}
}
@@ -460,7 +464,7 @@
}
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;
}
@@ -532,7 +536,7 @@
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 &&
@@ -545,7 +549,7 @@
/* 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;
@@ -560,6 +564,9 @@
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;
}
Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h 2004-12-19 07:50:19 UTC (rev 4280)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.h 2004-12-19 10:56:29 UTC (rev 4281)
@@ -112,3 +112,7 @@
struct ldb_parse_tree *tree,
const char *base,
enum ldb_scope scope);
+
+int ltdb_index_del_value(struct ldb_module *module, const char *dn,
+ struct ldb_message_element *el, int v_idx);
+
More information about the samba-cvs
mailing list