From 0d9383e9bdcfc20e808968f4b7fe6c1ac0f48fa6 Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Mon, 17 Aug 2009 00:23:12 +0000
Subject: [PATCH] These changes allow import-ldif to support multiple suffixes and fix some problems with the include/exclude options.

---
 opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java |  127 ++++++++++++++++++++++++++---------------
 1 files changed, 80 insertions(+), 47 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java b/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
index 909b3b4..9c3607a 100644
--- a/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
+++ b/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
@@ -56,35 +56,25 @@
 
   //Key related to an ID set.
   private byte[] key;
+  private int limit;
+  private boolean doCount;
 
 
   /**
-   * Create an empty import set.
-   */
-  public ImportIDSet() { }
-
-
-  /**
-   * Create an import ID set of the specified size plus an extra 128 slots.
+   * Create an import ID set of the specified size, index limit and index
+   * maintain count boolean, plus an extra 128 slots.
    *
    * @param size The size of the the underlying array, plus some extra space.
+   * @param limit The index entry limit.
+   * @param doCount The index maintain count boolean.
    */
-  public ImportIDSet(int size)
+  public ImportIDSet(int size, int limit, boolean doCount)
   {
     this.array = new long[size + 128];
+    this.limit = limit;
+    this.doCount = doCount;
   }
 
-  /**
-   * Create an import set and add the specified entry ID to it.
-   *
-   * @param id The entry ID.
-   */
-  public ImportIDSet(EntryID id)
-  {
-    this.array = new long[1];
-    this.array[0] = id.longValue();
-    count=1;
-  }
 
   /**
    * Return if an import ID set is defined or not.
@@ -121,16 +111,13 @@
    * if the newly merged set is defined or not.
    *
    * @param importIDSet The import ID set to merge with.
-   * @param limit The index limit to use in the undefined calculation.
-   * @param maintainCount <CODE>True</CODE> if a count of the IDs should be kept
-   *                      after going undefined.
    */
   public void
-  merge(ImportIDSet importIDSet, int limit, boolean maintainCount)
+  merge(ImportIDSet importIDSet)
   {
     if(!isDefined() && !importIDSet.isDefined()) //both undefined
     {
-      if(maintainCount)
+      if(doCount)
       {
         undefinedSize += importIDSet.getUndefinedSize();
       }
@@ -138,7 +125,7 @@
     }
     else if(!isDefined()) //this undefined
     {
-      if(maintainCount)
+      if(doCount)
       {
           undefinedSize += importIDSet.size();
       }
@@ -147,7 +134,7 @@
     else if(!importIDSet.isDefined()) //other undefined
     {
       isDefined = false;
-      if(maintainCount)
+      if(doCount)
       {
         undefinedSize =  size() + importIDSet.getUndefinedSize();
       } else {
@@ -159,7 +146,7 @@
     else if ((count + importIDSet.size()) > limit) //add together => undefined
     {
       isDefined = false;
-      if(maintainCount)  {
+      if(doCount)  {
         undefinedSize = size() + importIDSet.size();
       } else {
         undefinedSize = Long.MAX_VALUE;
@@ -176,25 +163,19 @@
    * Add the specified entry id to an import ID set.
    *
    * @param entryID  The entry ID to add to an import ID set.
-   * @param limit  The index limit to use in the undefined calculation.
-   * @param maintainCount <CODE>True</CODE> if a count of the IDs should be kept
-   *                      after going undefined.
    */
-  public void addEntryID(EntryID entryID, int limit, boolean maintainCount) {
-    addEntryID(entryID.longValue(), limit, maintainCount);
+  public void addEntryID(EntryID entryID) {
+    addEntryID(entryID.longValue());
   }
 
     /**
    * Add the specified long value to an import ID set.
    *
    * @param l The long value to add to an import ID set.
-   * @param limit  The index limit to use in the undefined calculation.
-   * @param maintainCount <CODE>True</CODE> if a count of the IDs should be kept
-   *                      after going undefined.
    */
-  public void addEntryID(long l, int limit, boolean maintainCount) {
+  public void addEntryID(long l) {
     if(!isDefined()) {
-      if(maintainCount)  {
+      if(doCount)  {
         undefinedSize++;
       }
       return;
@@ -202,7 +183,7 @@
     if(isDefined() && ((count + 1) > limit)) {
       isDefined = false;
       array = null;
-      if(maintainCount)  {
+      if(doCount)  {
         undefinedSize = count + 1;
       } else {
         undefinedSize = Long.MAX_VALUE;
@@ -215,7 +196,7 @@
 
 
   private boolean
-  mergeCount(byte[] dBbytes, ImportIDSet importIdSet, int limit)  {
+  mergeCount(byte[] dBbytes, ImportIDSet importIdSet)  {
     boolean incrLimitCount=false;
     boolean dbUndefined = ((dBbytes[0] & 0x80) == 0x80);
 
@@ -248,6 +229,43 @@
     return incrLimitCount;
   }
 
+
+  /**
+   * Remove the specified import ID set from the byte array read from the DB.
+   *
+   * @param dBbytes The byte array read from JEB.
+   * @param importIdSet The import ID set to delete.
+   */
+  public void remove(byte[] dBbytes, ImportIDSet importIdSet)
+  {
+    boolean incrLimitCount=false;
+    boolean dbUndefined = ((dBbytes[0] & 0x80) == 0x80);
+    if(dbUndefined) {
+      isDefined=false;
+      importIdSet.setUndefined();
+      undefinedSize = Long.MAX_VALUE;
+    } else if(!importIdSet.isDefined()) {
+      isDefined=false;
+      incrLimitCount=true;
+      undefinedSize = Long.MAX_VALUE;
+    } else {
+      array = JebFormat.entryIDListFromDatabase(dBbytes);
+      if(array.length - importIdSet.size() > limit) {
+        isDefined=false;
+        incrLimitCount=true;
+        count = 0;
+        importIdSet.setUndefined();
+        undefinedSize = Long.MAX_VALUE;
+      } else {
+        count = array.length;
+        removeAll(importIdSet);
+      }
+    }
+  }
+
+
+
+
   /**
    * Merge the specified byte array read from a DB, with the specified import
    * ID set. The specified limit and maintain count parameters define
@@ -255,18 +273,14 @@
    *
    * @param dBbytes The byte array of IDs read from a DB.
    * @param importIdSet The import ID set to merge the byte array with.
-   * @param limit The index limit to use in the undefined calculation.
-   * @param maintainCount <CODE>True</CODE> if the import ID set should
-   *                      maintain a count of import IDs.
    * @return <CODE>True</CODE> if the import ID set started keeping a count as
    *         a result of the merge.
    */
-  public boolean merge(byte[] dBbytes, ImportIDSet importIdSet,
-                       int limit, boolean maintainCount)
+  public boolean merge(byte[] dBbytes, ImportIDSet importIdSet)
   {
     boolean incrLimitCount=false;
-    if(maintainCount) {
-      incrLimitCount = mergeCount(dBbytes,  importIdSet, limit);
+    if(doCount) {
+      incrLimitCount = mergeCount(dBbytes,  importIdSet);
     } else {
       boolean dbUndefined = ((dBbytes[0] & 0x80) == 0x80);
       if(dbUndefined) {
@@ -294,6 +308,25 @@
     return incrLimitCount;
   }
 
+
+  private void removeAll(ImportIDSet that) {
+
+    long[] newArray = new long[array.length];
+    int c = 0;
+    for(int i=0; i < count; i++)
+    {
+      int rc = binarySearch(that.array, that.count, array[i]);
+      if(rc < 0)
+      {
+        newArray[c++] = array[i];
+      }
+    }
+    array = newArray;
+    count = c;
+  }
+
+
+
   private  void addAll(ImportIDSet that) {
     resize(this.count+that.count);
 
@@ -511,6 +544,6 @@
    */
   public byte[] getKey()
   {
-    return this.key;
+    return key;
   }
 }

--
Gitblit v1.10.0