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/DN2ID.java |   73 ++++++++++++++++++++++--------------
 1 files changed, 45 insertions(+), 28 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/DN2ID.java b/opends/src/server/org/opends/server/backends/jeb/DN2ID.java
index c0f2825..ac3bf3b 100644
--- a/opends/src/server/org/opends/server/backends/jeb/DN2ID.java
+++ b/opends/src/server/org/opends/server/backends/jeb/DN2ID.java
@@ -22,14 +22,13 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2010 Sun Microsystems, Inc.
  */
 package org.opends.server.backends.jeb;
 
 import com.sleepycat.je.*;
 
 import org.opends.server.types.DN;
-import org.opends.server.util.StaticUtils;
 import static org.opends.server.loggers.debug.DebugLogger.*;
 import org.opends.server.loggers.debug.DebugTracer;
 
@@ -50,7 +49,9 @@
   /**
    * The key comparator used for the DN database.
    */
-  private Comparator<byte[]> dn2idComparator;
+  private final Comparator<byte[]> comparator;
+
+  private final int prefixRDNComponents;
 
   /**
    * Create a DN2ID instance for the DN database in a given entryContainer.
@@ -66,7 +67,8 @@
   {
     super(name, env, entryContainer);
 
-    dn2idComparator = new EntryContainer.KeyReverseComparator();
+    comparator = new AttributeIndex.KeyComparator();
+    prefixRDNComponents = entryContainer.getBaseDN().getNumComponents();
     DatabaseConfig dn2idConfig = new DatabaseConfig();
 
     if(env.getConfig().getReadOnly())
@@ -88,22 +90,15 @@
     }
 
     this.dbConfig = dn2idConfig;
+    this.dbConfig.setKeyPrefixing(true);
+
     //This line causes an unchecked cast error if the SuppressWarnings
     //annotation is removed at the beginning of this method.
     this.dbConfig.setBtreeComparator((Class<? extends Comparator<byte[]>>)
-                                     dn2idComparator.getClass());
+                                     comparator.getClass());
   }
 
-  /**
-   * Create a DN database key from an entry DN.
-   * @param dn The entry DN.
-   * @return A DatabaseEntry containing the key.
-   */
-  private static DatabaseEntry DNdata(DN dn)
-  {
-    byte[] normDN = StaticUtils.getBytes(dn.toNormalizedString());
-    return new DatabaseEntry(normDN);
-  }
+
 
   /**
    * Insert a new record into the DN database.
@@ -119,7 +114,8 @@
   public boolean insert(Transaction txn, DN dn, EntryID id)
        throws DatabaseException
   {
-    DatabaseEntry key = DNdata(dn);
+    DatabaseEntry key = new DatabaseEntry(
+        JebFormat.dnToDNKey(dn, prefixRDNComponents));
     DatabaseEntry data = id.getDatabaseEntry();
 
     OperationStatus status;
@@ -147,7 +143,8 @@
   public boolean put(Transaction txn, DN dn, EntryID id)
        throws DatabaseException
   {
-    DatabaseEntry key = DNdata(dn);
+    DatabaseEntry key = new DatabaseEntry(
+        JebFormat.dnToDNKey(dn, prefixRDNComponents));
     DatabaseEntry data = id.getDatabaseEntry();
 
     OperationStatus status;
@@ -170,16 +167,11 @@
    * @throws DatabaseException If an error occurred while attempting to write
    * the record.
    */
-  public boolean putRaw(Transaction txn, DatabaseEntry key, DatabaseEntry data)
+  public OperationStatus put(Transaction txn, DatabaseEntry key,
+                             DatabaseEntry data)
        throws DatabaseException
   {
-    OperationStatus status;
-    status = put(txn, key, data);
-    if (status != OperationStatus.SUCCESS)
-    {
-      return false;
-    }
-    return true;
+    return super.put(txn, key, data);
   }
 
   /**
@@ -194,7 +186,9 @@
   public boolean remove(Transaction txn, DN dn)
        throws DatabaseException
   {
-    DatabaseEntry key = DNdata(dn);
+    DatabaseEntry key = new DatabaseEntry(
+        JebFormat.dnToDNKey(dn, prefixRDNComponents)
+    );
 
     OperationStatus status = delete(txn, key);
     if (status != OperationStatus.SUCCESS)
@@ -205,6 +199,16 @@
   }
 
   /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected OperationStatus delete(Transaction txn, DatabaseEntry key)
+      throws DatabaseException
+  {
+    return super.delete(txn, key);
+  }
+
+  /**
    * Fetch the entry ID for a given DN.
    * @param txn A JE database transaction to be used for the database read, or
    * null if none is required.
@@ -216,7 +220,9 @@
   public EntryID get(Transaction txn, DN dn, LockMode lockMode)
        throws DatabaseException
   {
-    DatabaseEntry key = DNdata(dn);
+    DatabaseEntry key = new DatabaseEntry(
+        JebFormat.dnToDNKey(dn, prefixRDNComponents)
+    );
     DatabaseEntry data = new DatabaseEntry();
 
     OperationStatus status;
@@ -229,12 +235,23 @@
   }
 
   /**
+   * {@inheritDoc}
+   */
+  @Override
+  public OperationStatus read(Transaction txn,
+                              DatabaseEntry key, DatabaseEntry data,
+                              LockMode lockMode)
+  {
+    return super.read(txn, key, data, lockMode);
+  }
+
+  /**
    * Gets the comparator for records stored in this database.
    *
    * @return The comparator for records stored in this database.
    */
   public Comparator<byte[]> getComparator()
   {
-    return dn2idComparator;
+    return comparator;
   }
 }

--
Gitblit v1.10.0