Title: [commits] (vajda) [11281] - fixed bug where subindex sort would be wrong if superindex was descending

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

Reply via email to