s4:dsdb/schema: add inftrastructure for dsdb_validate_ldb()
[samba.git] / source4 / dsdb / schema / schema.h
index 6fce354f7cc981d59fe6da47418fa27b15858f61..fb1bd3cf91287f931e45923f7e85b881300a534f 100644 (file)
@@ -22,6 +22,8 @@
 #ifndef _DSDB_SCHEMA_H
 #define _DSDB_SCHEMA_H
 
+#include "prefixmap.h"
+
 struct dsdb_attribute;
 struct dsdb_class;
 struct dsdb_schema;
@@ -32,17 +34,27 @@ struct dsdb_syntax {
        uint32_t oMSyntax;
        struct ldb_val oMObjectClass;
        const char *attributeSyntax_oid;
+       const char *equality;
+       const char *substring;
+       const char *comment;
+       const char *ldb_syntax;
 
-       WERROR (*drsuapi_to_ldb)(const struct dsdb_schema *schema,
+       WERROR (*drsuapi_to_ldb)(struct ldb_context *ldb, 
+                                const struct dsdb_schema *schema,
                                 const struct dsdb_attribute *attr,
                                 const struct drsuapi_DsReplicaAttribute *in,
                                 TALLOC_CTX *mem_ctx,
                                 struct ldb_message_element *out);
-       WERROR (*ldb_to_drsuapi)(const struct dsdb_schema *schema,
+       WERROR (*ldb_to_drsuapi)(struct ldb_context *ldb, 
+                                const struct dsdb_schema *schema,
                                 const struct dsdb_attribute *attr,
                                 const struct ldb_message_element *in,
                                 TALLOC_CTX *mem_ctx,
                                 struct drsuapi_DsReplicaAttribute *out);
+       WERROR (*validate_ldb)(struct ldb_context *ldb,
+                              const struct dsdb_schema *schema,
+                              const struct dsdb_attribute *attr,
+                              const struct ldb_message_element *in);
 };
 
 struct dsdb_attribute {
@@ -54,8 +66,10 @@ struct dsdb_attribute {
        uint32_t attributeID_id;
        struct GUID schemaIDGUID;
        uint32_t mAPIID;
+       uint32_t msDS_IntId;
 
        struct GUID attributeSecurityGUID;
+       struct GUID objectGUID;
 
        uint32_t searchFlags;
        uint32_t systemFlags;
@@ -68,8 +82,8 @@ struct dsdb_attribute {
        struct ldb_val oMObjectClass;
 
        bool isSingleValued;
-       uint32_t rangeLower;
-       uint32_t rangeUpper;
+       uint32_t *rangeLower;
+       uint32_t *rangeUpper;
        bool extendedCharsAllowed;
 
        uint32_t schemaFlagsEx;
@@ -85,6 +99,7 @@ struct dsdb_attribute {
 
        /* internal stuff */
        const struct dsdb_syntax *syntax;
+       const struct ldb_schema_attribute *ldb_schema_attribute;
 };
 
 struct dsdb_class {
@@ -95,6 +110,7 @@ struct dsdb_class {
        const char *governsID_oid;
        uint32_t governsID_id;
        struct GUID schemaIDGUID;
+       struct GUID objectGUID;
 
        uint32_t objectClassCategory;
        const char *rDNAttID;
@@ -112,6 +128,7 @@ struct dsdb_class {
        const char **mustContain;
        const char **mayContain;
        const char **possibleInferiors;
+       const char **systemPossibleInferiors;
 
        const char *defaultSecurityDescriptor;
 
@@ -125,17 +142,33 @@ struct dsdb_class {
        bool defaultHidingValue;
        bool isDefunct;
        bool systemOnly;
-};
 
-struct dsdb_schema_oid_prefix {
-       uint32_t id;
-       const char *oid;
-       size_t oid_len;
+       const char **supclasses;
+       const char **subclasses;
+       const char **subclasses_direct;
+       const char **posssuperiors;
+       uint32_t subClassOf_id;
+       uint32_t *systemAuxiliaryClass_ids;
+       uint32_t *auxiliaryClass_ids;
+       uint32_t *systemMayContain_ids;
+       uint32_t *systemMustContain_ids;
+       uint32_t *possSuperiors_ids;
+       uint32_t *mustContain_ids;
+       uint32_t *mayContain_ids;
+       uint32_t *systemPossSuperiors_ids;
+
+       /* An ordered index showing how this subClass fits into the
+        * subClass tree.  that is, an objectclass that is not
+        * subClassOf anything is 0 (just in case), and top is 1, and
+        * subClasses of top are 2, subclasses of those classes are
+        * 3 */ 
+       uint32_t subClass_order;
 };
 
+
 struct dsdb_schema {
-       uint32_t num_prefixes;
-       struct dsdb_schema_oid_prefix *prefixes;
+
+       struct dsdb_schema_prefixmap *prefixmap;
 
        /* 
         * the last element of the prefix mapping table isn't a oid,
@@ -150,6 +183,21 @@ struct dsdb_schema {
        struct dsdb_attribute *attributes;
        struct dsdb_class *classes;
 
+       /* lists of classes sorted by various attributes, for faster
+          access */
+       uint32_t num_classes;
+       struct dsdb_class **classes_by_lDAPDisplayName;
+       struct dsdb_class **classes_by_governsID_id;
+       struct dsdb_class **classes_by_governsID_oid;
+       struct dsdb_class **classes_by_cn;
+
+       /* lists of attributes sorted by various fields */
+       uint32_t num_attributes;
+       struct dsdb_attribute **attributes_by_lDAPDisplayName;
+       struct dsdb_attribute **attributes_by_attributeID_id;
+       struct dsdb_attribute **attributes_by_attributeID_oid;
+       struct dsdb_attribute **attributes_by_linkID;
+
        struct {
                bool we_are_master;
                struct ldb_dn *master_dn;
@@ -158,6 +206,22 @@ struct dsdb_schema {
        struct smb_iconv_convenience *iconv_convenience;
 };
 
+enum dsdb_attr_list_query {
+       DSDB_SCHEMA_ALL_MAY,
+       DSDB_SCHEMA_ALL_MUST,
+       DSDB_SCHEMA_SYS_MAY,
+       DSDB_SCHEMA_SYS_MUST,
+       DSDB_SCHEMA_MAY,
+       DSDB_SCHEMA_MUST,
+       DSDB_SCHEMA_ALL
+};
+
+enum dsdb_schema_convert_target {
+       TARGET_OPENLDAP,
+       TARGET_FEDORA_DS,
+       TARGET_AD_SCHEMA_SUBENTRY
+};
+
 #include "dsdb/schema/proto.h"
 
 #endif /* _DSDB_SCHEMA_H */