summaryrefslogtreecommitdiff
path: root/source4/dsdb/schema
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2011-08-09 11:47:25 +1000
committerAndrew Bartlett <abartlet@samba.org>2011-08-09 11:56:23 +0200
commit55b25e1e23882fb8eb476408790b12f03a5d65e8 (patch)
tree957b26a2bbe1167491838f19dc305c9df93ca613 /source4/dsdb/schema
parent6ef36a0e6ad3363445e1250495873738e83b108a (diff)
downloadsamba-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>
Diffstat (limited to 'source4/dsdb/schema')
-rw-r--r--source4/dsdb/schema/schema_inferiors.c31
-rw-r--r--source4/dsdb/schema/schema_set.c40
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: