Fix failure to load the schema on read-only DB.
authorAndrew Bartlett <abartlet@samba.org>
Thu, 11 Sep 2008 21:45:28 +0000 (07:45 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 11 Sep 2008 21:45:28 +0000 (07:45 +1000)
This also tries to simplify the logic in the schema -> @ATTRIBUTES and
@INDEXES code.

Andrew Bartlett

source/dsdb/schema/schema_set.c

index 3f5ddd8446ebf3e6a93246731cad91f69629c24b..2303b88a0594e8d1a32ca824279c0a03303fd226 100644 (file)
@@ -79,13 +79,13 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem
                        ret = ldb_msg_add_string(msg, attr->lDAPDisplayName, "CASE_INSENSITIVE");
                } 
                if (ret != LDB_SUCCESS) {
-                       return ret;
+                       break;
                }
 
                if (attr->searchFlags & SEARCH_FLAG_ATTINDEX) {
                        ret = ldb_msg_add_string(msg_idx, "@IDXATTR", attr->lDAPDisplayName);
                        if (ret != LDB_SUCCESS) {
-                               return ret;
+                               break;
                        }
                }
 
@@ -105,11 +105,11 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem
                }
                
                if (ret != LDB_SUCCESS) {
-                       return ret;
+                       break;
                }
        }
 
-       if (!write_attributes) {
+       if (!write_attributes || ret != LDB_SUCCESS) {
                talloc_free(mem_ctx);
                return ret;
        }
@@ -120,19 +120,13 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem
        if (ret == LDB_ERR_NO_SUCH_OBJECT) {
                ret = ldb_add(ldb, msg);
        } else if (ret != LDB_SUCCESS) {
-               talloc_free(mem_ctx);
-               return ret;
+       } else if (res->count != 1) {
+               ret = ldb_add(ldb, msg);
        } else {
-
-               if (res->count != 1) {
-                       talloc_free(mem_ctx);
-                       return LDB_ERR_NO_SUCH_OBJECT;
-               }
-               
                ret = LDB_SUCCESS;
                /* Annoyingly added to our search results */
                ldb_msg_remove_attr(res->msgs[0], "distinguishedName");
-
+               
                mod_msg = ldb_msg_diff(ldb, res->msgs[0], msg);
                if (mod_msg->num_elements > 0) {
                        ret = ldb_modify(ldb, mod_msg);
@@ -141,10 +135,11 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem
 
        if (ret == LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS) {
                /* We might be on a read-only DB */
+               ret = LDB_SUCCESS;
+       }
+       if (ret != LDB_SUCCESS) {
                talloc_free(mem_ctx);
                return ret;
-       } else if (ret != LDB_SUCCESS) {
-               return ret;
        }
 
        /* Now write out the indexs, as found in the schema (if they have changed) */
@@ -153,14 +148,10 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem
        if (ret == LDB_ERR_NO_SUCH_OBJECT) {
                ret = ldb_add(ldb, msg_idx);
        } else if (ret != LDB_SUCCESS) {
-               talloc_free(mem_ctx);
-               return ret;
+       } else if (res->count != 1) {
+               ret = ldb_add(ldb, msg_idx);
        } else {
-               if (res_idx->count != 1) {
-                       talloc_free(mem_ctx);
-                       return LDB_ERR_NO_SUCH_OBJECT;
-               }
-               
+               ret = LDB_SUCCESS;
                /* Annoyingly added to our search results */
                ldb_msg_remove_attr(res_idx->msgs[0], "distinguishedName");
 
@@ -171,7 +162,6 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem
        }
        if (ret == LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS) {
                /* We might be on a read-only DB */
-               talloc_free(mem_ctx);
                ret = LDB_SUCCESS;
        }
        talloc_free(mem_ctx);