tools/metadata_wrapper.py (62 lines of code) (raw):

from abc import ABCMeta, abstractproperty from six import with_metaclass class UpdatingMetadataWrapperBase(with_metaclass(ABCMeta, object)): @abstractproperty def _wrapped(self): pass def __getattr__(self, name): return getattr(self._wrapped, name) def __getitem__(self, idx): return self._wrapped[idx] class UpdatingTableMetadataWrapper(UpdatingMetadataWrapperBase): """ A class that provides an interface to a table's metadata that is refreshed on access. """ def __init__(self, cluster, ks_name, table_name, max_schema_agreement_wait=None): self._cluster = cluster self._ks_name = ks_name self._table_name = table_name self.max_schema_agreement_wait = max_schema_agreement_wait @property def _wrapped(self): self._cluster.refresh_table_metadata( self._ks_name, self._table_name, max_schema_agreement_wait=self.max_schema_agreement_wait ) return self._cluster.metadata.keyspaces[self._ks_name].tables[self._table_name] def __repr__(self): return '{cls_name}(cluster={cluster}, ks_name={ks_name}, table_name={table_name}, max_schema_agreement_wait={max_wait})'.format( cls_name=self.__class__.__name__, cluster=repr(self._cluster), ks_name=self._ks_name, table_name=self._table_name, max_wait=self.max_schema_agreement_wait) class UpdatingKeyspaceMetadataWrapper(UpdatingMetadataWrapperBase): """ A class that provides an interface to a keyspace's metadata that is refreshed on access. """ def __init__(self, cluster, ks_name, max_schema_agreement_wait=None): self._cluster = cluster self._ks_name = ks_name self.max_schema_agreement_wait = max_schema_agreement_wait @property def _wrapped(self): self._cluster.refresh_keyspace_metadata( self._ks_name, max_schema_agreement_wait=self.max_schema_agreement_wait ) return self._cluster.metadata.keyspaces[self._ks_name] def __repr__(self): return '{cls_name}(cluster={cluster}, ks_name={ks_name}, max_schema_agreement_wait={max_wait})'.format( cls_name=self.__class__.__name__, cluster=repr(self._cluster), ks_name=self._ks_name, max_wait=self.max_schema_agreement_wait) class UpdatingClusterMetadataWrapper(UpdatingMetadataWrapperBase): """ A class that provides an interface to a cluster's metadata that is refreshed on access. """ def __init__(self, cluster, max_schema_agreement_wait=None): """ @param cluster The cassandra.cluster.Cluster object to wrap. """ self._cluster = cluster self.max_schema_agreement_wait = max_schema_agreement_wait @property def _wrapped(self): self._cluster.refresh_schema_metadata(max_schema_agreement_wait=self.max_schema_agreement_wait) return self._cluster.metadata def __repr__(self): return '{cls_name}(cluster={cluster}, max_schema_agreement_wait={max_wait})'.format( cls_name=self.__class__.__name__, cluster=repr(self._cluster), max_wait=self.max_schema_agreement_wait)