summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/subentry.c
diff options
context:
space:
mode:
authorcvsadm <cvsadm>2005-01-21 00:44:34 +0000
committercvsadm <cvsadm>2005-01-21 00:44:34 +0000
commitb2093e3016027d6b5cf06b3f91f30769bfc099e2 (patch)
treecf58939393a9032182c4fbc4441164a9456e82f8 /ldap/servers/slapd/subentry.c
downloadds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.tar.gz
ds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.tar.xz
ds-b2093e3016027d6b5cf06b3f91f30769bfc099e2.zip
Moving NSCP Directory Server from DirectoryBranch to TRUNK, initial drop. (foxworth)ldapserver7x
Diffstat (limited to 'ldap/servers/slapd/subentry.c')
-rw-r--r--ldap/servers/slapd/subentry.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/ldap/servers/slapd/subentry.c b/ldap/servers/slapd/subentry.c
new file mode 100644
index 00000000..b178115c
--- /dev/null
+++ b/ldap/servers/slapd/subentry.c
@@ -0,0 +1,56 @@
+/** BEGIN COPYRIGHT BLOCK
+ * Copyright 2001 Sun Microsystems, Inc.
+ * Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
+ * All rights reserved.
+ * END COPYRIGHT BLOCK **/
+
+/* Code to implement subentries
+*/
+
+/* This is the plan for subentries :
+
+ For updates, they're like regular entries.
+
+ For searches, we need to do special stuff:
+ We need to examine the search filter.
+ If it contains a branch of the form "objectclass=ldapsubentry",
+ then we don't need to do anything special.
+ If it does not, we need to do special stuff:
+ We need to and a filter clause "!objectclass=ldapsubentry"
+ to the filter.
+ The intention is that no entries having objectclass "ldapsubentry"
+ should be returned to the client.
+
+ Now, I feel confident that this will all work, but it poses some
+ performance problems. Looking for the filter branch could be
+ inefficient. Adding an extra filter test to every operation
+ is likely to slow the very operations we care about most.
+
+ Need to think about the best way to optimize this, perhaps using an IDL cache.
+
+ */
+
+#include "slap.h"
+
+/* Function intended to be called only from inside get_filter, so look for subentry search filters */
+int subentry_check_filter(Slapi_Filter *f)
+{
+ if ( 0 == strcasecmp ( f->f_avvalue.bv_val, "ldapsubentry")) {
+ /* Need to remember this so we avoid rewriting the filter later */
+ return 1; /* Clear the re-write flag, since we've seen the subentry filter element */
+ }
+ return 0; /* Set the rewrite flag */
+}
+
+/* Function which wraps a filter with (AND !(objectclass=ldapsubentry)) */
+void subentry_create_filter(Slapi_Filter** filter)
+{
+ Slapi_Filter *sub_filter = NULL;
+ Slapi_Filter *new_filter = NULL;
+ char *buf = slapi_ch_strdup("(!(objectclass=ldapsubentry))");
+ sub_filter = slapi_str2filter( buf );
+ new_filter = slapi_filter_join( LDAP_FILTER_AND, *filter, sub_filter );
+ *filter = new_filter;
+ slapi_ch_free((void **)&buf);
+}
+