Source code for sheraf.health.checks

import sheraf


[docs]def check_conflict_resolution(): """ Checks wether sheraf object conflicts resolutions are possible. When this is KO, it is generally because sheraf is not installed in the ZEO environnement, so ZEO cannot solve sheraf object conflicts. """ import ZODB table_name = "__conflict_resolution_test_model__" nestable = sheraf.Database.get().nestable sheraf.Database.get().nestable = True class TestModel(sheraf.Model): table = table_name counter = sheraf.CounterAttribute(default=0) with sheraf.connection(commit=True): m = TestModel.create() try: with sheraf.connection(commit=True): TestModel.read(m.identifier).counter.increment(1) with sheraf.connection(commit=True): TestModel.read(m.identifier).counter.increment(15) except ZODB.POSException.ConflictError: # pragma: no cover return False else: return True finally: with sheraf.connection(commit=True) as conn: del conn.root()[table_name] sheraf.Database.get().nestable = nestable
[docs]def check_attributes_index(model_instance): """ Given a model instance, computes all the values for all the indexes, then checks the index table if the values match the model instance. This finds instances that are not synchronized with theirs indexes. """ root = sheraf.Database.current_connection().root() result = {} index_table = root.get(model_instance.table) if not index_table: return result for index_name, index in model_instance.indexes.items(): if index.details.primary: continue values = index.details.get_model_index_keys(model_instance) if values and index_name not in index_table: result[index_name] = False continue if index.details.unique: result[index_name] = all( value in index_table[index_name] and index_table[index_name][value] == model_instance.mapping for value in values ) else: result[index_name] = all( value in index_table[index_name] and model_instance.mapping == index_table[index_name][value][model_instance.raw_identifier] for value in values ) return result
[docs]def check_model_index(model): """ Given a model, for every index table, reads every mapping in the table and checks that the mappin belongs a model. This finds orphans models. """ root = sheraf.Database.current_connection().root() index_table = root.get(model.table) result = {} if not index_table: return result for attribute_index_key, attribute_index_table in index_table.items(): index = model.indexes[attribute_index_key] if index.details.primary: continue for mmapping in attribute_index_table.values(): try: if index.details.unique: model.read(model._decorate(mmapping).identifier) else: [ model.read(model._decorate(persistent).identifier) for persistent in mmapping.values() ] result.setdefault(attribute_index_key, {"ok": 0, "ko": 0})["ok"] += 1 except sheraf.exceptions.ModelObjectNotFoundException: result.setdefault(attribute_index_key, {"ok": 0, "ko": 0})["ko"] += 1 return result