blob: 6caf3ce282ba70b8f82341858f7d8ff41809029b [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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 attr
from pyignite.api.tx_api import get_tx_id
from pyignite.connection.protocol_context import ProtocolContext
from pyignite.constants import PROTOCOL_BYTE_ORDER
from pyignite.datatypes import ExpiryPolicy
from pyignite.exceptions import NotSupportedByClusterError
@attr.s
class CacheInfo:
cache_id = attr.ib(kw_only=True, type=int, default=0)
expiry_policy = attr.ib(kw_only=True, type=ExpiryPolicy, default=None)
protocol_context = attr.ib(kw_only=True, type=ProtocolContext)
TRANSACTIONS_MASK = 0x02
EXPIRY_POLICY_MASK = 0x04
@classmethod
async def from_python_async(cls, stream, value):
return cls.from_python(stream, value)
@classmethod
def from_python(cls, stream, value):
cache_id = value.cache_id if value else 0
expiry_policy = value.expiry_policy if value else None
flags = 0
stream.write(cache_id.to_bytes(4, byteorder=PROTOCOL_BYTE_ORDER, signed=True))
if expiry_policy:
if not value.protocol_context.is_expiry_policy_supported():
raise NotSupportedByClusterError("'ExpiryPolicy' API is not supported by the cluster")
flags |= cls.EXPIRY_POLICY_MASK
tx_id = get_tx_id()
if value.protocol_context.is_transactions_supported() and tx_id:
flags |= cls.TRANSACTIONS_MASK
stream.write(flags.to_bytes(1, byteorder=PROTOCOL_BYTE_ORDER))
if expiry_policy:
ExpiryPolicy.write_policy(stream, expiry_policy)
if flags & cls.TRANSACTIONS_MASK:
stream.write(tx_id.to_bytes(4, byteorder=PROTOCOL_BYTE_ORDER, signed=True))