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;
{
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)) {
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);
"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;
}
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);