From fdd07e87c6fc7a4a0ea7c6f99080d78e526042e6 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 10 Aug 2012 08:44:04 +1000 Subject: [PATCH] s4-dsdb: Explain better what records are written during schema set This is controlled by setting write_indices_and_attributes. Andrew Bartlett --- source4/dsdb/pydsdb.c | 6 +++--- source4/dsdb/schema/schema_set.c | 23 +++++++++++++++------- .../scripting/python/samba/provision/__init__.py | 6 +++--- source4/scripting/python/samba/samdb.py | 8 ++++---- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/source4/dsdb/pydsdb.c b/source4/dsdb/pydsdb.c index 9023d69054b..39229f487f5 100644 --- a/source4/dsdb/pydsdb.c +++ b/source4/dsdb/pydsdb.c @@ -873,9 +873,9 @@ static PyObject *py_dsdb_set_schema_from_ldb(PyObject *self, PyObject *args) struct ldb_context *from_ldb; struct dsdb_schema *schema; int ret; - char write_attributes = true; + char write_indices_and_attributes = true; if (!PyArg_ParseTuple(args, "OO|b", - &py_ldb, &py_from_ldb, &write_attributes)) + &py_ldb, &py_from_ldb, &write_indices_and_attributes)) return NULL; PyErr_LDB_OR_RAISE(py_ldb, ldb); @@ -888,7 +888,7 @@ static PyObject *py_dsdb_set_schema_from_ldb(PyObject *self, PyObject *args) return NULL; } - ret = dsdb_reference_schema(ldb, schema, write_attributes); + ret = dsdb_reference_schema(ldb, schema, write_indices_and_attributes); PyErr_LDB_ERROR_IS_ERR_RAISE(py_ldb_get_exception(), ret, ldb); Py_RETURN_NONE; diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c index 286a8a3f23f..e226118b4c5 100644 --- a/source4/dsdb/schema/schema_set.c +++ b/source4/dsdb/schema/schema_set.c @@ -50,8 +50,13 @@ const struct ldb_schema_attribute *dsdb_attribute_handler_override(struct ldb_co } return a->ldb_schema_attribute; } - -static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schema *schema, bool write_attributes) +/* + * Set the attribute handlers onto the LDB, and potentially write the + * @INDEXLIST, @IDXONE and @ATTRIBUTES records. The @ATTRIBUTES records + * are required so we can operate on a schema-less database (say the + * backend during emergency fixes) and during the schema load. + */ +static int dsdb_schema_set_indices_and_attributes(struct ldb_context *ldb, struct dsdb_schema *schema, bool write_indices_and_attributes) { int ret = LDB_SUCCESS; struct ldb_result *res; @@ -65,7 +70,7 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem /* setup our own attribute name to schema handler */ ldb_schema_attribute_set_override_handler(ldb, dsdb_attribute_handler_override, schema); - if (!write_attributes) { + if (!write_indices_and_attributes) { return ret; } @@ -454,7 +459,7 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) } /* Set the new attributes based on the new schema */ - ret = dsdb_schema_set_attributes(ldb, schema, true); + ret = dsdb_schema_set_indices_and_attributes(ldb, schema, true); if (ret != LDB_SUCCESS) { return ret; } @@ -469,9 +474,13 @@ static struct dsdb_schema *global_schema; /** * Make this ldb use a specified schema, already fully calculated and belonging to another ldb + * + * The write_indices_and_attributes controls writing of the @ records + * because we cannot write to a database that does not yet exist on + * disk. */ int dsdb_reference_schema(struct ldb_context *ldb, struct dsdb_schema *schema, - bool write_attributes) + bool write_indices_and_attributes) { int ret; struct dsdb_schema *old_schema; @@ -495,7 +504,7 @@ int dsdb_reference_schema(struct ldb_context *ldb, struct dsdb_schema *schema, return ret; } - ret = dsdb_schema_set_attributes(ldb, schema, write_attributes); + ret = dsdb_schema_set_indices_and_attributes(ldb, schema, write_indices_and_attributes); if (ret != LDB_SUCCESS) { return ret; } @@ -519,7 +528,7 @@ int dsdb_set_global_schema(struct ldb_context *ldb) } /* Set the new attributes based on the new schema */ - ret = dsdb_schema_set_attributes(ldb, global_schema, false /* Don't write attributes, it's expensive */); + ret = dsdb_schema_set_indices_and_attributes(ldb, global_schema, false /* Don't write indices and attributes, it's expensive */); if (ret == LDB_SUCCESS) { /* Keep a reference to this schema, just in case the original copy is replaced */ if (talloc_reference(ldb, global_schema) == NULL) { diff --git a/source4/scripting/python/samba/provision/__init__.py b/source4/scripting/python/samba/provision/__init__.py index 94e857e9f42..6834d40eb48 100644 --- a/source4/scripting/python/samba/provision/__init__.py +++ b/source4/scripting/python/samba/provision/__init__.py @@ -1121,7 +1121,7 @@ def setup_samdb(path, session_info, provision_backend, lp, names, logger.info("Pre-loading the Samba 4 and AD schema") # Load the schema from the one we computed earlier - samdb.set_schema(schema, write_attributes=False) + samdb.set_schema(schema, write_indices_and_attributes=False) # Set the NTDS settings DN manually - in order to have it already around # before the provisioned tree exists and we connect @@ -1133,8 +1133,8 @@ def setup_samdb(path, session_info, provision_backend, lp, names, # But we have to give it one more kick to have it use the schema # during provision - it needs, now that it is connected, to write - # the schema @INDEX records to the database. - samdb.set_schema(schema, write_attributes=True) + # the schema @ATTRIBUTES and @INDEXLIST records to the database. + samdb.set_schema(schema, write_indices_and_attributes=True) return samdb diff --git a/source4/scripting/python/samba/samdb.py b/source4/scripting/python/samba/samdb.py index 3355e9a5898..7db1b007542 100644 --- a/source4/scripting/python/samba/samdb.py +++ b/source4/scripting/python/samba/samdb.py @@ -608,11 +608,11 @@ accountExpires: %u def load_partition_usn(self, base_dn): return dsdb._dsdb_load_partition_usn(self, base_dn) - def set_schema(self, schema, write_attributes=True): - self.set_schema_from_ldb(schema.ldb, write_attributes=write_attributes) + def set_schema(self, schema, write_indices_and_attributes=True): + self.set_schema_from_ldb(schema.ldb, write_indices_and_attributes=write_indices_and_attributes) - def set_schema_from_ldb(self, ldb_conn, write_attributes=True): - dsdb._dsdb_set_schema_from_ldb(self, ldb_conn, write_attributes) + def set_schema_from_ldb(self, ldb_conn, write_indices_and_attributes=True): + dsdb._dsdb_set_schema_from_ldb(self, ldb_conn, write_indices_and_attributes) def dsdb_DsReplicaAttribute(self, ldb, ldap_display_name, ldif_elements): '''convert a list of attribute values to a DRSUAPI DsReplicaAttribute''' -- 2.11.4.GIT