X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source4%2Fdsdb%2Fcommon%2Futil.c;h=7c27b4adfb2f1e1557fdc4151b308c02033a1184;hb=1b1e2c7913097213a99ef74b90654e13b56775c4;hp=5deb1d08b156c605f861d1f9bb42dec53c9a77f6;hpb=8489934ce3cb1d11f94abab81ccdd00ee74d3d44;p=metze%2Fsamba%2Fwip.git diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c index 5deb1d08b156..7c27b4adfb2f 100644 --- a/source4/dsdb/common/util.c +++ b/source4/dsdb/common/util.c @@ -2705,11 +2705,39 @@ int samdb_is_rodc(struct ldb_context *sam_ctx, const struct GUID *objectGUID, bo int samdb_rodc(struct ldb_context *sam_ctx, bool *am_rodc) { const struct GUID *objectGUID; + int ret; + bool *cached; + + /* see if we have a cached copy */ + cached = (bool *)ldb_get_opaque(ldb, "cache.am_rodc"); + if (cached) { + *am_rodc = *cached; + return LDB_SUCCESS; + } + objectGUID = samdb_ntds_objectGUID(sam_ctx); if (!objectGUID) { return LDB_ERR_OPERATIONS_ERROR; } - return samdb_is_rodc(sam_ctx, objectGUID, am_rodc); + + ret = samdb_is_rodc(sam_ctx, objectGUID, am_rodc); + if (ret != LDB_SUCCESS) { + return ret; + } + + cached = talloc(ldb, bool); + if (cached == NULL) { + return LDB_ERR_OPERATIONS_ERROR; + } + *cached = *am_rodc; + + ret = ldb_set_opaque(ldb, "cache.am_rodc", cached); + if (ret != LDB_SUCCESS) { + talloc_free(cached); + return LDB_ERR_OPERATIONS_ERROR; + } + + return LDB_SUCCESS; }