- Revision
- 11281
- Author
- vajda
- Date
- 2006-07-31 08:33:30 -0700 (Mon, 31 Jul 2006)
Log Message
- fixed bug where subindex sort would be wrong if superindex was descending
- enhanced check() to optionally rebuild indexes that fail tests
- added 'Check and Repair Repository' test menu item
- upgraded build to chandlerdb 0.6-34
- enhanced check() to optionally rebuild indexes that fail tests
- added 'Check and Repair Repository' test menu item
- upgraded build to chandlerdb 0.6-34
Modified Paths
- trunk/chandler/parcels/osaf/views/main/Main.py
- trunk/chandler/parcels/osaf/views/main/events.py
- trunk/chandler/parcels/osaf/views/main/menus.py
- trunk/chandler/repository/item/Indexed.py
- trunk/chandler/repository/item/Indexes.py
- trunk/chandler/repository/item/Item.py
- trunk/chandler/repository/item/RefCollections.py
- trunk/chandler/repository/item/Sets.py
- trunk/chandler/repository/item/Values.py
- trunk/chandler/repository/persistence/DBRefs.py
- trunk/chandler/repository/persistence/RepositoryView.py
- trunk/chandler/repository/schema/Kind.py
Diff
Modified: trunk/chandler/parcels/osaf/views/main/Main.py (11280 => 11281)
--- trunk/chandler/parcels/osaf/views/main/Main.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/parcels/osaf/views/main/Main.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -440,12 +440,13 @@ def onCheckRepositoryEvent(self, event): # triggered from "Test | Check Repository" Menu - repository = self.itsView.repository + view = self.itsView + repository = view.repository progressMessage = _(u'Checking repository...') repository.logger.info("Checking repository ...") self.setStatusMessage(progressMessage) before = time() - if repository.check(): + if view.check(): after = time() successMessage = _(u'Check completed successfully in %(numSeconds)s') % {'numSeconds': timedelta(seconds=after-before)} repository.logger.info('Check completed successfully in %s' % (timedelta(seconds=after-before))) @@ -455,6 +456,24 @@ repository.logger.info('Check completed with errors') self.setStatusMessage(errorMessage) + def onCheckAndRepairRepositoryEvent(self, event): + # triggered from "Test | Check Repository and Repair" Menu + view = self.itsView + repository = view.repository + progressMessage = _(u'Checking repository...') + repository.logger.info("Checking repository ...") + self.setStatusMessage(progressMessage) + before = time() + if view.check(True): + after = time() + successMessage = _(u'Check completed successfully in %(numSeconds)s') % {'numSeconds': timedelta(seconds=after-before)} + repository.logger.info('Check completed successfully in %s' % (timedelta(seconds=after-before))) + self.setStatusMessage(successMessage) + else: + errorMessage = _(u'Check completed with errors') + repository.logger.info('Check completed with errors') + self.setStatusMessage(errorMessage) + def onBackupRepositoryEvent(self, event): # triggered from "Test | Backup Repository" Menu self.RepositoryCommitWithStatus()
Modified: trunk/chandler/parcels/osaf/views/main/events.py (11280 => 11281)
--- trunk/chandler/parcels/osaf/views/main/events.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/parcels/osaf/views/main/events.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -110,6 +110,8 @@ BlockEvent.template('CheckRepository').install(parcel) + BlockEvent.template('CheckAndRepairRepository').install(parcel) + BlockEvent.template('i18nMailTest').install(parcel) BlockEvent.template('ShowLogWindow').install(parcel)
Modified: trunk/chandler/parcels/osaf/views/main/menus.py (11280 => 11281)
--- trunk/chandler/parcels/osaf/views/main/menus.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/parcels/osaf/views/main/menus.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -551,7 +551,11 @@ MenuItem.template('CheckRepositoryItem', event = main.CheckRepository, title = u'C&heck Repository', - helpString = u'run check() on the current view'), + helpString = u'run check() on the main view'), + MenuItem.template('CheckAndRepairRepositoryItem', + event = main.CheckAndRepairRepository, + title = u'Check and &Repair Repository', + helpString = u'run check(True) on the main view'), MenuItem.template('BackupRepositoryItem', event = main.BackupRepository, title = u'&Backup Repository',
Modified: trunk/chandler/repository/item/Indexed.py (11280 => 11281)
--- trunk/chandler/repository/item/Indexed.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/item/Indexed.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -617,7 +617,7 @@ return len(self.getIndex(indexName)) - def _checkIndexes(self, logger, item, attribute): + def _checkIndexes(self, logger, item, attribute, repair): result = True @@ -631,7 +631,18 @@ for name, index in self._indexes.iteritems(): if not index._checkIndex(index, logger, name, self, - item, attribute, count): - result = False + item, attribute, count, repair): + if repair: + logger.warning("Rebuilding index '%s' installed on value '%s' of type %s in attribute '%s' on %s", name, self, type(self), attribute, item._repr_()) + indexes[name] = index = \ + self._createIndex(index.getIndexType(), + **index.getInitKeywords()) + self.fillIndex(index) + self._setDirty(True) + result = index._checkIndex(index, logger, name, self, + item, attribute, count, + repair) + else: + result = False return result
Modified: trunk/chandler/repository/item/Indexes.py (11280 => 11281)
--- trunk/chandler/repository/item/Indexes.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/item/Indexes.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -121,7 +121,8 @@ def _xmlValues(self, generator, version): raise NotImplementedError, "%s._xmlValues" %(type(self)) - def _checkIndex(self, _index, logger, name, value, item, attribute, count): + def _checkIndex(self, _index, logger, name, value, item, attribute, count, + repair): result = True @@ -131,14 +132,14 @@ else: size, result = _index._checkIterateIndex(logger, name, value, - item, attribute) + item, attribute, repair) if size != 0: logger.error("Iteration of index '%s' (%d) installed on value '%s' of type %s in attribute '%s' on %s doesn't match length (%d)", name, count - size, value, type(value), attribute, item._repr_(), count) result = False return result - def _checkIterateIndex(self, logger, name, value, item, attribute): + def _checkIterateIndex(self, logger, name, value, item, attribute, repair): size = len(self) @@ -540,12 +541,13 @@ self._subIndexes.remove((uuid, attr, name)) - def _checkIndex(self, _index, logger, name, value, item, attribute, count): + def _checkIndex(self, _index, logger, name, value, item, attribute, count, + repair): return self._index._checkIndex(self, logger, name, value, - item, attribute, count) + item, attribute, count, repair) - def _checkIterateIndex(self, logger, name, value, item, attribute): + def _checkIterateIndex(self, logger, name, value, item, attribute, repair): size = len(self) prevKey = None @@ -852,8 +854,9 @@ uuid, attr, name = self._super index = getattr(self._valueMap._getView()[uuid], attr).getIndex(name) + skipList = index.skipList - return index.getPosition(k0) - index.getPosition(k1) + return skipList.position(k0) - skipList.position(k1) def _xmlValues(self, generator, version, attrs, mode):
Modified: trunk/chandler/repository/item/Item.py (11280 => 11281)
--- trunk/chandler/repository/item/Item.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/item/Item.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -699,7 +699,7 @@ for name in self._references._dict.iterkeys(): yield name - def check(self, recursive=False, checkItem=True): + def check(self, recursive=False, repair=False): """ Run consistency checks on this item. @@ -714,14 +714,15 @@ @param recursive: if C{True}, check this item and its children recursively. If C{False}, the default, check only this item. + @param repair: if C{True}, perform repairs on failures. @return: C{True} if no errors were found, C{False} otherwise. Errors are logged in the Chandler execution log. """ logger = self.itsView.logger - checkValues = self._values.check() - checkRefs = self._references.check() + checkValues = self._values.check(repair) + checkRefs = self._references.check(repair) result = checkValues and checkRefs name = self.itsName @@ -749,7 +750,7 @@ for child in self.iterChildren(): l -= 1 if recursive: - check = child.check(True) + check = child.check(True, repair) result = result and check if l == 0: break @@ -757,25 +758,8 @@ logger.error("Iterator on children of %s doesn't match length (%d left for %d total)", self._repr_(), l, len(self._children)) return False - if result and checkItem: - result = self.checkItem() - return result - def checkItem(self): - """ - A placeholder for subclasses to do more checking. - - This method is meant to be used by developers to do implement checks - that the repository cannot do on its own such as semantic - constraints checking. - - Failure should be logged, exceptions should not be raised. - - @return: C{True} if all checks pass, C{False} otherwise - """ - return True - def getVersion(self, latest=False): """ Return the version number of this item.
Modified: trunk/chandler/repository/item/RefCollections.py (11280 => 11281)
--- trunk/chandler/repository/item/RefCollections.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/item/RefCollections.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -664,7 +664,7 @@ return None - def _check(self, logger, item, name): + def _check(self, logger, item, name, repair): """ Debugging: verify this ref collection for consistency. @@ -689,7 +689,7 @@ while key is not None and l > 0: try: other = self[key] - result = result and refs._checkRef(logger, name, other) + result = result and refs._checkRef(logger, name, other, repair) except DanglingRefError, e: logger.error("Iterator on %s caused DanglingRefError: %s", self, str(e)) @@ -710,7 +710,8 @@ logger.error("iterator on %s doesn't finish on last key %s but on %s", self, self.lastKey(), prevKey) return False - return result and self._checkIndexes(logger, self._item, self._name) + return result and self._checkIndexes(logger, self._item, self._name, + repair) def _clearDirties(self): pass @@ -759,7 +760,7 @@ def linkChanged(self, link, key): pass - def _check(self, logger, item, name): + def _check(self, logger, item, name, repair): return True def _load(self, key): @@ -923,10 +924,10 @@ return False - def _check(self, logger, item, name): + def _check(self, logger, item, name, repair): for refList in self._dict.itervalues(): - if not refList._check(logger, item, name): + if not refList._check(logger, item, name, repair): return False return True
Modified: trunk/chandler/repository/item/Sets.py (11280 => 11281)
--- trunk/chandler/repository/item/Sets.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/item/Sets.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -432,10 +432,11 @@ return copy - def _check(self, logger, item, attribute): + def _check(self, logger, item, attribute, repair): - return (super(AbstractSet, self)._check(logger, item, attribute) and - self._checkIndexes(logger, item, attribute)) + return (super(AbstractSet, self)._check(logger, item, attribute, + repair) and + self._checkIndexes(logger, item, attribute, repair)) def _setDirty(self, noMonitors=False):
Modified: trunk/chandler/repository/item/Values.py (11280 => 11281)
--- trunk/chandler/repository/item/Values.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/item/Values.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -268,10 +268,10 @@ return hash - def _checkValue(self, logger, name, value, attrType): + def _checkValue(self, logger, name, value, attrType, repair): if isinstance(value, ItemValue): - if not value._check(logger, self._item, name): + if not value._check(logger, self._item, name, repair): return False if not attrType.recognizes(value): @@ -280,7 +280,8 @@ return True - def _checkCardinality(self, logger, name, value, cardType, attrCard): + def _checkCardinality(self, logger, name, value, cardType, attrCard, + repair): if not (value is None or (cardType is None and isitem(value)) or @@ -290,18 +291,18 @@ return True - def check(self): + def check(self, repair=False): logger = self._item.itsView.logger result = True for key, value in self._dict.iteritems(): - r = self._verifyAssignment(key, value, logger) + r = self._verifyAssignment(key, value, logger, repair) result = result and r return result - def _verifyAssignment(self, key, value, logger): + def _verifyAssignment(self, key, value, logger, repair=False): item = self._item @@ -321,31 +322,31 @@ attrCard = attribute.c.cardinality if attrCard == 'single': - return self._checkValue(logger, key, value, attrType) + return self._checkValue(logger, key, value, attrType, repair) elif attrCard == 'list': - if self._checkCardinality(logger, key, value, list, 'list'): + if self._checkCardinality(logger, key, value, list, 'list', repair): result = True for v in value: - check = self._checkValue(logger, key, v, attrType) + check = self._checkValue(logger, key, v, attrType, repair) result = result and check return result return False elif attrCard == 'dict': - if self._checkCardinality(logger, key, value, dict, 'dict'): + if self._checkCardinality(logger, key, value, dict, 'dict', repair): result = True for v in value.itervalues(): - check = self._checkValue(logger, key, v, attrType) + check = self._checkValue(logger, key, v, attrType, repair) result = result and check return result return False elif attrCard == 'set': - if self._checkCardinality(logger, key, value, set, 'set'): + if self._checkCardinality(logger, key, value, set, 'set', repair): result = True for v in value.itervalues(): - check = self._checkValue(logger, key, v, attrType) + check = self._checkValue(logger, key, v, attrType, repair) result = result and check return result return False @@ -867,7 +868,7 @@ if value is not None and value._isRefs(): value._clearDirties() - def _checkRef(self, logger, name, other): + def _checkRef(self, logger, name, other, repair): if other is not None: if not isitem(other): @@ -930,7 +931,7 @@ return True - def check(self): + def check(self, repair=False): item = self._item logger = item.itsView.logger @@ -944,25 +945,25 @@ False, None, 'single') if attrCard == 'single': check = self._checkCardinality(logger, key, value, - None, 'single') + None, 'single', repair) if check: - check = self._checkRef(logger, key, value) + check = self._checkRef(logger, key, value, repair) elif attrCard == 'list': check = self._checkCardinality(logger, key, value, - RefList, 'list') + RefList, 'list', repair) if check: - check = value._check(logger, item, key) + check = value._check(logger, item, key, repair) elif attrCard == 'dict': check = self._checkCardinality(logger, key, value, - RefDict, 'dict') + RefDict, 'dict', repair) if check: - check = value._check(logger, item, key) + check = value._check(logger, item, key, repair) elif attrCard == 'set': from repository.item.Sets import AbstractSet check = self._checkCardinality(logger, key, value, - AbstractSet, 'set') + AbstractSet, 'set', repair) if check: - check = value._check(logger, item, key) + check = value._check(logger, item, key, repair) else: logger.error("Attribute %s on %s is using a cardinality, '%s', which is not supported, use 'list' instead", key, self._item.itsPath, attrCard) check = False @@ -971,7 +972,7 @@ return result - def _verifyAssignment(self, key, other, logger): + def _verifyAssignment(self, key, other, logger, repair=False): item = self._item kind = item.itsKind
Modified: trunk/chandler/repository/persistence/DBRefs.py (11280 => 11281)
--- trunk/chandler/repository/persistence/DBRefs.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/persistence/DBRefs.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -235,21 +235,6 @@ self._changedRefs.clear() - def _check_(self): - - l = len(self) - key = self.firstKey() - - while key: - l -= 1 - link = self._get(key) - key = link._nextKey - - if l != 0: - return 1 - - return 0 - def _applyChanges(self, changes, history): moves = {}
Modified: trunk/chandler/repository/persistence/RepositoryView.py (11280 => 11281)
--- trunk/chandler/repository/persistence/RepositoryView.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/persistence/RepositoryView.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -642,7 +642,7 @@ self.dir(child, path) path.pop() - def check(self): + def check(self, repair=False): """ Runs repository consistency checks on this view. @@ -653,7 +653,7 @@ result = True for root in self.iterRoots(): - check = root.check(True) + check = root.check(True, repair) result = result and check return result
Modified: trunk/chandler/repository/schema/Kind.py (11280 => 11281)
--- trunk/chandler/repository/schema/Kind.py 2006-07-31 15:22:17 UTC (rev 11280) +++ trunk/chandler/repository/schema/Kind.py 2006-07-31 15:33:30 UTC (rev 11281) @@ -310,9 +310,9 @@ return c - def check(self, recursive=False): + def check(self, recursive=False, repair=False): - result = super(Kind, self).check(recursive) + result = super(Kind, self).check(recursive, repair) if not self.getAttributeValue('superKinds', self._references): if self is not self.getItemKind(): @@ -320,13 +320,13 @@ result = False itemClass = self.getItemClass() - result = self._checkClass(itemClass, True) + result = self._checkClass(itemClass, True, repair) classes = Kind._kinds.get(self._uuid) if classes is not None: for cls in classes: if cls is not itemClass: - result = self._checkClass(cls, False) and result + result = self._checkClass(cls, False, repair) and result attrs = self._references.get('attributes', None) if attrs: @@ -336,7 +336,7 @@ return result - def _checkClass(self, cls, isItemClass): + def _checkClass(self, cls, isItemClass, repair): result = True
_______________________________________________ Commits mailing list [email protected] http://lists.osafoundation.org/mailman/listinfo/commits
