diff options
author | Andrew Tridgell <tridge@samba.org> | 2011-08-09 11:47:25 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2011-08-09 11:56:23 +0200 |
commit | 55b25e1e23882fb8eb476408790b12f03a5d65e8 (patch) | |
tree | 957b26a2bbe1167491838f19dc305c9df93ca613 | |
parent | 6ef36a0e6ad3363445e1250495873738e83b108a (diff) | |
download | samba-55b25e1e23882fb8eb476408790b12f03a5d65e8.tar.gz samba-55b25e1e23882fb8eb476408790b12f03a5d65e8.tar.bz2 samba-55b25e1e23882fb8eb476408790b12f03a5d65e8.zip |
s4-dsdb: ensure we setup the dn_format field in schema attributes
this ensures we setup dn_format when we do runtime schema changes
Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>
-rw-r--r-- | source4/dsdb/schema/schema_inferiors.c | 31 | ||||
-rw-r--r-- | source4/dsdb/schema/schema_set.c | 40 |
2 files changed, 40 insertions, 31 deletions
diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c index fe456412d1..d2c134ea9e 100644 --- a/source4/dsdb/schema/schema_inferiors.c +++ b/source4/dsdb/schema/schema_inferiors.c @@ -328,7 +328,6 @@ int schema_fill_constructed(const struct dsdb_schema *schema) { int ret; struct dsdb_class *schema_class; - struct dsdb_attribute *attribute; schema_fill_from_ids(schema); @@ -354,35 +353,5 @@ int schema_fill_constructed(const struct dsdb_schema *schema) schema_class->posssuperiors = NULL; } - /* setup fast access to one_way_link and DN format */ - for (attribute=schema->attributes; attribute; attribute=attribute->next) { - attribute->dn_format = dsdb_dn_oid_to_format(attribute->syntax->ldap_oid); - - if (attribute->dn_format == DSDB_INVALID_DN) { - attribute->one_way_link = false; - continue; - } - - /* these are not considered to be one way links for - the purpose of DN link fixups */ - if (ldb_attr_cmp("distinguishedName", attribute->lDAPDisplayName) == 0 || - ldb_attr_cmp("objectCategory", attribute->lDAPDisplayName) == 0) { - attribute->one_way_link = false; - continue; - } - - if (attribute->linkID == 0) { - attribute->one_way_link = true; - continue; - } - /* handle attributes with a linkID but no backlink */ - if (dsdb_attribute_by_linkID(schema, attribute->linkID) == NULL) { - attribute->one_way_link = true; - continue; - } - attribute->one_way_link = false; - } - - return LDB_SUCCESS; } diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c index 9dee0a4eec..1c1e45ef78 100644 --- a/source4/dsdb/schema/schema_set.c +++ b/source4/dsdb/schema/schema_set.c @@ -200,6 +200,44 @@ op_error: return ldb_operr(ldb); } + +/* + create extra attribute shortcuts + */ +static void dsdb_setup_attribute_shortcuts(struct ldb_context *ldb, struct dsdb_schema *schema) +{ + struct dsdb_attribute *attribute; + + /* setup fast access to one_way_link and DN format */ + for (attribute=schema->attributes; attribute; attribute=attribute->next) { + attribute->dn_format = dsdb_dn_oid_to_format(attribute->syntax->ldap_oid); + + if (attribute->dn_format == DSDB_INVALID_DN) { + attribute->one_way_link = false; + continue; + } + + /* these are not considered to be one way links for + the purpose of DN link fixups */ + if (ldb_attr_cmp("distinguishedName", attribute->lDAPDisplayName) == 0 || + ldb_attr_cmp("objectCategory", attribute->lDAPDisplayName) == 0) { + attribute->one_way_link = false; + continue; + } + + if (attribute->linkID == 0) { + attribute->one_way_link = true; + continue; + } + /* handle attributes with a linkID but no backlink */ + if (dsdb_attribute_by_linkID(schema, attribute->linkID) == NULL) { + attribute->one_way_link = true; + continue; + } + attribute->one_way_link = false; + } +} + static int uint32_cmp(uint32_t c1, uint32_t c2) { if (c1 == c2) return 0; @@ -354,6 +392,8 @@ int dsdb_setup_sorted_accessors(struct ldb_context *ldb, TYPESAFE_QSORT(schema->attributes_by_attributeID_oid, schema->num_attributes, dsdb_compare_attribute_by_attributeID_oid); TYPESAFE_QSORT(schema->attributes_by_linkID, schema->num_attributes, dsdb_compare_attribute_by_linkID); + dsdb_setup_attribute_shortcuts(ldb, schema); + return LDB_SUCCESS; failed: |