X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;ds=sidebyside;f=python%2Fcumulus%2Fstore%2F__init__.py;h=7150a1fae5afa7af03e4aa8b13385b68761f32f4;hb=179ae0cb9dc0cdb56217f517bd3dab62b0b3376c;hp=5ebf0d79e30a20a7c7e4b9a6b7cded6ae2014481;hpb=8bff41ddef78fa851b09d141c93bdf387abc1dee;p=cumulus.git diff --git a/python/cumulus/store/__init__.py b/python/cumulus/store/__init__.py index 5ebf0d7..7150a1f 100644 --- a/python/cumulus/store/__init__.py +++ b/python/cumulus/store/__init__.py @@ -1,4 +1,4 @@ -import re +import exceptions, re, urlparse type_patterns = { 'checksums': re.compile(r"^snapshot-(.*)\.(\w+)sums$"), @@ -6,17 +6,69 @@ type_patterns = { 'snapshots': re.compile(r"^snapshot-(.*)\.lbs$") } -class Store: +class NotFoundError(exceptions.KeyError): + """Exception thrown when a file is not found in a repository.""" + + pass + +class Store (object): """Base class for all cumulus storage backends.""" + def __new__ (cls, url, **kw): + """ Return the correct sub-class depending on url, + pass parsed url parameters to object + """ + if cls != Store: + return super(Store, cls).__new__(cls, url, **kw) + (scheme, netloc, path, params, query, fragment) \ + = urlparse.urlparse(url) + + try: + cumulus = __import__('cumulus.store.%s' % scheme, globals()) + subcls = getattr (cumulus.store, scheme).Store + obj = super(Store, cls).__new__(subcls, url, **kw) + obj.scheme = scheme + obj.netloc = netloc + obj.path = path + obj.params = params + obj.query = query + obj.fragment = fragment + return obj + except ImportError: + raise NotImplementedError, "Scheme %s not implemented" % scheme + def list(self, type): - raise NotImplementedException + raise NotImplementedError def get(self, type, name): - raise NotImplementedException + raise NotImplementedError def put(self, type, name, fp): - raise NotImplementedException + raise NotImplementedError def delete(self, type, name): - raise NotImplementedException + raise NotImplementedError + + def stat(self, type, name): + raise NotImplementedError + + def scan(self): + """Cache file information stored in this backend. + + This might make subsequent list or stat calls more efficient, but this + function is intended purely as a performance optimization.""" + + pass + + def close(self): + """Tear down the connection explicitly if needed + + Currently needed for sftp to be able to end the program.""" + + pass + + def __del__(self): + self.close() + +def open(url): + return Store(url)