cupid/io/kvstore.py (38 lines of code) (raw):

# Copyright 1999-2022 Alibaba Group Holding Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import warnings from odps.compat import six from ..rpc import SandboxRpcChannel, CupidRpcController from ..errors import CupidError try: from ..proto import kv_store_service_pb2 as kv_pb except TypeError: warnings.warn('Cannot import protos from pycupid: ' 'consider upgrading your protobuf python package.', ImportWarning) raise ImportError class CupidKVStore(object): def __init__(self): self.channel = SandboxRpcChannel() self.stub = kv_pb.KVStoreService_Stub(self.channel) def __setitem__(self, key, value): if isinstance(value, six.text_type): value = value.encode() controller = CupidRpcController() req = kv_pb.PutRequest(key=key, value=value) self.stub.Put(controller, req, None) if controller.Failed(): raise CupidError(controller.ErrorText()) def __getitem__(self, item): controller = CupidRpcController() req = kv_pb.GetRequest(value=item) resp = self.stub.Get(controller, req, None) if controller.Failed(): err_text = controller.ErrorText() if 'PANGU_FILE_NOT_FOUND' in err_text: raise KeyError(err_text) else: raise CupidError(err_text) return resp.value def get(self, item, default=None): try: return self[item] except KeyError: return default