import tempfile, sqlobject
class SubscriptableGenerator(object):
class Data(sqlobject.SQLObject):
data = sqlobject.PickleCol()
def __init__(self, sqlite=None):
if not sqlite:
sqlite = tempfile.mkstemp('.db', 'subGenCache-')[1]
self.sqlite = sqlite
uri = "sqlite://%s" % sqlite
c = sqlobject.connectionForURI(uri)
sqlobject.sqlhub.processConnection = c
SubscriptableGenerator.Data.createTable(ifNotExists=True)
self._genCounter = 1
def __iter__(self):
return self
def next(self):
try:
ret = SubscriptableGenerator.Data.get(self._genCounter).data
except:
try:
ret = self.gen()
SubscriptableGenerator.Data(data=ret)
except StopIteration:
raise StopIteration
self._genCounter += 1
return ret
def _getFromCache(self, i):
try:
ret = SubscriptableGenerator.Data.get(i+1).data
except:
ret = self.gen()
SubscriptableGenerator.Data(id=i+1, data=ret)
#self._genCounter += 1
return ret
def __getitem__(self, k):
if isinstance(k, slice):
[self._getFromCache(i) for i in xrange(0, k.start)]
return [self._getFromCache(i) for i in xrange(k.start, k.stop, 1 if k.start < k.stop else -1)]
else:
return self._getFromCache(k)
# irreversible without a flush due to the fact that
# the generator isn't called unless the _cache[k] is undefined
def __setitem__(self, k, v):
val = SubscriptableGenerator.Data.get(k+1)
val.data = v
def gen(self):
raise NotImplementedError