X-Git-Url: http://dolda2000.com/gitweb/?p=fulbank.git;a=blobdiff_plain;f=fulbank%2Fdata.py;fp=fulbank%2Fdata.py;h=ea73b8d8b7e06e572681b1c245c3e5f3d751b501;hp=36efe201cec3a95d97bc7eef912983dc5a53194e;hb=be69f65b9fdbb7944b3724cf0ba1e55b9ba66a3e;hpb=04ce2557a4ab1447a3e17b541afb15cb83ce8854 diff --git a/fulbank/data.py b/fulbank/data.py index 36efe20..ea73b8d 100644 --- a/fulbank/data.py +++ b/fulbank/data.py @@ -1,4 +1,4 @@ -import hashlib +import os, pwd, hashlib, pickle def _localname(type): mod = type.__module__ @@ -46,3 +46,63 @@ class transaction(object): def __repr__(self): return "#<%s %s: %r>" % (_localname(type(self)), self.value, self.message) + +class session(object): + def save(self, filename): + with open(filename, "wb") as fp: + pickle.dump(self, fp) + + @staticmethod + def load(filename): + with open(filename, "rb") as fp: + return pickle.load(fp) + +def getsessnam(name): + if name == "fsb": + from . import fsb + return fsb.session + raise ValueError("no such known session type: " + name) + +def _sesspath(name): + return os.path.join(pwd.getpwuid(os.getuid()).pw_dir, ".cache/fulbank", name) + +def defaultsess(): + ret = os.getenv("NETBANKSESS") + if ret: + return ret + return "master" + +def loadsess(name=None, default=FileNotFoundError): + if name is None: name = defaultsess() + path = _sesspath(name) + if not os.path.exists(path): + if default is FileNotFoundError: + raise FileNotFoundError(name) + return default + return session.load(path) + +def savesess(sess, name=None): + if name is None: name = defaultsess() + path = _sesspath(name) + if sess is not None: + sessdir = os.path.dirname(path) + if not os.path.isdir(sessdir): + os.makedirs(sessdir) + return sess.save(_sesspath(name)) + else: + if os.path.exists(path): + os.unlink(path) + +class savedsess(object): + def __init__(self, name=None): + if name is None: name = defaultsess() + self.name = name + self.sess = None + + def __enter__(self): + self.sess = loadsess(self.name) + return self.sess + + def __exit__(self): + savesess(self.sess, name) + self.sess = None