s4/samldb: Create initial schemaInfo value if it doesn't exists yet
authorKamen Mazdrashki <kamenim@samba.org>
Thu, 22 Apr 2010 14:59:22 +0000 (17:59 +0300)
committerKamen Mazdrashki <kamenim@samba.org>
Thu, 29 Apr 2010 01:54:06 +0000 (04:54 +0300)
source4/dsdb/schema/schema_info_attr.c

index 60722eea52faf674dbb97dd5cdec989b214b9d15..44a12ad629db7a6d5d35db0f7cd6268d34f84710 100644 (file)
 #include "param/param.h"
 
 
+/**
+ * Creates and initializes new dsdb_schema_info value.
+ * Initial schemaInfo values is with:
+ *   revision = 0
+ *   invocationId = GUID_ZERO
+ */
+WERROR dsdb_schema_info_new(TALLOC_CTX *mem_ctx, struct dsdb_schema_info **_schema_info)
+{
+       struct dsdb_schema_info *schema_info;
+
+       schema_info = talloc_zero(mem_ctx, struct dsdb_schema_info);
+       W_ERROR_HAVE_NO_MEMORY(schema_info);
+
+       *_schema_info = schema_info;
+
+       return WERR_OK;
+}
+
 /**
  * Creates and initializes new dsdb_schema_info blob value.
  * Initial schemaInfo values is with:
@@ -391,20 +409,25 @@ WERROR dsdb_module_schema_info_update(struct ldb_module *ldb_module,
        const struct GUID *invocation_id;
        struct dsdb_schema_info *schema_info;
 
-       TALLOC_CTX *mem_ctx = talloc_new(schema);
-       W_ERROR_HAVE_NO_MEMORY(mem_ctx);
+       TALLOC_CTX *temp_ctx = talloc_new(schema);
+       W_ERROR_HAVE_NO_MEMORY(temp_ctx);
 
        invocation_id = samdb_ntds_invocation_id(ldb_module_get_ctx(ldb_module));
        if (!invocation_id) {
                return WERR_INTERNAL_DB_CORRUPTION;
        }
 
-       werr = dsdb_module_schema_info_read(ldb_module, dsdb_flags,
-                                           mem_ctx, &schema_info);
+       /* read serialized schemaInfo from LDB  */
+       werr = dsdb_module_schema_info_read(ldb_module, dsdb_flags, temp_ctx, &schema_info);
+       if (W_ERROR_EQUAL(werr, WERR_DS_NO_ATTRIBUTE_OR_VALUE)) {
+               /* make default value in case
+                * we have no schemaInfo value yet */
+               werr = dsdb_schema_info_new(temp_ctx, &schema_info);
+       }
        if (!W_ERROR_IS_OK(werr)) {
                DEBUG(0,("dsdb_module_schema_info_update: failed to reload schemaInfo - %s\n",
                         win_errstr(werr)));
-               talloc_free(mem_ctx);
+               talloc_free(temp_ctx);
                return werr;
        }
 
@@ -416,7 +439,7 @@ WERROR dsdb_module_schema_info_update(struct ldb_module *ldb_module,
        if (!W_ERROR_IS_OK(werr)) {
                DEBUG(0,("dsdb_module_schema_info_update: failed to save schemaInfo - %s\n",
                         win_errstr(werr)));
-               talloc_free(mem_ctx);
+               talloc_free(temp_ctx);
                return werr;
        }
 
@@ -427,6 +450,6 @@ WERROR dsdb_module_schema_info_update(struct ldb_module *ldb_module,
        schema->schema_info = talloc_steal(schema, schema_info);
 */
 
-       talloc_free(mem_ctx);
+       talloc_free(temp_ctx);
        return WERR_OK;
 }