s4:ldb_dn: remove dn->ext_linearized when ext_components is modified.
[nivanova/samba-autobuild/.git] / source4 / lib / ldb / common / ldb_attributes.c
index 001bc45ee1ad5fecf9f0b29a686e8803e26b735b..79c5dd69de43f0485abaf6e9a1633fbcccb3fb4e 100644 (file)
@@ -28,7 +28,8 @@
   message matching logic generic
 */
 
-#include "ldb_includes.h"
+#include "ldb_private.h"
+#include "ldb_handlers.h"
 
 /*
   add a attribute to the ldb_schema
@@ -117,8 +118,9 @@ static const struct ldb_schema_attribute ldb_attribute_default = {
 /*
   return the attribute handlers for a given attribute
 */
-const struct ldb_schema_attribute *ldb_schema_attribute_by_name(struct ldb_context *ldb,
-                                                               const char *name)
+static const struct ldb_schema_attribute *ldb_schema_attribute_by_name_internal(
+       struct ldb_context *ldb,
+       const char *name)
 {
        int i, e, b = 0, r;
        const struct ldb_schema_attribute *def = &ldb_attribute_default;
@@ -151,6 +153,25 @@ const struct ldb_schema_attribute *ldb_schema_attribute_by_name(struct ldb_conte
        return def;
 }
 
+/*
+  return the attribute handlers for a given attribute
+*/
+const struct ldb_schema_attribute *ldb_schema_attribute_by_name(struct ldb_context *ldb,
+                                                               const char *name)
+{
+       if (ldb->schema.attribute_handler_override) {
+               const struct ldb_schema_attribute *ret = 
+                       ldb->schema.attribute_handler_override(ldb, 
+                                                              ldb->schema.attribute_handler_override_private,
+                                                              name);
+               if (ret) {
+                       return ret;
+               }
+       }
+
+       return ldb_schema_attribute_by_name_internal(ldb, name);
+}
+
 
 /*
   add to the list of ldif handlers for this ldb context
@@ -160,7 +181,7 @@ void ldb_schema_attribute_remove(struct ldb_context *ldb, const char *name)
        const struct ldb_schema_attribute *a;
        int i;
 
-       a = ldb_schema_attribute_by_name(ldb, name);
+       a = ldb_schema_attribute_by_name_internal(ldb, name);
        if (a == NULL || a->name == NULL) {
                return;
        }
@@ -272,3 +293,14 @@ const struct ldb_dn_extended_syntax *ldb_dn_extended_syntax_by_name(struct ldb_c
        return NULL;
 }
 
+/*
+  set an attribute handler override function - used to delegate schema handling
+  to external code
+ */
+void ldb_schema_attribute_set_override_handler(struct ldb_context *ldb,
+                                              ldb_attribute_handler_override_fn_t override,
+                                              void *private_data)
+{
+       ldb->schema.attribute_handler_override_private = private_data;
+       ldb->schema.attribute_handler_override = override;
+}