|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from pathlib import Path |
|
|
from typing import Union |
|
|
|
|
|
from .base import BaseStorageBackend |
|
|
|
|
|
|
|
|
class MemcachedBackend(BaseStorageBackend): |
|
|
"""Memcached storage backend. |
|
|
|
|
|
Attributes: |
|
|
server_list_cfg (str): Config file for memcached server list. |
|
|
client_cfg (str): Config file for memcached client. |
|
|
sys_path (str, optional): Additional path to be appended to `sys.path`. |
|
|
Defaults to None. |
|
|
""" |
|
|
|
|
|
def __init__(self, server_list_cfg, client_cfg, sys_path=None): |
|
|
if sys_path is not None: |
|
|
import sys |
|
|
sys.path.append(sys_path) |
|
|
try: |
|
|
import mc |
|
|
except ImportError: |
|
|
raise ImportError( |
|
|
'Please install memcached to enable MemcachedBackend.') |
|
|
|
|
|
self.server_list_cfg = server_list_cfg |
|
|
self.client_cfg = client_cfg |
|
|
self._client = mc.MemcachedClient.GetInstance(self.server_list_cfg, |
|
|
self.client_cfg) |
|
|
|
|
|
self._mc_buffer = mc.pyvector() |
|
|
|
|
|
def get(self, filepath: Union[str, Path]): |
|
|
"""Get values according to the filepath. |
|
|
|
|
|
Args: |
|
|
filepath (str or Path): Path to read data. |
|
|
|
|
|
Returns: |
|
|
bytes: Expected bytes object. |
|
|
|
|
|
Examples: |
|
|
>>> server_list_cfg = '/path/of/server_list.conf' |
|
|
>>> client_cfg = '/path/of/mc.conf' |
|
|
>>> backend = MemcachedBackend(server_list_cfg, client_cfg) |
|
|
>>> backend.get('/path/of/file') |
|
|
b'hello world' |
|
|
""" |
|
|
filepath = str(filepath) |
|
|
import mc |
|
|
self._client.Get(filepath, self._mc_buffer) |
|
|
value_buf = mc.ConvertBuffer(self._mc_buffer) |
|
|
return value_buf |
|
|
|
|
|
def get_text(self, filepath, encoding=None): |
|
|
raise NotImplementedError |
|
|
|