From 9374ee1ba1dc1df3d5cdab1755ca9bfac338a4ae Mon Sep 17 00:00:00 2001 From: Matthieu Patou Date: Tue, 22 May 2012 16:25:50 -0700 Subject: s4-schema: keep track of the timestamp of the most recently changed/created object --- source4/dsdb/schema/schema.h | 1 + source4/dsdb/schema/schema_init.c | 1 + source4/dsdb/schema/schema_set.c | 12 +++++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) (limited to 'source4/dsdb') diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h index d3dd035e01..b2f7bac1d1 100644 --- a/source4/dsdb/schema/schema.h +++ b/source4/dsdb/schema/schema.h @@ -245,6 +245,7 @@ struct dsdb_schema { struct ldb_module *loaded_from_module; struct dsdb_schema *(*refresh_fn)(struct ldb_module *module, struct dsdb_schema *schema, bool is_global_schema); bool refresh_in_progress; + time_t ts_last_change; time_t last_refresh; /* an 'opaque' sequence number that the reload function may also wish to use */ uint64_t reload_seq_number; diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 2db708d2df..c0318cf9c4 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -807,6 +807,7 @@ int dsdb_load_ldb_results_into_schema(TALLOC_CTX *mem_ctx, struct ldb_context *l { unsigned int i; + schema->ts_last_change = 0; for (i=0; i < attrs_class_res->count; i++) { WERROR status = dsdb_schema_set_el_from_ldb_msg(ldb, schema, attrs_class_res->msgs[i]); if (!W_ERROR_IS_OK(status)) { diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c index 8a4361058b..286a8a3f23 100644 --- a/source4/dsdb/schema/schema_set.c +++ b/source4/dsdb/schema/schema_set.c @@ -665,6 +665,8 @@ int dsdb_schema_fill_extended_dn(struct ldb_context *ldb, struct dsdb_schema *sc WERROR dsdb_schema_set_el_from_ldb_msg(struct ldb_context *ldb, struct dsdb_schema *schema, struct ldb_message *msg) { + const char* tstring; + time_t ts; if (samdb_find_attribute(ldb, msg, "objectclass", "attributeSchema") != NULL) { return dsdb_set_attribute_from_ldb(ldb, schema, msg); @@ -672,7 +674,14 @@ WERROR dsdb_schema_set_el_from_ldb_msg(struct ldb_context *ldb, struct dsdb_sche "objectclass", "classSchema") != NULL) { return dsdb_set_class_from_ldb(schema, msg); } - + tstring = ldb_msg_find_attr_as_string(msg, "whenChanged", NULL); + /* keep a trace of the ts of the most recently changed object */ + if (tstring) { + ts = ldb_string_to_time(tstring); + if (ts > schema->ts_last_change) { + schema->ts_last_change = ts; + } + } /* Don't fail on things not classes or attributes */ return WERR_OK; } @@ -753,6 +762,7 @@ WERROR dsdb_set_schema_from_ldif(struct ldb_context *ldb, goto failed; } + schema->ts_last_change = 0; /* load the attribute and class definitions out of df */ while ((ldif = ldb_ldif_read_string(ldb, &df))) { talloc_steal(mem_ctx, ldif); -- cgit