[Commits] (vajda) - removed defaultParent feature
commits at osafoundation.org
commits at osafoundation.org
Mon Apr 4 15:13:27 PDT 2005
Commit by: vajda
Modified files:
chandler/Makefile 1.95 1.96
chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py 1.1 1.2
chandler/parcels/osaf/mail/imap.py 1.48 1.49
chandler/parcels/osaf/mail/smtp.py 1.36 1.37
chandler/repository/item/Children.py None 1.1
chandler/repository/item/Indexes.py 1.11 1.12
chandler/repository/item/Item.py 1.203 1.204
chandler/repository/item/Monitors.py 1.10 1.11
chandler/repository/item/Query.py 1.13 1.14
chandler/repository/item/RefCollections.py 1.14 1.15
chandler/repository/item/Values.py 1.44 1.45
chandler/repository/packs/schema/model/Kind.kind 1.29 1.30
chandler/repository/persistence/RepositoryViewManager.py None 1.1
chandler/repository/persistence/DBLob.py 1.4 1.5
chandler/repository/persistence/DBRefs.py 1.5 1.6
chandler/repository/persistence/DBRepositoryView.py 1.11 1.12
chandler/repository/persistence/PackHandler.py 1.22 1.23
chandler/repository/persistence/RepositoryError.py 1.16 1.17
chandler/repository/persistence/RepositoryView.py 1.37 1.38
chandler/repository/schema/Kind.py 1.107 1.108
chandler/repository/tests/TestNullView.py None 1.1
chandler/repository/util/Lob.py 1.11 1.12
Log message:
- removed defaultParent feature
- added support for nullRepositoryView
- added optional _uuid constructor argument to Item.__init__()
- made name, parent, and kind optional in Item.__init__()
- removed timing code additions as they're obsolete
- added RepositoryView.importItem()
- made Item.itsView settable
- fixed 'del' bug and ref leaks in descriptor C code
- fixed bug with copying SingleRef resolving to None
- removed view-is-current-view checks
- moved AbstractRepositoryViewManager class to its own module
ViewCVS links:
http://cvs.osafoundation.org/index.cgi/chandler/Makefile.diff?r1=text&tr1=1.95&r2=text&tr2=1.96
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py.diff?r1=text&tr1=1.1&r2=text&tr2=1.2
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/mail/imap.py.diff?r1=text&tr1=1.48&r2=text&tr2=1.49
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/mail/smtp.py.diff?r1=text&tr1=1.36&r2=text&tr2=1.37
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Children.py?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Indexes.py.diff?r1=text&tr1=1.11&r2=text&tr2=1.12
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Item.py.diff?r1=text&tr1=1.203&r2=text&tr2=1.204
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Monitors.py.diff?r1=text&tr1=1.10&r2=text&tr2=1.11
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Query.py.diff?r1=text&tr1=1.13&r2=text&tr2=1.14
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/RefCollections.py.diff?r1=text&tr1=1.14&r2=text&tr2=1.15
http://cvs.osafoundation.org/index.cgi/chandler/repository/item/Values.py.diff?r1=text&tr1=1.44&r2=text&tr2=1.45
http://cvs.osafoundation.org/index.cgi/chandler/repository/packs/schema/model/Kind.kind.diff?r1=text&tr1=1.29&r2=text&tr2=1.30
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/RepositoryViewManager.py?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/DBLob.py.diff?r1=text&tr1=1.4&r2=text&tr2=1.5
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/DBRefs.py.diff?r1=text&tr1=1.5&r2=text&tr2=1.6
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/DBRepositoryView.py.diff?r1=text&tr1=1.11&r2=text&tr2=1.12
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/PackHandler.py.diff?r1=text&tr1=1.22&r2=text&tr2=1.23
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/RepositoryError.py.diff?r1=text&tr1=1.16&r2=text&tr2=1.17
http://cvs.osafoundation.org/index.cgi/chandler/repository/persistence/RepositoryView.py.diff?r1=text&tr1=1.37&r2=text&tr2=1.38
http://cvs.osafoundation.org/index.cgi/chandler/repository/schema/Kind.py.diff?r1=text&tr1=1.107&r2=text&tr2=1.108
http://cvs.osafoundation.org/index.cgi/chandler/repository/tests/TestNullView.py?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/repository/util/Lob.py.diff?r1=text&tr1=1.11&r2=text&tr2=1.12
Index: chandler/repository/persistence/DBLob.py
diff -u chandler/repository/persistence/DBLob.py:1.4 chandler/repository/persistence/DBLob.py:1.5
--- chandler/repository/persistence/DBLob.py:1.4 Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/DBLob.py Mon Apr 4 15:13:20 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.4 $"
-__date__ = "$Date: 2005/03/18 21:41:48 $"
+__revision__ = "$Revision: 1.5 $"
+__date__ = "$Date: 2005/04/04 22:13:20 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -35,19 +35,7 @@
def _copy(self, item, attribute, key=None):
- view = item.itsView
- copy = view._getLobType()(view, self.encoding,
- self.mimetype, self._indexed)
-
- inputStream = self.getInputStream(key)
- outputStream = copy.getOutputStream(self._compression, self._encryption,
- key)
-
- outputStream.write(inputStream.read())
- outputStream.close()
- inputStream.close()
-
- return copy
+ return self.copy(item.itsView, key)
def _writeData(self, uuid, store, db):
@@ -134,20 +122,9 @@
def load(self, data, attrs):
- self.mimetype = attrs.get('mimetype', 'text/plain')
- if attrs.has_key('encoding'):
- self.encoding = attrs['encoding']
-
- self._compression = attrs.get('compression', None)
- self._encryption = attrs.get('encryption', None)
- self._version = long(attrs.get('version', '0'))
- self._indexed = attrs.get('indexed', 'False') == 'True'
-
- if attrs.get('type', 'text') == 'text':
- writer = self.getWriter()
- writer.write(data)
- writer.close()
- else:
+ super(DBLob, self).load(data, attrs)
+
+ if attrs.get('type', 'text') != 'text':
self._uuid = UUID(data)
def _setData(self, data):
Index: chandler/repository/item/RefCollections.py
diff -u chandler/repository/item/RefCollections.py:1.14 chandler/repository/item/RefCollections.py:1.15
--- chandler/repository/item/RefCollections.py:1.14 Fri Mar 18 13:41:46 2005
+++ chandler/repository/item/RefCollections.py Mon Apr 4 15:13:20 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.14 $"
-__date__ = "$Date: 2005/03/18 21:41:46 $"
+__revision__ = "$Revision: 1.15 $"
+__date__ = "$Date: 2005/04/04 22:13:20 $"
__copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -72,6 +72,16 @@
item = self._item
item.setDirty(item.RDIRTY, self._name, item._references, noMonitors)
+ # copy the indexes from self into refList, empty
+ def _copyIndexes(self, refList):
+
+ if self._indexes is not None:
+ refList._indexes = indexes = {}
+ for name, index in self._indexes.iteritems():
+ type = index.getIndexType()
+ kwds = index.getInitKeywords()
+ indexes[name] = refList._createIndex(type, **kwds)
+
# copy the refs from self into copyItem._references
def _copy(self, copyItem, name, policy, copyFn):
@@ -79,6 +89,7 @@
refList = copyItem._references[name]
except KeyError:
refList = copyItem._refList(name)
+ self._copyIndexes(refList)
copyItem._references[name] = refList
for key in self.iterkeys():
Index: chandler/repository/item/Monitors.py
diff -u chandler/repository/item/Monitors.py:1.10 chandler/repository/item/Monitors.py:1.11
--- chandler/repository/item/Monitors.py:1.10 Mon Feb 28 17:20:36 2005
+++ chandler/repository/item/Monitors.py Mon Apr 4 15:13:20 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.10 $"
-__date__ = "$Date: 2005/03/01 01:20:36 $"
+__revision__ = "$Revision: 1.11 $"
+__date__ = "$Date: 2005/04/04 22:13:20 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -14,6 +14,15 @@
self.setPinned()
Monitors.instances[view] = self
+ def onItemImport(self, view):
+
+ try:
+ del Monitors.instances[self.itsView]
+ except KeyError:
+ pass
+
+ Monitors.instances[view] = self
+
def getInstance(cls, view):
try:
Index: chandler/repository/item/Values.py
diff -u chandler/repository/item/Values.py:1.44 chandler/repository/item/Values.py:1.45
--- chandler/repository/item/Values.py:1.44 Mon Apr 4 11:59:27 2005
+++ chandler/repository/item/Values.py Mon Apr 4 15:13:20 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.44 $"
-__date__ = "$Date: 2005/04/04 18:59:27 $"
+__revision__ = "$Revision: 1.45 $"
+__date__ = "$Date: 2005/04/04 22:13:20 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -67,11 +67,12 @@
default='copy'))
other = item.find(value.itsUUID)
if other is None:
- self.name = value
+ self[name] = value
else:
copyOther = copyFn(item, other, policy)
if copyOther is not item.Nil:
self[name] = SingleRef(copyOther.itsUUID)
+
else:
self[name] = value
@@ -291,7 +292,7 @@
def _checkValue(self, logger, name, value, attrType):
if not attrType.recognizes(value):
- logger._error('Value %s of type %s in attribute %s on %s is not recognized by type %s', value, type(value), name, self._item.itsPath, attrType.itsPath)
+ logger.error('Value %s of type %s in attribute %s on %s is not recognized by type %s', value, type(value), name, self._item.itsPath, attrType.itsPath)
return False
return True
@@ -361,10 +362,19 @@
if value is not None and value._isItem():
value._references._removeRef(otherName, self._item)
- if other is not None and otherName in other._references:
- value = other._references._getRef(otherName)
- if value is not None and value._isItem():
- value._references._removeRef(name, other)
+ if other is not None:
+ view = self._item.itsView
+ otherView = other.itsView
+ if otherView is not view:
+ if otherView._isNullView() or view._isNullView():
+ view.importItem(other)
+ else:
+ raise ViewMismatchError, (self._item, other)
+
+ if otherName in other._references:
+ value = other._references._getRef(otherName)
+ if value is not None and value._isItem():
+ value._references._removeRef(name, other)
self._setRef(name, other, otherName, **kwds)
if other is not None:
Index: chandler/repository/persistence/DBRepositoryView.py
diff -u chandler/repository/persistence/DBRepositoryView.py:1.11 chandler/repository/persistence/DBRepositoryView.py:1.12
--- chandler/repository/persistence/DBRepositoryView.py:1.11 Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/DBRepositoryView.py Mon Apr 4 15:13:21 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.11 $"
-__date__ = "$Date: 2005/03/18 21:41:48 $"
+__revision__ = "$Revision: 1.12 $"
+__date__ = "$Date: 2005/04/04 22:13:21 $"
__copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -23,8 +23,6 @@
from repository.persistence.DBItemIO \
import DBItemWriter, DBItemVMergeReader, DBItemRMergeReader
-timing = False
-if timing: import tools.timing
class DBRepositoryView(OnDemandRepositoryView):
@@ -32,17 +30,21 @@
super(DBRepositoryView, self).openView()
- self._log = []
+ self._log = set()
self._indexWriter = None
def _logItem(self, item):
if super(DBRepositoryView, self)._logItem(item):
- self._log.append(item)
+ self._log.add(item)
return True
return False
+ def _unsavedItems(self):
+
+ return iter(self._log)
+
def dirlog(self):
for item in self._log:
@@ -65,7 +67,7 @@
self._version, item)
self.find(item._uuid)
- del self._log[:]
+ self._log.clear()
if self.isDirty():
self._roots._clearDirties()
self.setDirty(0)
@@ -112,6 +114,18 @@
return DBChildren(self, parent, new)
+ def _registerItem(self, item):
+
+ super(DBRepositoryView, self)._registerItem(item)
+ if item.isDirty():
+ self._log.add(item)
+
+ def _unregisterItem(self, item, reloadable):
+
+ super(DBRepositoryView, self)._unregisterItem(item, reloadable)
+ if item.isDirty():
+ self._log.remove(item)
+
def _getLobType(self):
return DBLob
@@ -160,7 +174,7 @@
_log = self._log
try:
- self._log = []
+ self._log = set()
try:
self._mergeItems(self._version, newVersion,
histNotifications, unloads, also, mergeFn)
@@ -212,8 +226,6 @@
def commit(self, mergeFn=None):
if self._status & RepositoryView.COMMITTING == 0:
- if timing: tools.timing.begin("Repository commit")
-
try:
self._exclusive.acquire()
self._status |= RepositoryView.COMMITTING
@@ -282,7 +294,7 @@
item._version = newVersion
item.setDirty(0, None)
item._status &= ~(Item.NEW | Item.MERGED)
- del self._log[:]
+ self._log.clear()
if self.isDirty():
self._roots._clearDirties()
@@ -307,8 +319,6 @@
self._status &= ~RepositoryView.COMMITTING
self._exclusive.release()
- if timing: tools.timing.end("Repository commit")
-
def _saveItem(self, item, newVersion, itemWriter, notifications):
if self.isDebug():
Index: chandler/repository/packs/schema/model/Kind.kind
diff -u chandler/repository/packs/schema/model/Kind.kind:1.29 chandler/repository/packs/schema/model/Kind.kind:1.30
--- chandler/repository/packs/schema/model/Kind.kind:1.29 Wed Feb 16 12:41:04 2005
+++ chandler/repository/packs/schema/model/Kind.kind Mon Apr 4 15:13:20 2005
@@ -14,8 +14,7 @@
- plus local attributes below:
- notFoundAttributes, inheritedAttributes,
- superKinds, subKinds, attributes, classes,
- - displayAttribute, clouds, otherNames, mixins,
- - defaultParent
+ - displayAttribute, clouds, otherNames, mixins
-->
</ref>
@@ -225,21 +224,4 @@
type="path" otherCard="list">/Core/UUID</ref>
<attribute name="cardinality">list</attribute>
</item>
-
- <item withSchema="True">
- <name>defaultParent</name>
- <kind type="path">//Schema/Core/Attribute</kind>
- <class module="repository.schema.Attribute">Attribute</class>
- <parent type="path">//Schema/Core/Kind</parent>
-
- <ref name="kinds" otherName="attributes"
- cardinality="list" otherCard="list">
- <ref type="path">..</ref>
- </ref>
-
- <ref name="type" otherName="typeFor"
- type="path" otherCard="list">/Core/SingleRef</ref>
- <attribute name="cardinality">single</attribute>
- </item>
-
</items>
Index: chandler/repository/item/Query.py
diff -u chandler/repository/item/Query.py:1.13 chandler/repository/item/Query.py:1.14
--- chandler/repository/item/Query.py:1.13 Fri Mar 18 13:41:46 2005
+++ chandler/repository/item/Query.py Mon Apr 4 15:13:20 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.13 $"
-__date__ = "$Date: 2005/03/18 21:41:46 $"
+__revision__ = "$Revision: 1.14 $"
+__date__ = "$Date: 2005/04/04 22:13:20 $"
__copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -50,7 +50,7 @@
matches = set()
changedItems = set()
- for item in kinds[0].itsView._log:
+ for item in kinds[0].itsView._unsavedItems():
if item._isNDirty():
changedItems.add(item)
Index: chandler/parcels/osaf/mail/imap.py
diff -u chandler/parcels/osaf/mail/imap.py:1.48 chandler/parcels/osaf/mail/imap.py:1.49
--- chandler/parcels/osaf/mail/imap.py:1.48 Mon Mar 28 17:36:20 2005
+++ chandler/parcels/osaf/mail/imap.py Mon Apr 4 15:13:19 2005
@@ -1,5 +1,5 @@
-__revision__ = "$Revision: 1.48 $"
-__date__ = "$Date: 2005/03/29 01:36:20 $"
+__revision__ = "$Revision: 1.49 $"
+__date__ = "$Date: 2005/04/04 22:13:19 $"
__copyright__ = "Copyright (c) 2005 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -402,7 +402,7 @@
def _viewCommitSuccess(self):
"""
- Overides C{RepositoryView.AbstractRepositoryViewManager}.
+ Overides C{RepositoryViewManager.AbstractRepositoryViewManager}.
It posts a commit event to the GUI thread, unpins the C{EmailAccountKind} from
memory, and writes commit info to the logger
@return: C{None}
Index: chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py
diff -u chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py:1.1 chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py:1.2
--- chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py:1.1 Thu Oct 28 14:26:23 2004
+++ chandler/parcels/osaf/framework/twisted/TwistedRepositoryViewManager.py Mon Apr 4 15:13:19 2005
@@ -1,11 +1,13 @@
-__revision__ = "$Revision: 1.1 $"
-__date__ = "$Date: 2004/10/28 21:26:23 $"
+__revision__ = "$Revision: 1.2 $"
+__date__ = "$Date: 2005/04/04 22:13:19 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
import repository.persistence.RepositoryView as RepositoryView
+from repository.persistence.RepositoryViewManager \
+ import AbstractRepositoryViewManager
-class RepositoryViewManager(RepositoryView.AbstractRepositoryViewManager):
+class RepositoryViewManager(AbstractRepositoryViewManager):
def execInViewDeferred(self, result, method, *args, **kw):
"""
Index: chandler/repository/persistence/PackHandler.py
diff -u chandler/repository/persistence/PackHandler.py:1.22 chandler/repository/persistence/PackHandler.py:1.23
--- chandler/repository/persistence/PackHandler.py:1.22 Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/PackHandler.py Mon Apr 4 15:13:21 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.22 $"
-__date__ = "$Date: 2005/03/18 21:41:48 $"
+__revision__ = "$Revision: 1.23 $"
+__date__ = "$Date: 2005/04/04 22:13:21 $"
__copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -26,6 +26,11 @@
self.view = view
self.hooks = []
+ packs = view.getRoot('Packs')
+ if packs is None:
+ packs = Item('Packs', view, None)
+ self.packs = packs
+
def startDocument(self):
self.tagAttrs = []
@@ -70,9 +75,7 @@
else:
self.name = attrs['name']
-
- packs = self.view.findPath('Packs')
- self.pack = Item(self.name, packs, None)
+ self.pack = Item(self.name, self.packs, None)
self.hooks.append([])
def packEnd(self, attrs):
Index: chandler/repository/persistence/RepositoryError.py
diff -u chandler/repository/persistence/RepositoryError.py:1.16 chandler/repository/persistence/RepositoryError.py:1.17
--- chandler/repository/persistence/RepositoryError.py:1.16 Fri Mar 18 13:41:48 2005
+++ chandler/repository/persistence/RepositoryError.py Mon Apr 4 15:13:21 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.16 $"
-__date__ = "$Date: 2005/03/18 21:41:48 $"
+__revision__ = "$Revision: 1.17 $"
+__date__ = "$Date: 2005/04/04 22:13:21 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -77,28 +77,6 @@
REF: 'REF' }
-class ViewError(RepositoryError):
- "View '%s' is not the view, '%s', set for the current thread '%s'"
-
- def __str__(self):
- return self.__doc__ %(self.args[0].name,
- self.args[1].name,
- threading.currentThread().getName())
-
-
-class ItemViewError(ViewError):
- "View '%s', set for the current thread, '%s', is not the view of the instance of %s used, '%s'."
-
- def __str__(self):
- return self.__doc__ %(self.args[1].name,
- threading.currentThread().getName(),
- self.getItem()._repr_(),
- self.getItem().itsView.name)
-
- def getItem(self):
- return self.args[0]
-
-
class LoadError(RepositoryError):
"While loading %s, %s"
@@ -118,3 +96,10 @@
def __str__(self):
return self.__doc__ %(self.args[0], self.args[1], self.args[2])
+
+
+class ItemImportError(RepositoryError):
+ "While importing %s into %s, %s"
+
+ def __str__(self):
+ return self.__doc__ %(self.args[0], self.args[1], self.args[2])
Index: chandler/parcels/osaf/mail/smtp.py
diff -u chandler/parcels/osaf/mail/smtp.py:1.36 chandler/parcels/osaf/mail/smtp.py:1.37
--- chandler/parcels/osaf/mail/smtp.py:1.36 Mon Mar 28 17:36:20 2005
+++ chandler/parcels/osaf/mail/smtp.py Mon Apr 4 15:13:19 2005
@@ -1,5 +1,5 @@
-__revision__ = "$Revision: 1.36 $"
-__date__ = "$Date: 2005/03/29 01:36:20 $"
+__revision__ = "$Revision: 1.37 $"
+__date__ = "$Date: 2005/04/04 22:13:19 $"
__copyright__ = "Copyright (c) 2005 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -357,7 +357,7 @@
def _viewCommitSuccess(self):
"""
- Overides C{RepositoryView.AbstractRepositoryViewManager}.
+ Overides C{RepositoryViewManager.AbstractRepositoryViewManager}.
It posts a commit event to the GUI thread, unpins the C{SMTPAccountKind} and
C{MailMessageKind} from memory, and writes commit info to the logger
@return: C{None}
Index: chandler/Makefile
diff -u chandler/Makefile:1.95 chandler/Makefile:1.96
--- chandler/Makefile:1.95 Tue Mar 29 14:58:52 2005
+++ chandler/Makefile Mon Apr 4 15:13:18 2005
@@ -19,7 +19,7 @@
# these get installed into release or debug
BIN_ARCHIVES=../Launchers-$(SNAP)-0.4-9.tar.gz \
- ../chandlerdb-$(SNAP)-0.5-5.tar.gz \
+ ../chandlerdb-$(SNAP)-0.5-6.tar.gz \
../db-$(SNAP)-4.3.27-1.tar.gz \
../egenix-mx-base-$(SNAP)-2.1.0-3.tar.gz \
../epydoc-$(SNAP)-2.1-2.tar.gz \
Index: chandler/repository/item/Item.py
diff -u chandler/repository/item/Item.py:1.203 chandler/repository/item/Item.py:1.204
--- chandler/repository/item/Item.py:1.203 Mon Mar 28 15:33:16 2005
+++ chandler/repository/item/Item.py Mon Apr 4 15:13:19 2005
@@ -1,11 +1,9 @@
-__revision__ = "$Revision: 1.203 $"
-__date__ = "$Date: 2005/03/28 23:33:16 $"
+__revision__ = "$Revision: 1.204 $"
+__date__ = "$Date: 2005/04/04 22:13:19 $"
__copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
-import cStringIO
-
from chandlerdb.util.uuid import UUID
from chandlerdb.schema.descriptor import _countAccess
from chandlerdb.item.item import CItem
@@ -17,6 +15,8 @@
from repository.item.PersistentCollections \
import PersistentCollection, PersistentList, PersistentDict
+from repository.persistence.RepositoryView import nullRepositoryView
+
from repository.util.SingleRef import SingleRef
from repository.util.Path import Path
from repository.util.LinkedMap import LinkedMap
@@ -25,17 +25,20 @@
class Item(CItem):
'The root class for all items.'
- def __init__(self, name, parent, kind):
+ def __init__(self, name=None, parent=None, kind=None, _uuid=None):
"""
Construct an Item.
@param name: The name of the item. It must be unique among the names
- this item's siblings. C{name} may be C{None}.
+ this item's siblings. C{name} is optional, except for roots and is
+ C{None} by default.
@type name: a string or C{None} to create an anonymous item.
@param parent: The parent of this item. All items require a parent
unless they are a repository root in which case the parent argument
is the repository.
- @type parent: an item or the item's repository view
+ @type parent: an item or the item's repository view. C{parent} is
+ optional. When ommitted, the item is made a root of either the
+ C{kind}'s view or of the global null view.
@param kind: The kind for this item. This kind has definitions for
all the Chandler attributes that are to be used with this item.
This parameter can be C{None} for Chandler attribute-less operation.
@@ -50,7 +53,7 @@
cls = type(self)
self._values = Values(self)
self._references = References(self)
- self._uuid = UUID()
+ self._uuid = _uuid or UUID()
self._name = name or None
self._kind = kind
self._version = 0
@@ -59,15 +62,10 @@
kind._setupClass(cls)
if parent is None:
- if kind is None:
- raise NoParentError, self
-
- parent = kind.getAttributeValue('defaultParent', default=Item.Nil,
- _attrDict=kind._values)
- if parent is None:
- raise NoSuchDefaultParentError, (self, kind)
- if parent is Item.Nil:
- raise NoParentError, self
+ if kind is not None:
+ parent = kind.itsView
+ else:
+ parent = nullRepositoryView
if name is None and not parent._isItem():
raise AnonymousRootError, self
@@ -1217,6 +1215,45 @@
return False
+ def _collectItems(self, items, filter=None):
+
+ def collectItems(item):
+ parent = item.itsParent
+ if parent._isItem() and not parent in items:
+ if filter is None or filter(parent) is True:
+ return collectItems(parent)
+
+ def collectChildren(_item):
+ if not _item in items:
+ items.add(_item)
+ for child in _item.iterChildren():
+ collectItems(child)
+
+ def collectReferences(_item):
+ def collectOther(__item):
+ if __item not in items:
+ if filter is None or filter(__item) is True:
+ collectItems(__item)
+
+ for key, value in _item._references.items():
+ if value is not None:
+ if value._isRefList():
+ for other in value:
+ collectOther(other)
+ else:
+ if value._isUUID():
+ value = self.find(value)
+ collectOther(value)
+
+ collectChildren(item)
+ collectReferences(item)
+ kind = item._kind
+ if not (kind is None or kind in items):
+ if filter is None or filter(kind) is True:
+ collectItems(kind)
+
+ collectItems(self)
+
def getItemCloud(self, cloudAlias, items=None):
"""
Get the items in a cloud by using this item as entrypoint.
@@ -1528,7 +1565,7 @@
if oldView is not newView:
if oldView is not None and newView is not None:
- raise NotImplementedError, 'changing repositories'
+ raise NotImplementedError, 'changing views'
if oldView is not None:
oldView._unregisterItem(self, False)
@@ -1723,7 +1760,8 @@
acl = Item.Nil
if acl is Item.Nil:
- acl = self.getRepositoryView().getACL(self._uuid, name, self._version)
+ acl = self.getRepositoryView().getACL(self._uuid, name,
+ self._version)
return acl
@@ -1740,6 +1778,10 @@
except AttributeError:
return None
+ def __setRepositoryView(self, view):
+
+ view.importItem(self)
+
def rename(self, name):
"""
Rename this item.
@@ -2222,6 +2264,7 @@
""")
itsView = property(fget = getRepositoryView,
+ fset = __setRepositoryView,
doc =
"""
Return this item's repository view.
@@ -2243,63 +2286,3 @@
item. Setting an item's kind to C{None} clears all
its values.
""")
-
-
-class Children(LinkedMap):
-
- def __init__(self, item, new):
-
- super(Children, self).__init__(new)
-
- self._item = None
- self._setItem(item)
-
- def _setItem(self, item):
-
- if self._item is not None:
- assert item._uuid == self._item._uuid
-
- for link in self._itervalues():
- link.getValue(self)._parent = item
-
- if item is not None and item._isItem():
- item._status |= Item.CONTAINER
-
- self._item = item
-
- def _refCount(self):
-
- return super(Children, self).__len__() + 1
-
- def linkChanged(self, link, key):
-
- self._item.setDirty(Item.CDIRTY)
-
- def _unloadChild(self, child):
-
- self._unloadRef(child)
-
- def __repr__(self):
-
- buffer = None
-
- try:
- buffer = cStringIO.StringIO()
- buffer.write('{(currenly loaded) ')
- first = True
- for link in self._itervalues():
- if not first:
- buffer.write(', ')
- else:
- first = False
- buffer.write(link.getValue(self)._repr_())
- buffer.write('}')
-
- return buffer.getvalue()
-
- finally:
- if buffer is not None:
- buffer.close()
-
- def _saveValues(self, version):
- raise NotImplementedError, "%s._saveValues" %(type(self))
Index: chandler/repository/persistence/DBRefs.py
diff -u chandler/repository/persistence/DBRefs.py:1.5 chandler/repository/persistence/DBRefs.py:1.6
--- chandler/repository/persistence/DBRefs.py:1.5 Tue Mar 22 16:56:35 2005
+++ chandler/repository/persistence/DBRefs.py Mon Apr 4 15:13:21 2005
@@ -1,15 +1,15 @@
-__revision__ = "$Revision: 1.5 $"
-__date__ = "$Date: 2005/03/23 00:56:35 $"
+__revision__ = "$Revision: 1.6 $"
+__date__ = "$Date: 2005/04/04 22:13:21 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
from cStringIO import StringIO
-from repository.item.Item import Item, Children
+from repository.item.Children import Children
from repository.item.RefCollections import RefList
from repository.item.Indexes import NumericIndex
-from repository.persistence.RepositoryError import MergeError, ItemViewError
+from repository.persistence.RepositoryError import MergeError
from chandlerdb.util.uuid import UUID
from repository.util.LinkedMap import LinkedMap
@@ -108,10 +108,6 @@
def _loadRef(self, key):
- view = self.view
- if view is not view.repository.view:
- raise ItemViewError, (self._item, view.repository.view)
-
if self._isRemoved(key):
return None
Index: chandler/repository/item/Indexes.py
diff -u chandler/repository/item/Indexes.py:1.11 chandler/repository/item/Indexes.py:1.12
--- chandler/repository/item/Indexes.py:1.11 Fri Mar 18 13:41:46 2005
+++ chandler/repository/item/Indexes.py Mon Apr 4 15:13:19 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.11 $"
-__date__ = "$Date: 2005/03/18 21:41:46 $"
+__revision__ = "$Revision: 1.12 $"
+__date__ = "$Date: 2005/04/04 22:13:19 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -49,6 +49,9 @@
def getIndexType(self):
raise NotImplementedError, "%s.getIndexType" %(type(self))
+ def getInitKeywords(self):
+ raise NotImplementedError, "%s.getInitKeywords" %(type(self))
+
def __len__(self):
return self._count
@@ -140,6 +143,10 @@
return 'numeric'
+ def getInitKeywords(self):
+
+ return {}
+
def insertKey(self, key, afterKey):
self.insert(self, key, afterKey)
@@ -197,6 +204,10 @@
else:
self._descending = False
+ def getInitKeywords(self):
+
+ return {'descending': self._descending }
+
def compare(self, k0, k1):
raise NotImplementedError, '%s is abstract' % type(self)
@@ -319,6 +330,13 @@
return 'attribute'
+ def getInitKeywords(self):
+
+ kwds = super(AttributeIndex, self).getInitKeywords()
+ kwds['attribute'] = self._attribute
+
+ return kwds
+
def compare(self, k0, k1):
v0 = self._valueMap[k0].getAttributeValue(self._attribute)
@@ -365,6 +383,13 @@
return 'compare'
+ def getInitKeywords(self):
+
+ kwds = super(AttributeIndex, self).getInitKeywords()
+ kwds['compare'] = self._compare
+
+ return kwds
+
def compare(self, k0, k1):
return getattr(self._valueMap[k0], self._compare)(self._valueMap[k1])
Index: chandler/repository/persistence/RepositoryView.py
diff -u chandler/repository/persistence/RepositoryView.py:1.37 chandler/repository/persistence/RepositoryView.py:1.38
--- chandler/repository/persistence/RepositoryView.py:1.37 Fri Mar 25 13:53:57 2005
+++ chandler/repository/persistence/RepositoryView.py Mon Apr 4 15:13:21 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.37 $"
-__date__ = "$Date: 2005/03/25 21:53:57 $"
+__revision__ = "$Revision: 1.38 $"
+__date__ = "$Date: 2005/04/04 22:13:21 $"
__copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -9,20 +9,17 @@
from threading import currentThread, Thread
from chandlerdb.util.uuid import UUID
+from chandlerdb.item.item import CItem
from repository.util.Path import Path
from repository.util.ThreadSemaphore import ThreadSemaphore
+from repository.util.Lob import Lob
from repository.persistence.RepositoryError \
- import RepositoryError, VersionConflictError, ViewError, \
- RecursiveLoadItemError
-from repository.item.Item import Item
-from repository.item.ItemHandler import ItemHandler
-from repository.persistence.PackHandler import PackHandler
-import Repository
+ import RepositoryError, VersionConflictError, \
+ RecursiveLoadItemError, ItemImportError
+from repository.item.Children import Children
+from repository.item.RefCollections import TransientRefList
-timing = False
-if timing: import tools.timing
-
class RepositoryView(object):
"""
This class implements the cache for loaded items. Changes to items in a
@@ -43,7 +40,7 @@
super(RepositoryView, self).__init__()
- if not repository.isOpen():
+ if repository is not None and not repository.isOpen():
raise RepositoryError, "Repository is not open"
self.repository = repository
@@ -80,6 +77,10 @@
return False
+ def _isNullView(self):
+
+ return False
+
def _createRefList(self, item, name, otherName,
persist, readOnly, new, uuid):
@@ -109,10 +110,11 @@
self._status = RepositoryView.OPEN
repository = self.repository
- if repository.isRefCounted():
- self._status |= RepositoryView.REFCOUNTED
- repository.store.attachView(self)
- repository._openViews.append(self)
+ if repository is not None:
+ if repository.isRefCounted():
+ self._status |= RepositoryView.REFCOUNTED
+ repository.store.attachView(self)
+ repository._openViews.append(self)
def __len__(self):
@@ -126,13 +128,13 @@
if dirty:
if not self._status & RepositoryView.LOADING:
- self._status |= Item.CDIRTY
+ self._status |= CItem.CDIRTY
else:
- self._status &= ~Item.CDIRTY
+ self._status &= ~CItem.CDIRTY
def isDirty(self):
- return self._status & Item.CDIRTY != 0
+ return self._status & CItem.CDIRTY != 0
def closeView(self):
"""
@@ -146,9 +148,10 @@
raise RepositoryError, "RepositoryView is not open"
repository = self.repository
- if repository._threaded.view is self:
- del repository._threaded.view
- repository._openViews.remove(self)
+ if repository is not None:
+ if repository._threaded.view is self:
+ del repository._threaded.view
+ repository._openViews.remove(self)
for item in self._registry.itervalues():
item._setStale()
@@ -157,9 +160,10 @@
self._roots = None
self._deletedRegistry.clear()
self._instanceRegistry.clear()
- self._status &= ~(RepositoryView.OPEN | Item.CDIRTY)
+ self._status &= ~(RepositoryView.OPEN | CItem.CDIRTY)
- repository.store.detachView(self)
+ if repository is not None:
+ repository.store.detachView(self)
def prune(self, size):
"""
@@ -213,9 +217,6 @@
def _setLoading(self, loading, runHooks=False):
- if self.repository.view is not self:
- raise ViewError, (self, self.repository.view)
-
status = (self._status & RepositoryView.LOADING != 0)
if loading:
@@ -398,16 +399,9 @@
@type parent: an item
"""
- if timing: tools.timing.begin("Load pack")
-
- packs = self.getRoot('Packs')
- if not packs:
- packs = Item('Packs', self, None)
-
+ from repository.persistence.PackHandler import PackHandler
PackHandler(path, parent, self).parseFile(path)
- if timing: tools.timing.end("Load pack")
-
def dir(self, item=None, path=None):
"""
Print out a listing of each item in the repository or under item.
@@ -552,6 +546,10 @@
return not self.isLoading()
+ def _unsavedItems(self):
+
+ raise NotImplementedError, "%s._unsavedItems" %(type(self))
+
def _addItem(self, item, previous=None, next=None):
name = item.itsName
@@ -625,7 +623,7 @@
size of the cache drops below 90% of this threshhold.
"""
- raise NotImplementedError, "%s.commit" %(type(self))
+ raise NotImplementedError, "%s.refresh" %(type(self))
def commit(self, mergeFn=None):
"""
@@ -691,9 +689,6 @@
def _loadRoot(self, name):
raise NotImplementedError, "%s._loadRoot" %(type(self))
- def _newItems(self):
- raise NotImplementedError, "%s._newItems" %(type(self))
-
def __getUUID(self):
return self.repository.itsUUID
@@ -772,20 +767,115 @@
def _commitMerge(self):
- if self._status & Item.CMERGED:
+ if self._status & CItem.CMERGED:
self._roots._commitMerge()
def _revertMerge(self):
- if self._status & Item.CMERGED:
+ if self._status & CItem.CMERGED:
self._roots._revertMerge()
- self._status &= ~Item.MERGED
+ self._status &= ~CItem.MERGED
def getItemVersion(self, version, item):
return self.repository.store.getItemVersion(version, item._uuid)
+ def addNotificationCallback(self, fn):
+
+ self.repository.addNotificationCallback(fn)
+
+ def removeNotificationCallback(self, fn):
+
+ return self.repository.removeNotificationCallback(fn)
+
+ def importItem(self, item):
+
+ if self.find(item._uuid) is not None:
+ raise ItemImportError, (item, self, "item already exists")
+
+ items = set()
+ view = item.itsView
+ if view is self:
+ return items
+
+ item._collectItems(items,
+ lambda _item: (_item.isNew() or
+ self.find(_item._uuid) is None))
+
+ sameType = type(self) is type(view)
+
+ for _item in items:
+ kind = _item._kind
+ if not (kind is None or kind in items):
+ localKind = self.find(kind._uuid)
+ if localKind is None:
+ raise ItemImportError, (_item, self,
+ "Kind %s not found" %(kind.itsPath))
+ item._kind = kind
+
+ for key, value in _item._values.iteritems():
+ if not sameType and isinstance(value, Lob):
+ _item._values[key] = value.copy(self)
+
+ for key, value in _item._references.items():
+ if value is not None:
+ if value._isRefList():
+ if sameType or value._isTransient():
+ previous = None
+ for other in value:
+ if other not in items:
+ value.remove(other)
+ other = self.find(other._uuid)
+ value.insertItem(other, previous)
+ else:
+ localValue = self._createRefList(_item, value._name, value._otherName, True, False, True, UUID())
+ value._copyIndexes(localValue)
+ for other in value:
+ if other in items:
+ localValue._setRef(other, load=True,
+ noMonitors=True)
+ else:
+ value.remove(other)
+ path = other.itsPath
+ other = self.find(other._uuid)
+ localValue.append(other)
+ localValue._aliases = value._aliases
+ _item._references[key] = localValue
+ else:
+ if value._isUUID():
+ value = self.find(value)
+ if value not in items:
+ _item.removeAttributeValue(key)
+ _item.setAttributeValue(key, value)
+
+ for _item in items:
+ parent = _item.itsParent
+ if hasattr(type(_item), 'onItemImport'):
+ _item.onItemImport(self)
+ if not parent in items:
+ if parent is view:
+ localParent = self
+ else:
+ localParent = self.find(parent._uuid)
+ if localParent is not parent:
+ def setRoot(root, __item):
+ view._unregisterItem(__item, False)
+ self._registerItem(__item)
+ __item._root = root
+ for child in __item.iterChildren():
+ setRoot(root, child)
+ if _item.isNew():
+ parent._removeItem(_item)
+ else:
+ parent._unloadChild(_item)
+ root = localParent._addItem(_item)
+ _item._parent = localParent
+ setRoot(root, _item)
+
+ return items
+
+
itsUUID = property(__getUUID)
itsName = property(__getName)
itsPath = property(_getPath)
@@ -803,16 +893,10 @@
COMMITTING = 0x0008
FDIRTY = 0x0010
- # flags from Item
+ # flags from CItem
# CDIRTY = 0x0200
# merge flags
- def addNotificationCallback(self, fn):
- self.repository.addNotificationCallback(fn)
-
- def removeNotificationCallback(self, fn):
- return self.repository.removeNotificationCallback(fn)
-
class OnDemandRepositoryView(RepositoryView):
@@ -948,292 +1032,160 @@
item._unloadItem(False)
else:
self.logger.warn('not pruning %s (refCount %d)',
- Item.__repr__(item),
- pythonRefs - itemRefs)
+ item._repr_(), pythonRefs - itemRefs)
else:
for i in xrange(count):
registry[heapq.heappop(heap)[1]]._unloadItem(False)
-class AbstractRepositoryViewManager(object):
+class NullRepositoryView(RepositoryView):
- def __init__(self, repository, viewName = None):
- """
- Base Class for View Context Management.
+ def __init__(self):
- @param repository: a Repository instance
- @type repository: C{Repository}
- @param viewName: The name to assign as the key for the view
- @type name: a string
- @return: C{None}
- """
+ super(NullRepositoryView, self).__init__(None, "null view")
- if repository is None:
- raise RepositoryError, "Repository Instance is None"
+ self._logger = logging.getLogger('repository')
+ self._logger.addHandler(logging.StreamHandler())
+
+ def setCurrentView(self):
- self.repository = repository
- self.view = self.repository.createView(viewName)
- self.prevView = None
- self.callChain = False
- self.log = self._getLog()
+ raise AssertionError, "Null view cannot be made current"
- def _getLog(self):
- """
- This method is called by the __init__ method to retrieve a C{logging.Logger} for
- logging.
+ def refresh(self, mergeFn=None):
+
+ raise AssertionError, "Null view cannot refresh"
- This method can be sub-classed to return a custom logger by the child.
+ def commit(self, mergeFn=None):
+
+ raise AssertionError, "Null view cannot commit"
- @return: C{logging.Logger}
- """
+ def cancel(self):
+
+ raise AssertionError, "Null view cannot cancel"
- log = logging.getLogger("AbstractRepositoryViewManager")
- log.setLevel(logging.DEBUG)
- return log
+ def _createRefList(self, item, name, otherName,
+ persist, readOnly, new, uuid):
- def setViewCurrent(self):
- """
- This method changes the current C{RepositoryView} to be the C{RepositoryView} associated with the
- C{AbstractRepositoryViewManger} instance.
+ return NullViewRefList(item, name, otherName, persist, readOnly)
+
+ def _createChildren(self, parent, new):
- It saves the previous C{RepositoryView}. Calling C{AbstractRepositoryViewManager.restorePreviousView} will
- set the previous C{RepositoryView} as the current C{RepositoryView}.
+ return Children(parent, new)
+
+ def _getLobType(self):
- @return: C{None}
- """
+ return NullViewLob
- assert self.callChain is False, "setViewCurrent called again before a restorePreviousView"
+ def _findSchema(self, spec, withSchema):
- assert self.prevView is None, "Nested prevView investigate"
- self.prevView = self.getCurrentView()
- self.repository.setCurrentView(self.view)
+ return self.find(spec, load=False)
- self.callChain = True
+ def _loadItem(self, uuid):
+ return None
- def restorePreviousView(self):
- """
- This method will restore the C{RepositoryView} that was current before
- C{AbstractRepositoryViewManager.setViewCurrent} when called.
+ def setDirty(self, dirty):
- The C{AbstractRepositoryViewManager.setViewCurrent} method must be called before this method.
+ pass
- @return: C{None}
- """
+ def isDirty(self):
- if self.callChain is not True:
- raise RepositoryError, "restorePreviousView called before setViewCurrent"
+ return False
- if self.prevView is not None:
- self.repository.setCurrentView(self.prevView)
- self.prevView = None
+ def isOpen(self):
- self.callChain = False
+ return (self._status & RepositoryView.OPEN) != 0
+ def isNew(self):
- def execInView(self, method, *args, **kw):
- """
- This utility method will call C{AbstractRepositoryViewManager.setCurrentView}.
- Execute the method passed in as an argument and call
- C{AbstractRepositoryViewManager.restorePreviousView} when the method is finished executing.
+ return False
- It abstracts the C{RepositoryView} switching logic for the caller and is the recommended means of
- executing code that utilizes a C{RepositoryView}.
+ def isStale(self):
- @param method: The method to execute
- @type method: a string
- @param args: Arguments to pass to the method
- @type args: list reference
- @param kw: Keyword dict to pass to the method
- @type args: dict reference
- @return: The value returned by the method call or None
- """
+ return False
- result = None
+ def isRefCounted(self):
- self.setViewCurrent()
+ return True
+
+ def isLoading(self):
- try:
- result = method(*args, **kw)
+ return False
- finally:
- self.restorePreviousView()
+ def _isNullView(self):
- return result
+ return True
+ def _setLoading(self, loading, runHooks=False):
- def execInViewThenCommit(self, method, *args, **kw):
- """
- This utility method will call C{AbstractRepositoryViewManager.setCurrentView},
- execute the method passed in as an argument and perform a Repository commit in
- the current Thread then call C{AbstractRepositoryViewManager.restorePreviousView}.
-
- It abstracts the C{RepositoryView} switching and commit logic for the caller and
- is the recommended means of executing a method and inline commit in a C{RepositoryView}.
-
- @param method: The method to execute
- @type method: a string
- @param args: Arguments to pass to the method
- @type args: list reference
- @param kw: Keyword dict to pass to the method
- @type args: dict reference
- @return: The value returned by the method call or None
- """
- result = None
+ raise AssertionError, "Null view cannot load items"
- self.setViewCurrent()
+ def _getStore(self):
- try:
- result = method(*args, **kw)
- self.__commit()
- finally:
- self.restorePreviousView()
+ return None
- return result
+ def _logItem(self, item):
- def execInViewThenCommitInThread(self, method, *args, **kw):
- """
- This utility method will call C{AbstractRepositoryViewManager.setCurrentView},
- execute the method passed in as an argument, spawn a C{RepositoryThread} to perform
- a Repository commit, then call C{AbstractRepositoryViewManager.restorePreviousView}.
- Spawning a C{RepositoryThread}prevents the current Thread from blocking which the
- C{RepositoryView} is commiting. This is especially useful
- when a Asynchronous model is employed.
-
- The method abstracts the C{RepositoryView} switching and commit logic for the caller and
- is the recommended means of executing a method and non-blocking commit in a C{RepositoryView}.
-
- @param method: The method to execute
- @type method: a string
- @param args: Arguments to pass to the method
- @type args: list reference
- @param kw: Keyword dict to pass to the method
- @type args: dict reference
- @return: The value returned by the method call or None
- """
+ return True
- result = self.execInView(method, *args, **kw)
- self.commitInView(True)
- return result
+ def _unsavedItems(self):
- def getCurrentView(self):
- """
- Gets the current C{RepositoryView} the C{Repository} is working with
- @return: C{RepositoryView}
- """
+ return self._registry.itervalues()
- return self.repository.getCurrentView(False)
+ def getLogger(self):
- def printCurrentView(self, printString = None):
- """
- Writes the current C{RepositoryView} as well as optional printString to the C{logging.Logger}
- instance. This method is useful for C{RepositoryView} debugging.
+ return self._logger
- @param printString: An optional string to display with the message (i.e. the name of the calling method)
- @type printString: string
- @return: C{None}
- """
+ def isDebug(self):
- str = None
+ return self._logger.getEffectiveLevel() <= logging.DEBUG
- if printString is None:
- self.log.info("Current View is: %s" % self.getCurrentView())
- else:
- self.log.info("[%s] Current View is: %s" % (printString, self.getCurrentView()))
+ def __getUUID(self):
+ return self.itsUUID
- def commitInView(self, useThread=False):
- """
- Runs a C{RepositoryView} commit. If the commit is successful calls the
- C{AbstractRepositoryViewManager._viewCommitSuccess} method otherwise calls
- the C{AbstractRepositoryViewManager._viewCommitFailed} method. Both methods
- can be subclassed to add additional functionality. An optional useThread
- argument can be passed which indicates to run the commit in a dedicated
- C{RepositoryThread} to prevent blocking the current thread.
+ def getRepositoryView(self):
- @param useThread: Flag to indicate whether to run the view commit in the current
- thread or a dedicated C{RepositoryThread} to prevent blocking
- @type: boolean
- @return: C{None}
- """
+ return self
+
+ def getItemVersion(self, version, item):
- if useThread:
- thread = Repository.RepositoryThread(target=self.__commitInView)
- thread.start()
+ return item._version
- else:
- self.__commitInView
+ def queryItems(self, kind=None, attribute=None, load=True):
- def _viewCommitSuccess(self):
- """
- Called by C{AbstractRepositoryViewManager.commitView} when a
- C{RepositoryView} is commited.
+ if kind is not None:
+ return [item for item in self._registry.itervalues()
+ if item._kind is kind]
- Overide this method to handle any additional functionality needed
- when a C{RepositoryView} is committed.
- @return: C{None}
- """
+ elif attribute is not None:
+ raise NotImplementedError, 'attribute query'
- pass
+ else:
+ raise ValueError, 'one of kind or value must be set'
- def _viewCommitFailed(self, err):
- """
- Called by C{AbstractRepositoryViewManager.commitView} when a
- C{RepositoryView} raises an error on commited.
- Overide this method to handle any additional functionality needed
- when a C{RepositoryView} fails on commit.
+ logger = property(getLogger)
+ itsUUID = UUID('17368718-a164-11d9-9351-000393db837c')
- @param err: A Python Exception instance to use for debugging and error message display
- @type Exception
- @return: C{None}
- """
- str = "View Commit Failed: %s" % err
- self.log.error(str)
+class NullViewLob(Lob):
- def __commitInView(self):
- """
- Sets the current view then Attempts to commit the view.
- Calls viewCommitSuccess or viewCommitFailed. Then restore the
- previous view. Need to sync with Andi on
- what happens in the case of a conflict or
- failed commit. This is still being resolved
- by the repository team
- """
+ def __init__(self, view, *args, **kwds):
- self.setViewCurrent()
+ super(NullViewLob, self).__init__(*args, **kwds)
- try:
- self.__commit()
- finally:
- self.restorePreviousView()
+class NullViewRefList(TransientRefList):
- def __commit(self):
- """
- Attempts to commit in the view. Calls viewCommitSuccess or
- viewCommitFailed. This method does not set or unset the current
- view. Need to sync with Andi on
- what happens in the case of a conflict or
- failed commit. This is still being resolved
- by the repository team
- """
+ def __init__(self, item, name, otherName, persist, readOnly):
- try:
- self.view.commit()
+ super(NullViewRefList, self).__init__(item, name, otherName, readOnly)
+ self._transient = not persist
- except RepositoryError, e:
- """This condition needs to be flushed out more"""
- self._viewCommitFailed(e)
-
- except VersionConflictError, e1:
- """This condition needs to be flushed out more"""
- self._viewCommitFailed(e1)
-
- except Exception, e2:
- """Catch any unknown exceptions raised by the Repository"""
- self._viewCommitFailed(e2)
+ def _isTransient(self):
- else:
- self._viewCommitSuccess()
+ return self._transient
+
+
+nullRepositoryView = NullRepositoryView()
Index: chandler/repository/schema/Kind.py
diff -u chandler/repository/schema/Kind.py:1.107 chandler/repository/schema/Kind.py:1.108
--- chandler/repository/schema/Kind.py:1.107 Tue Mar 29 14:58:52 2005
+++ chandler/repository/schema/Kind.py Mon Apr 4 15:13:21 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.107 $"
-__date__ = "$Date: 2005/03/29 22:58:52 $"
+__revision__ = "$Revision: 1.108 $"
+__date__ = "$Date: 2005/04/04 22:13:21 $"
__copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -125,7 +125,7 @@
else:
self.itsView.logger.warn("Not installing attribute descriptor for '%s' since it would shadow already existing descriptor: %s", name, descriptor)
- def newItem(self, name, parent, cls=None):
+ def newItem(self, name=None, parent=None, cls=None):
"""
Create an new item of this kind.
@@ -137,9 +137,9 @@
@param name: The name of the item. It must be unique among the names
this item's siblings. C{name} may be C{None}.
@type name: a string or C{None} to create an anonymous item.
- @param parent: The parent of this item. All items require a parent
- unless they are a repository root in which case the parent argument
- is the repository.
+ @param parent: The parent of this item. C{parent} is
+ optional. When ommitted, the item is made a root of either the
+ C{kind}'s view or of the global null view.
@type parent: an item or the item's repository view
@param cls: an optional python class to instantiate the item with,
defaults to the class set on this kind.
@@ -167,8 +167,8 @@
this item's siblings. C{name} may be C{None}.
@type name: a string or C{None} to create an anonymous item.
@param parent: The parent of this item. All items require a parent
- unless they are a repository root in which case the parent argument
- is the repository.
+ unless they are a repository root in which case C{parent} is a
+ repository view.
@type parent: an item or the item's repository view
@param uuid: The uuid for the item.
@type uuid: L{UUID<chandlerdb.util.uuid.UUID>}
Index: chandler/repository/util/Lob.py
diff -u chandler/repository/util/Lob.py:1.11 chandler/repository/util/Lob.py:1.12
--- chandler/repository/util/Lob.py:1.11 Tue Feb 15 16:29:21 2005
+++ chandler/repository/util/Lob.py Mon Apr 4 15:13:23 2005
@@ -1,6 +1,6 @@
-__revision__ = "$Revision: 1.11 $"
-__date__ = "$Date: 2005/02/16 00:29:21 $"
+__revision__ = "$Revision: 1.12 $"
+__date__ = "$Date: 2005/04/04 22:13:23 $"
__copyright__ = "Copyright (c) 2003-2004 Open Source Applications Foundation"
__license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
@@ -91,6 +91,37 @@
return self._data
+ def load(self, data, attrs):
+
+ self.mimetype = attrs.get('mimetype', 'text/plain')
+ if attrs.has_key('encoding'):
+ self.encoding = attrs['encoding']
+
+ self._compression = attrs.get('compression', None)
+ self._encryption = attrs.get('encryption', None)
+ self._version = long(attrs.get('version', '0'))
+ self._indexed = attrs.get('indexed', 'False') == 'True'
+
+ if attrs.get('type', 'text') == 'text':
+ writer = self.getWriter()
+ writer.write(data)
+ writer.close()
+
+ def copy(self, view, key=None):
+
+ copy = view._getLobType()(view, self.encoding,
+ self.mimetype, self._indexed)
+
+ inputStream = self.getInputStream(key)
+ outputStream = copy.getOutputStream(self._compression, self._encryption,
+ key)
+
+ outputStream.write(inputStream.read())
+ outputStream.close()
+ inputStream.close()
+
+ return copy
+
def getWriter(self, compression='bz2', encryption=None, key=None,
append=False, replace=False):
More information about the Commits
mailing list