diff options
author | Andrew Tridgell <tridge@samba.org> | 2009-06-04 13:52:40 +1000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2009-06-04 14:10:11 +1000 |
commit | 0849c1ef77a0538d5d232016a51c002e2197e776 (patch) | |
tree | 350735123a1815fd651113a3a25fd53c071c8879 | |
parent | 8ca8dabe4615416153be9be7be16558e43d17381 (diff) | |
download | samba-0849c1ef77a0538d5d232016a51c002e2197e776.tar.gz samba-0849c1ef77a0538d5d232016a51c002e2197e776.tar.bz2 samba-0849c1ef77a0538d5d232016a51c002e2197e776.zip |
fixed ldb rename now that we have unique indexes
With unique indexes, any rename of a record that has an attribute that
is uniquely indexed needs to be done as a delete followed by an add,
otherwse you'll get an error that the attribute value already exists.
-rw-r--r-- | source4/lib/ldb/ldb_tdb/ldb_tdb.c | 41 |
1 files changed, 11 insertions, 30 deletions
diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.c b/source4/lib/ldb/ldb_tdb/ldb_tdb.c index 0f84b67afa..4a452761b8 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_tdb.c +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.c @@ -805,37 +805,18 @@ static int ltdb_rename(struct ltdb_context *ctx) return LDB_ERR_OPERATIONS_ERROR; } - if (ldb_dn_compare(req->op.rename.olddn, req->op.rename.newdn) == 0) { - /* The rename operation is apparently only changing case - - the DNs are the same. Delete the old DN before adding - the new one to avoid a TDB_ERR_EXISTS error. - - The only drawback to this is that if the delete - succeeds but the add fails, we rely on the - transaction to roll this all back. */ - tret = ltdb_delete_internal(module, req->op.rename.olddn); - if (tret != LDB_SUCCESS) { - return tret; - } - - tret = ltdb_add_internal(module, msg); - if (tret != LDB_SUCCESS) { - return tret; - } - } else { - /* The rename operation is changing DNs. Try to add the new - DN first to avoid clobbering another DN not related to - this rename operation. */ - tret = ltdb_add_internal(module, msg); - if (tret != LDB_SUCCESS) { - return tret; - } + /* Always delete first then add, to avoid conflicts with + * unique indexes. We rely on the transaction to make this + * atomic + */ + tret = ltdb_delete_internal(module, req->op.rename.olddn); + if (tret != LDB_SUCCESS) { + return tret; + } - tret = ltdb_delete_internal(module, req->op.rename.olddn); - if (tret != LDB_SUCCESS) { - ltdb_delete_internal(module, req->op.rename.newdn); - return LDB_ERR_OPERATIONS_ERROR; - } + tret = ltdb_add_internal(module, msg); + if (tret != LDB_SUCCESS) { + return tret; } return LDB_SUCCESS; |