def write_version(self, version_uid: VersionUid, data: str, overwrite: Optional[bool] = False) -> None: key = version_uid.storage_object_to_path() metadata_key = key + self._META_SUFFIX if not overwrite: try: self._read_object(key) except FileNotFoundError: pass else: raise FileExistsError('Version {} already exists in storage.'.format(version_uid.v_string)) data_bytes = data.encode('utf-8') size = len(data_bytes) data_bytes, transforms_metadata = self._encapsulate(data_bytes) metadata, metadata_json = self._build_metadata( size=size, object_size=len(data_bytes), transforms_metadata=transforms_metadata) try: self._write_object(key, data_bytes) self._write_object(metadata_key, metadata_json) except: try: self._rm_object(key) self._rm_object(metadata_key) except FileNotFoundError: pass raise if self._consistency_check_writes: self._check_write(key=key, metadata_key=metadata_key, data_expected=data_bytes)
def test_version_uid_to_key(self): for i in range(100): version_uid = VersionUid('v{}'.format( random.randint(1, pow(2, 32) - 1))) key = version_uid.storage_object_to_path() version_uid_2 = VersionUid.storage_path_to_object(key) self.assertEqual(version_uid, version_uid_2)
def rm_version(self, version_uid: VersionUid) -> None: key = version_uid.storage_object_to_path() metadata_key = key + self._META_SUFFIX try: self._rm_object(key) finally: try: self._rm_object(metadata_key) except FileNotFoundError: pass
def read_version(self, version_uid: VersionUid) -> str: key = version_uid.storage_object_to_path() metadata_key = key + self._META_SUFFIX data = self._read_object(key) metadata_json = self._read_object(metadata_key) metadata = self._decode_metadata(metadata_json=metadata_json, key=key, data_length=len(data)) if self._TRANSFORMS_KEY in metadata: data = self._decapsulate(data, metadata[self._TRANSFORMS_KEY]) if len(data) != metadata[self._SIZE_KEY]: raise ValueError('Length mismatch of original data for object {}. Expected: {}, got: {}.'.format( key, metadata[self._SIZE_KEY], len(data))) return data.decode('utf-8')