#include "includes.h"
#include "ldb_module.h"
#include "dsdb/samdb/samdb.h"
+#include "dsdb/samdb/ldb_modules/util.h"
#undef strncasecmp
}
if (cls == NULL) {
+ struct ldb_dn *schema_dn = ldb_get_schema_basedn(ldb);
+ void *old_val = ldb_get_opaque(ldb, "dsdb_schema_refresh_expected");
+ //ldb->flags |= LDB_FLG_ENABLE_TRACING;
+ ret = ldb_set_opaque(ldb, "dsdb_schema_refresh_expected", (void *)1);
+ if (ret != LDB_SUCCESS) {
+ return ldb_operr(ldb);
+ }
+ {
+ struct ldb_result *ext_res = NULL;
+ ret = dsdb_module_extended(module,
+ schema_dn,
+ &ext_res,
+ DSDB_EXTENDED_SCHEMA_UPDATE_NOW_OID,
+ NULL,
+ DSDB_FLAG_NEXT_MODULE,
+ ac->req);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+ talloc_free(ext_res);
+ }
+ schema = dsdb_get_schema(ldb, ac);
+ ret = ldb_set_opaque(ldb, "dsdb_schema_refresh_expected", old_val);
+ if (ret != LDB_SUCCESS) {
+ return ldb_operr(ldb);
+ }
+
modify_schema = dsdb_schema_copy_shallow(ac, ldb, schema);
if (modify_schema == NULL) {
return ldb_oom(ldb);
win_errstr(werr));
return ldb_module_operr(module);
}
+ if (modify_schema != NULL) {
+ ret = dsdb_schema_set_indices_and_attributes(ldb,
+ modify_schema,
+ SCHEMA_MEMORY_ONLY);
+ if (ret != LDB_SUCCESS) {
+ ldb_asprintf_errstring(ldb, "Failed to write new "
+ "@INDEXLIST and @ATTRIBUTES "
+ "records for updated schema: %s",
+ ldb_errstring(ldb));
+ return ret;
+ }
+ }
}
}
active_schema = schema;
if (modify_schema != NULL) {
- DBG_ERR("PID[%d] ac[%p] schema[%p|%llu] modify_schema[%p]\n%s\n",
- getpid(), ac, schema, (unsigned long long)schema->metadata_usn, modify_schema,
+ DBG_ERR("%s:PID[%d] ac[%p] schema[%p|%llu] modify_schema[%p]\n%s\n",
+ __location__, getpid(), ac, schema, (unsigned long long)schema->metadata_usn, modify_schema,
ldb_dn_get_linearized(msg->dn));
ret = dsdb_set_schema(ldb, modify_schema, SCHEMA_MEMORY_ONLY);
if (ret != LDB_SUCCESS) {
+ int ret2;
ldb_debug_set(ldb, LDB_DEBUG_FATAL,
- "dsdb_set_schema() failed: %d:%s: %s",
- ret, ldb_strerror(ret), ldb_errstring(ldb));
- ret = dsdb_set_global_schema(ldb);
- if (ret != LDB_SUCCESS) {
+ "%s: dsdb_set_schema() failed: %d:%s: %s",
+ __location__, ret, ldb_strerror(ret), ldb_errstring(ldb));
+ ret2 = dsdb_set_global_schema(ldb);
+ if (ret2 != LDB_SUCCESS) {
ldb_debug_set(ldb, LDB_DEBUG_FATAL,
- "dsdb_set_global_schema() failed: %d:%s: %s",
- ret, ldb_strerror(ret), ldb_errstring(ldb));
- return ret;
+ "%s: dsdb_set_global_schema() failed: %d:%s: %s",
+ __location__, ret, ldb_strerror(ret2), ldb_errstring(ldb));
+ return ret2;
}
return ret;
}