From 218b2a22d685fef5602021786334a4d78a2460e2 Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Fri, 25 Jun 2010 09:40:08 +0000
Subject: [PATCH] Resolves an issue in Import due to entries with multiple RDNs. This patch changes the key format used by the DN2ID database. Rebuilding the index is required.
---
opends/src/server/org/opends/server/backends/jeb/DN2URI.java | 60 ++++++++++++++++++++++++------------------------------------
1 files changed, 24 insertions(+), 36 deletions(-)
diff --git a/opends/src/server/org/opends/server/backends/jeb/DN2URI.java b/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
index fbd5db1..5f32559 100644
--- a/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
+++ b/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.backends.jeb;
@@ -37,11 +37,7 @@
import org.opends.server.util.StaticUtils;
import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import static org.opends.server.util.ServerConstants.ATTR_REFERRAL_URL;
import static org.opends.server.loggers.debug.DebugLogger.*;
@@ -65,7 +61,10 @@
/**
* The key comparator used for the DN database.
*/
- private Comparator<byte[]> dn2uriComparator;
+ private final Comparator<byte[]> dn2uriComparator;
+
+
+ private final int prefixRDNComponents;
/**
@@ -100,7 +99,8 @@
{
super(name, env, entryContainer);
- dn2uriComparator = new EntryContainer.KeyReverseComparator();
+ dn2uriComparator = new AttributeIndex.KeyComparator();
+ prefixRDNComponents = entryContainer.getBaseDN().getNumComponents();
DatabaseConfig dn2uriConfig = new DatabaseConfig();
if(env.getConfig().getReadOnly())
@@ -140,10 +140,10 @@
* @return true if the record was inserted, false if it was not.
* @throws DatabaseException If an error occurs in the JE database.
*/
- public boolean insert(Transaction txn, DN dn, String labeledURI)
+ private boolean insert(Transaction txn, DN dn, String labeledURI)
throws DatabaseException
{
- byte[] normDN = StaticUtils.getBytes(dn.toNormalizedString());
+ byte[] normDN = JebFormat.dnToDNKey(dn, prefixRDNComponents);
byte[] URIBytes = StaticUtils.getBytes(labeledURI);
DatabaseEntry key = new DatabaseEntry(normDN);
DatabaseEntry data = new DatabaseEntry(URIBytes);
@@ -173,7 +173,7 @@
public boolean delete(Transaction txn, DN dn)
throws DatabaseException
{
- byte[] normDN = StaticUtils.getBytes(dn.toNormalizedString());
+ byte[] normDN = JebFormat.dnToDNKey(dn, prefixRDNComponents);
DatabaseEntry key = new DatabaseEntry(normDN);
OperationStatus status;
@@ -199,7 +199,7 @@
throws DatabaseException
{
CursorConfig cursorConfig = null;
- byte[] normDN = StaticUtils.getBytes(dn.toNormalizedString());
+ byte[] normDN = JebFormat.dnToDNKey(dn, prefixRDNComponents);
byte[] URIBytes = StaticUtils.getBytes(labeledURI);
DatabaseEntry key = new DatabaseEntry(normDN);
DatabaseEntry data = new DatabaseEntry(URIBytes);
@@ -552,8 +552,7 @@
dn = entryContainer.getParentWithinBase(dn))
{
// Look for a record whose key matches the current DN.
- String normDN = dn.toNormalizedString();
- key.setData(StaticUtils.getBytes(normDN));
+ key.setData(JebFormat.dnToDNKey(dn, prefixRDNComponents));
OperationStatus status =
cursor.getSearchKey(key, data, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS)
@@ -625,9 +624,12 @@
* find subordinates of the base entry from the top of the tree
* downwards.
*/
- DN baseDN = searchOp.getBaseDN();
- String normBaseDN = baseDN.toNormalizedString();
- byte[] suffix = StaticUtils.getBytes("," + normBaseDN);
+ byte[] baseDN = JebFormat.dnToDNKey(searchOp.getBaseDN(),
+ prefixRDNComponents);
+ byte[] suffix = Arrays.copyOf(baseDN, baseDN.length+1);
+ suffix[suffix.length-1] = 0x00;
+ byte[] end = suffix.clone();
+ end[end.length-1] = (byte) (end[end.length-1] + 1);
/*
* Set the ending value to a value of equal length but slightly
@@ -635,7 +637,6 @@
* reverse order we must set the first byte (the comma).
* No possibility of overflow here.
*/
- byte[] end = null;
DatabaseEntry data = new DatabaseEntry();
DatabaseEntry key = new DatabaseEntry(suffix);
@@ -652,11 +653,6 @@
status == OperationStatus.SUCCESS;
status = cursor.getNextNoDup(key, data, LockMode.DEFAULT))
{
- if (end == null)
- {
- end = suffix.clone();
- end[0] = (byte) (end[0] + 1);
- }
int cmp = dn2uriComparator.compare(key.getData(), end);
if (cmp >= 0)
@@ -666,13 +662,14 @@
}
// We have found a subordinate referral.
- DN dn = DN.decode(ByteString.wrap(key.getData()));
+ DN dn = JebFormat.dnFromDNKey(key.getData(), 0, key.getSize(),
+ entryContainer.getBaseDN());
// Make sure the referral is within scope.
if (searchOp.getScope() == SearchScope.SINGLE_LEVEL)
{
- if ((dn.getNumComponents() !=
- baseDN.getNumComponents() + 1))
+ if(JebFormat.findDNKeyParent(key.getData(), 0,
+ key.getSize()) == baseDN.length)
{
continue;
}
@@ -705,6 +702,7 @@
{
if (ldapurl.getBaseDN().isNullDN())
{
+
ldapurl.setBaseDN(dn);
}
ldapurl.getAttributes().clear();
@@ -762,14 +760,4 @@
return true;
}
-
- /**
- * Gets the comparator for records stored in this database.
- *
- * @return The comparator used for records stored in this database.
- */
- public Comparator<byte[]> getComparator()
- {
- return dn2uriComparator;
- }
}
--
Gitblit v1.10.0