From 70923036a7321b1a08f66e5ea400f8ca49f65d36 Mon Sep 17 00:00:00 2001
From: coulbeck <coulbeck@localhost>
Date: Thu, 17 May 2007 22:19:57 +0000
Subject: [PATCH] Issue 1614: backend refuses to open when essential index missing. Need to preserve org.opends.server.synchronization.plugin.HistoricalCsnOrderingMatchingRule to maintain compatibility with databases created by older builds.

---
 opendj-sdk/opends/src/server/org/opends/server/synchronization/plugin/HistoricalCsnOrderingMatchingRule.java |   91 +++++++++++++++++++++++++++++++++++++++++++++
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java                                       |    1 
 2 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
index d367cdd..44e7778 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
@@ -138,6 +138,7 @@
   public void open(DatabaseConfig dbConfig) throws DatabaseException
   {
     this.dbConfig = dbConfig;
+    this.dbConfig.setOverrideBtreeComparator(true);
     this.dbConfig.setBtreeComparator(comparator.getClass());
     getDatabase();
   }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/synchronization/plugin/HistoricalCsnOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/synchronization/plugin/HistoricalCsnOrderingMatchingRule.java
new file mode 100644
index 0000000..93fedc0
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/synchronization/plugin/HistoricalCsnOrderingMatchingRule.java
@@ -0,0 +1,91 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.server.synchronization.plugin;
+
+import org.opends.server.api.OrderingMatchingRule;
+import org.opends.server.core.DirectoryServer;
+
+import java.util.Comparator;
+
+/**
+ * This class maintains compatibility with databases created before the
+ * org.opends.server.synchronization package was renamed.  The class
+ * was used as a JE custom btree comparator in the ds-sync-hist attribute
+ * index, so older databases expect it to exist.  This class now just
+ * implements the comparator interface and delegates to the matching rule
+ * comparator found in the replication package.
+ */
+public class HistoricalCsnOrderingMatchingRule implements Comparator<byte[]>
+{
+  /**
+   * The historicalCsnOrderingMatch matching rule in the replication package.
+   */
+  private static OrderingMatchingRule rule = null;
+
+
+  /**
+   * Compares its two arguments for order.  Returns a negative integer,
+   * zero, or a positive integer as the first argument is less than, equal
+   * to, or greater than the second.<p>
+   * <p/>
+   * The implementor must ensure that <tt>sgn(compare(x, y)) ==
+   * -sgn(compare(y, x))</tt> for all <tt>x</tt> and <tt>y</tt>.  (This
+   * implies that <tt>compare(x, y)</tt> must throw an exception if and only
+   * if <tt>compare(y, x)</tt> throws an exception.)<p>
+   * <p/>
+   * The implementor must also ensure that the relation is transitive:
+   * <tt>((compare(x, y)&gt;0) &amp;&amp; (compare(y, z)&gt;0))</tt> implies
+   * <tt>compare(x, z)&gt;0</tt>.<p>
+   * <p/>
+   * Finally, the implementer must ensure that <tt>compare(x, y)==0</tt>
+   * implies that <tt>sgn(compare(x, z))==sgn(compare(y, z))</tt> for all
+   * <tt>z</tt>.<p>
+   * <p/>
+   * It is generally the case, but <i>not</i> strictly required that
+   * <tt>(compare(x, y)==0) == (x.equals(y))</tt>.  Generally speaking,
+   * any comparator that violates this condition should clearly indicate
+   * this fact.  The recommended language is "Note: this comparator
+   * imposes orderings that are inconsistent with equals."
+   *
+   * @param o1 the first object to be compared.
+   * @param o2 the second object to be compared.
+   * @return a negative integer, zero, or a positive integer as the
+   *         first argument is less than, equal to, or greater than the
+   *         second.
+   */
+  public int compare(byte[] o1, byte[] o2)
+  {
+    if (rule == null)
+    {
+      rule = DirectoryServer.
+           getOrderingMatchingRule("historicalCsnOrderingMatch");
+    }
+    return rule.compare(o1, o2);
+  }
+
+}

--
Gitblit v1.10.0