Example #1
0
File: bucket.py Project: NoZip/uzu
    def __init__(self, server, name, port):
        self._server = server
        self.name = name
        self._port = port

        self._memcached_client = Memcached(self._server._host, self._port)

        self._cache = {}
Example #2
0
File: bucket.py Project: NoZip/uzu
class Bucket(Driver):
    """
    Couchbase Bucket
    """

    def __init__(self, server, name, port):
        self._server = server
        self.name = name
        self._port = port

        self._memcached_client = Memcached(self._server._host, self._port)

        self._cache = {}

    @coroutine
    def load(self, key, schema, refresh_cache=True):
        if key not in self._cache:
            response = yield self._memcached_client.get(key)
            doc = json.loads(response.value.decode())

            data = {}
            for name, value in doc.items():
                data[name] = decode_field(value, schema.fields[name])

            entry = schema(data)
            entry.meta = Meta(key, response.header.cas)

            self._cache[key] = entry

        elif refresh_cache:
            yield self._cache[key].reload()

        return self._cache[key]

    @coroutine
    def reload(self, entry):
        response = yield self._memcached_client.get(entry.key)
        doc = json.loads(response.value.decode())

        data = {}
        for name, value in doc.items():
            data[name] = decode_field(value, entry.fields[name])

        entry.update(data)
        entry.meta.cas = response.header.cas

    @coroutine
    def store(self, entry):
        meta = getattr(entry, "meta", None)
        doc = {
            name: encode_field(value, entry.fields[name])
            for name, value in entry.items()
        }

        doc = json.dumps(doc)

        if meta:
            # Update the document in database
            response = yield self._memcached_client.replace(meta.key, doc, entry.meta.cas)
            entry.meta.cas = response.header.cas
        else:
            # Create the document in database
            key = uuid4().hex
            response = yield self._memcached_client.add(key, doc)
            entry.meta = Meta(key, response.header.cas)
            self._cache[key] = entry

    @coroutine
    def remove(self, entry):
        response = yield self._memcached_client.delete(entry.key)
        del self._cache[entry.key]
        del entry.meta

    def design(self, name):
        return Design(self, name)