Author: abartlet Date: 2007-09-18 06:36:07 +0000 (Tue, 18 Sep 2007) New Revision: 25204
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25204 Log: Patch by Andrew Kroeger <[EMAIL PROTECTED]> fixing bug #4958 - rename of ldb entries for a case change (only). I've modified the testsuite to verify this. Andrew Bartlett Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c branches/SAMBA_4_0/testprogs/ejs/ldb.js Changeset: 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 2007-09-18 02:43:56 UTC (rev 25203) +++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c 2007-09-18 06:36:07 UTC (rev 25204) @@ -856,16 +856,38 @@ goto done; } - ret = ltdb_add_internal(module, msg); - if (ret != LDB_SUCCESS) { - goto done; - } + 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. - tret = ltdb_delete_internal(module, req->op.rename.olddn); - if (tret != LDB_SUCCESS) { - ltdb_delete_internal(module, req->op.rename.newdn); - ret = LDB_ERR_OPERATIONS_ERROR; - goto done; + 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. */ + ret = ltdb_delete_internal(module, req->op.rename.olddn); + if (ret != LDB_SUCCESS) { + goto done; + } + + ret = ltdb_add_internal(module, msg); + if (ret != LDB_SUCCESS) { + goto done; + } + } 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. */ + ret = ltdb_add_internal(module, msg); + if (ret != LDB_SUCCESS) { + goto done; + } + + tret = ltdb_delete_internal(module, req->op.rename.olddn); + if (tret != LDB_SUCCESS) { + ltdb_delete_internal(module, req->op.rename.newdn); + ret = LDB_ERR_OPERATIONS_ERROR; + goto done; + } } if (ltdb_ac->callback) { Modified: branches/SAMBA_4_0/testprogs/ejs/ldb.js =================================================================== --- branches/SAMBA_4_0/testprogs/ejs/ldb.js 2007-09-18 02:43:56 UTC (rev 25203) +++ branches/SAMBA_4_0/testprogs/ejs/ldb.js 2007-09-18 06:36:07 UTC (rev 25204) @@ -60,6 +60,11 @@ res = ldb.search("x=4", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.msgs[0].dn == "cn=x3,cn=test"); + ok = ldb.rename("cn=x3,cn=test", "cn=X3,cn=test"); + assert(ok.error == 0); + res = ldb.search("x=4", NULL, ldb.SCOPE_DEFAULT, attrs); + assert(res.msgs[0].dn == "cn=X3,cn=test"); + ok = ldb.modify(" dn: cn=x3,cn=test changetype: modify