From: Stefan Metzmacher Date: Tue, 11 May 2010 08:34:19 +0000 (+0200) Subject: s4:dsdb: cached results of samdb_rodc() X-Git-Tag: samba-3.6.0pre1~2086 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e49fd92ca8dca87cc13fade08c1aa5d95df55a6;p=thirdparty%2Fsamba.git s4:dsdb: cached results of samdb_rodc() metze --- diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c index 5deb1d08b15..b9bff91eb84 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(sam_ctx, "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(sam_ctx, bool); + if (cached == NULL) { + return LDB_ERR_OPERATIONS_ERROR; + } + *cached = *am_rodc; + + ret = ldb_set_opaque(sam_ctx, "cache.am_rodc", cached); + if (ret != LDB_SUCCESS) { + talloc_free(cached); + return LDB_ERR_OPERATIONS_ERROR; + } + + return LDB_SUCCESS; }