# --- datamodel.py --- from os.path import join import shelve class Loader: PATH = '/tmp/persistent/pso/sessions/members1.psod' db = shelve.open(PATH) def load(self, id): return self.db[id] def save(self, id, obj): self.db[id] = obj self.db.sync() def fetch(self, line=0, pageSize=None): if pageSize is None: pageSize = len(self.db) all = self.db.items() all.sort() return [record for id, record in all[line:line+pageSize]] class Member(dict): IDKEY='memberId' LOADER = Loader() def load(classObj, id, loader=None): if loader is None: loader = classObj.LOADER try: return loader.load(id) except KeyError: return load = classmethod(load) def __init__(self, **kwa): dict.__init__(self, kwa) def save(self, loader = None): if loader is None: loader = self.LOADER loader.save(self[self.IDKEY], self) if __name__ =='__main__': import sys cmd = sys.argv[1] if cmd == 'test': class LocalLoader(Loader): PATH = 'members.psod' class LocalMember(Member): LOADER= LocalLoader() member = LocalMember.load(id) if member is None: print 'creating new member', member = LocalMember(memberId=id) print member member['name']= 'Bond' member.save() secondComming = LocalMember.load(id) print secondComming for id in range(100): idstr = "%04d" % id LocalMember(memberId=idstr).save() print LocalMember.LOADER.fetch(line=7, pageSize=13) elif cmd =='list': print Member.LOADER.PATH print Member.LOADER.fetch()