From ffb9044301d1c169f934e0adf4f473e99da39a47 Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Mon, 27 Aug 2007 18:58:10 +0000
Subject: [PATCH] This adds the numSubordinates and hasSubordinates operational attribute support in OpenDS. - Implemented as virtual attributes - They are enabled by default - numSubordinates and hasSubordinates methods added to the backend API and implemented for all existing backends - JE implementation uses the id2children index to keep count of the number of subordinates for each entry. - The behavior of exceeding the index-entry-limit (ALL-IDs) has changed to store a 8 byte entry ID set count with the most significant bit set to 1 instead of a 0 byte array to signify the index-entry-limit has been exceeded. The previous format is still compatible but all requests for numSubordinates will return undefined (-1). - The DBTest tool is also included in this fix. This can be used to list root containers, entry containers, database containers, index status, as well as dumping a database with or without decoding the data.
---
opends/src/server/org/opends/server/backends/BackupBackend.java | 116 +++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 95 insertions(+), 21 deletions(-)
diff --git a/opends/src/server/org/opends/server/backends/BackupBackend.java b/opends/src/server/org/opends/server/backends/BackupBackend.java
index 3993128..0f7332b 100644
--- a/opends/src/server/org/opends/server/backends/BackupBackend.java
+++ b/opends/src/server/org/opends/server/backends/BackupBackend.java
@@ -43,31 +43,11 @@
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.schema.BooleanSyntax;
import org.opends.server.schema.GeneralizedTimeSyntax;
-import org.opends.server.types.Attribute;
-import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
-import org.opends.server.types.BackupConfig;
-import org.opends.server.types.BackupDirectory;
-import org.opends.server.types.BackupInfo;
-import org.opends.server.types.ConfigChangeResult;
-import org.opends.server.types.DirectoryException;
-import org.opends.server.types.DN;
-import org.opends.server.types.Entry;
-import org.opends.server.types.InitializationException;
-import org.opends.server.types.LDIFExportConfig;
-import org.opends.server.types.LDIFImportConfig;
-import org.opends.server.types.LDIFImportResult;
-import org.opends.server.types.ObjectClass;
-import org.opends.server.types.RDN;
-import org.opends.server.types.RestoreConfig;
-import org.opends.server.types.ResultCode;
-import org.opends.server.types.SearchFilter;
-import org.opends.server.types.SearchScope;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.DebugLogLevel;
+import org.opends.server.types.*;
import static org.opends.messages.BackendMessages.*;
import static org.opends.server.util.ServerConstants.*;
@@ -341,7 +321,101 @@
return true;
}
+ /**
+ * {@inheritDoc}
+ */
+ public ConditionResult hasSubordinates(DN entryDN) throws DirectoryException
+ {
+ long ret = numSubordinates(entryDN);
+ if(ret < 0)
+ {
+ return ConditionResult.UNDEFINED;
+ }
+ else if(ret == 0)
+ {
+ return ConditionResult.FALSE;
+ }
+ else
+ {
+ return ConditionResult.TRUE;
+ }
+ }
+ /**
+ * {@inheritDoc}
+ */
+ public long numSubordinates(DN entryDN) throws DirectoryException
+ {
+ // If the requested entry was null, then return undefined.
+ if (entryDN == null)
+ {
+ return -1;
+ }
+
+ // If the requested entry was the backend base entry, then return
+ // the number of backup directories.
+ if (backupBaseDN.equals(entryDN))
+ {
+ long count = 0;
+ for (File f : backupDirectories)
+ {
+ // Check to see if the descriptor file exists. If not, then skip this
+ // backup directory.
+ File descriptorFile = new File(f, BACKUP_DIRECTORY_DESCRIPTOR_FILE);
+ if (! descriptorFile.exists())
+ {
+ continue;
+ }
+ count ++;
+ }
+ return count;
+ }
+
+ // See if the requested entry was one level below the backend base entry.
+ // If so, then it must point to a backup directory. Otherwise, it must be
+ // two levels below the backup base entry and must point to a specific
+ // backup.
+ DN parentDN = entryDN.getParentDNInSuffix();
+ if (parentDN == null)
+ {
+ return -1;
+ }
+ else if (backupBaseDN.equals(parentDN))
+ {
+ long count = 0;
+ Entry backupDirEntry = getBackupDirectoryEntry(entryDN);
+
+ AttributeType t =
+ DirectoryServer.getAttributeType(ATTR_BACKUP_DIRECTORY_PATH, true);
+ List<Attribute> attrList = backupDirEntry.getAttribute(t);
+ if ((attrList != null) && (! attrList.isEmpty()))
+ {
+ for (AttributeValue v : attrList.get(0).getValues())
+ {
+ try
+ {
+ BackupDirectory backupDirectory =
+ BackupDirectory.readBackupDirectoryDescriptor(
+ v.getStringValue());
+ count += backupDirectory.getBackups().keySet().size();
+ }
+ catch (Exception e)
+ {
+ return -1;
+ }
+ }
+ }
+ return count;
+ }
+ else if (backupBaseDN.equals(parentDN.getParentDNInSuffix()))
+ {
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+ }
/**
* Retrieves the requested entry from this backend.
--
Gitblit v1.10.0