s4:dsdb Don't load the schema unconditionally
authorAndrew Bartlett <abartlet@samba.org>
Mon, 22 Mar 2010 04:17:58 +0000 (15:17 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 22 Mar 2010 09:24:40 +0000 (20:24 +1100)
Schema loads now come at a price, so avoid doing them if we don't have
to (such as when doing an @REPLCHANGED or other special DN based
search).

Andrew Bartlett

source4/dsdb/samdb/ldb_modules/extended_dn_out.c
source4/dsdb/samdb/ldb_modules/schema_data.c

index b5f4567e5f79ef19fca9287b056d31fffa4dfeaa..b0d618ab83b2a1a21894bd1ad2515e81e73b4bd1 100644 (file)
@@ -564,6 +564,11 @@ static int extended_dn_out_search(struct ldb_module *module, struct ldb_request
 
        struct extended_dn_out_private *p = talloc_get_type(ldb_module_get_private(module), struct extended_dn_out_private);
 
+       /* The schema manipulation does not apply to special DNs */
+       if (ldb_dn_is_special(req->op.search.base)) {
+               return ldb_next_request(module, req);
+       }
+
        /* check if there's an extended dn control */
        control = ldb_request_get_control(req, LDB_CONTROL_EXTENDED_DN_OID);
        if (control && control->data) {
index 25f2dcec8b719c20495ee9f5963874a630256c10..655b4892af39342386a5cdfdb27ab825922155c7 100644 (file)
@@ -417,12 +417,17 @@ static int schema_data_search(struct ldb_module *module, struct ldb_request *req
        int ret;
        struct schema_data_search_data *search_context;
        struct ldb_request *down_req;
-       struct dsdb_schema *schema = dsdb_get_schema(ldb, NULL);
+       const struct dsdb_schema *schema;
+       if (!ldb_module_get_private(module)) {
+               /* If there is no module data, there is little we can do */
+               return ldb_next_request(module, req);
+       }
 
-       if (!schema || !ldb_module_get_private(module)) {
-               /* If there is no schema, there is little we can do */
+       /* The schema manipulation does not apply to special DNs */
+       if (ldb_dn_is_special(req->op.search.base)) {
                return ldb_next_request(module, req);
        }
+
        for (i=0; i < ARRAY_SIZE(generated_attrs); i++) {
                if (ldb_attr_in_list(req->op.search.attrs, generated_attrs[i].attr)) {
                        break;
@@ -434,6 +439,12 @@ static int schema_data_search(struct ldb_module *module, struct ldb_request *req
                return ldb_next_request(module, req);
        }
 
+       schema = dsdb_get_schema(ldb, NULL);
+       if (!schema || !ldb_module_get_private(module)) {
+               /* If there is no schema, there is little we can do */
+               return ldb_next_request(module, req);
+       }
+
        search_context = talloc(req, struct schema_data_search_data);
        if (!search_context) {
                ldb_oom(ldb);