source4/dsdb/samdb/ldb_modules/resolve_oids.c works now?
[metze/samba/wip.git] / source4 / dsdb / samdb / ldb_modules / resolve_oids.c
index 5dcf3f97397088e4d85cf2c799ba6eb73655e7ff..67d54d2ceac33897fe50dded5e0fe7ab071203f5 100644 (file)
@@ -20,6 +20,7 @@
 #include "includes.h"
 #include "ldb_module.h"
 #include "dsdb/samdb/samdb.h"
+#include "dsdb/samdb/ldb_modules/util.h"
 
 #undef strncasecmp
 
@@ -656,6 +657,33 @@ static int resolve_oids_add(struct ldb_module *module, struct ldb_request *req)
                }
 
                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);
@@ -673,25 +701,38 @@ static int resolve_oids_add(struct ldb_module *module, struct ldb_request *req)
                                      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;
                }