/usr/share/pyshared/axiom/substore.py is in python-axiom 0.7.1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | # -*- test-case-name: axiom.test.test_substore -*-
from zope.interface import implements
from twisted.application import service
from axiom.iaxiom import IPowerupIndirector
from axiom.store import Store
from axiom.item import Item
from axiom.attributes import path, inmemory, reference
from axiom.upgrade import registerUpgrader
class SubStore(Item):
schemaVersion = 1
typeName = 'substore'
storepath = path()
substore = inmemory()
implements(IPowerupIndirector)
def createNew(cls, store, pathSegments):
"""
Create a new SubStore, allocating a new file space for it.
"""
if isinstance(pathSegments, basestring):
raise ValueError(
'Received %r instead of a sequence' % (pathSegments,))
if store.dbdir is None:
self = cls(store=store, storepath=None)
else:
storepath = store.newDirectory(*pathSegments)
self = cls(store=store, storepath=storepath)
self.open()
self.close()
return self
createNew = classmethod(createNew)
def close(self):
self.substore.close()
del self.substore._openSubStore
del self.substore
def open(self, debug=False):
if hasattr(self, 'substore'):
return self.substore
else:
s = self.substore = self.createStore(debug)
s._openSubStore = self # don't fall out of cache as long as the
# store is alive!
return s
def createStore(self, debug):
"""
Create the actual Store this Substore represents.
"""
if self.storepath is None:
self.store._memorySubstores.append(self) # don't fall out of cache
if self.store.filesdir is None:
filesdir = None
else:
filesdir = (self.store.filesdir.child("_substore_files")
.child(str(self.storeID))
.path)
return Store(parent=self.store,
filesdir=filesdir,
idInParent=self.storeID,
debug=debug)
else:
return Store(self.storepath.path,
parent=self.store,
idInParent=self.storeID,
debug=debug)
def __conform__(self, interface):
"""
I adapt my store object to whatever interface I am adapted to. This
allows for avatar adaptation in L{axiom.userbase} to work properly
without having to know explicitly that all 'avatars' objects are
SubStore instances, since it is valid to have non-SubStore avatars,
which are simply adaptable to the cred interfaces they represent.
"""
ifa = interface(self.open(debug=self.store.debug), None)
return ifa
def indirect(self, interface):
"""
Like __conform__, I adapt my store to whatever interface I am asked to
produce a powerup for. This allows for app stores to be installed as
powerups for their site stores directly, rather than having an
additional item type for each interface that we might wish to adapt to.
"""
return interface(self)
class SubStoreStartupService(Item, service.Service):
"""
This class no longer exists. It is here simply to trigger an upgrade which
deletes it. Ignore it, please.
"""
installedOn = reference()
parent = inmemory()
running = inmemory()
name = inmemory()
schemaVersion = 2
def eliminateSubStoreStartupService(subservice):
subservice.deleteFromStore()
return None
registerUpgrader(eliminateSubStoreStartupService, SubStoreStartupService.typeName, 1, 2)
|