diff options
author | Lars Wirzenius <liw@liw.fi> | 2015-08-19 15:36:58 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2015-08-19 16:18:05 +0200 |
commit | ecc2d0b97adb395f0312a6862d74329e6fb111b6 (patch) | |
tree | 5d8f5cd8b8210712ab20989ae95386a4db501059 | |
parent | 80005417e68b91454927928107f2490e68a2467e (diff) | |
download | obnam-ecc2d0b97adb395f0312a6862d74329e6fb111b6.tar.gz |
Add set_file_keys_from_metadata to interface
-rw-r--r-- | obnamlib/delegator.py | 6 | ||||
-rw-r--r-- | obnamlib/fmt_ga/client.py | 34 | ||||
-rw-r--r-- | obnamlib/plugins/backup_plugin.py | 27 | ||||
-rw-r--r-- | obnamlib/repo_interface.py | 35 |
4 files changed, 77 insertions, 25 deletions
diff --git a/obnamlib/delegator.py b/obnamlib/delegator.py index 68e932b8..e477d706 100644 --- a/obnamlib/delegator.py +++ b/obnamlib/delegator.py @@ -240,6 +240,12 @@ class RepositoryDelegator(obnamlib.RepositoryInterface): return client.set_file_key( generation_id.gen_number, filename, key, value) + def set_file_keys_from_metadata(self, generation_id, filename, metadata): + self._require_got_client_lock(generation_id.client_name) + client = self._lookup_client_by_generation(generation_id) + return client.set_file_keys_from_metadata( + generation_id.gen_number, filename, metadata) + def get_file_chunk_ids(self, generation_id, filename): client = self._lookup_client_by_generation(generation_id) return client.get_file_chunk_ids(generation_id.gen_number, filename) diff --git a/obnamlib/fmt_ga/client.py b/obnamlib/fmt_ga/client.py index 57b77e54..015b48d8 100644 --- a/obnamlib/fmt_ga/client.py +++ b/obnamlib/fmt_ga/client.py @@ -272,6 +272,40 @@ class GAClient(object): genspec=gen_number, filename=filename) + def set_file_keys_from_metadata(self, gen_number, filename, file_metadata): + self._load_data() + + generation = self._lookup_generation_by_gen_number(gen_number) + metadata = generation.get_file_metadata() + + mapping = [ + (obnamlib.REPO_FILE_MODE, 'st_mode'), + (obnamlib.REPO_FILE_MTIME_SEC, 'st_mtime_sec'), + (obnamlib.REPO_FILE_MTIME_NSEC, 'st_mtime_nsec'), + (obnamlib.REPO_FILE_ATIME_SEC, 'st_atime_sec'), + (obnamlib.REPO_FILE_ATIME_NSEC, 'st_atime_nsec'), + (obnamlib.REPO_FILE_NLINK, 'st_nlink'), + (obnamlib.REPO_FILE_SIZE, 'st_size'), + (obnamlib.REPO_FILE_UID, 'st_uid'), + (obnamlib.REPO_FILE_USERNAME, 'username'), + (obnamlib.REPO_FILE_GID, 'st_gid'), + (obnamlib.REPO_FILE_GROUPNAME, 'groupname'), + (obnamlib.REPO_FILE_SYMLINK_TARGET, 'target'), + (obnamlib.REPO_FILE_XATTR_BLOB, 'xattr'), + (obnamlib.REPO_FILE_BLOCKS, 'st_blocks'), + (obnamlib.REPO_FILE_DEV, 'st_dev'), + (obnamlib.REPO_FILE_INO, 'st_ino'), + (obnamlib.REPO_FILE_MD5, 'md5'), + ] + + for key, field in mapping: + value = getattr(file_metadata, field) + if not metadata.set_file_key(filename, key, value): + raise obnamlib.RepositoryFileDoesNotExistInGeneration( + client_name=self._client_name, + genspec=gen_number, + filename=filename) + def get_file_chunk_ids(self, gen_number, filename): self._load_data() self._require_file_exists(gen_number, filename) diff --git a/obnamlib/plugins/backup_plugin.py b/obnamlib/plugins/backup_plugin.py index 1598a830..15dcf21f 100644 --- a/obnamlib/plugins/backup_plugin.py +++ b/obnamlib/plugins/backup_plugin.py @@ -828,31 +828,8 @@ class BackupPlugin(obnamlib.ObnamPlugin): def add_file_to_generation(self, filename, metadata): self.repo.add_file(self.new_generation, filename) - - things = [ - ('st_mtime_sec', obnamlib.REPO_FILE_MTIME_SEC), - ('st_mtime_nsec', obnamlib.REPO_FILE_MTIME_NSEC), - ('st_atime_sec', obnamlib.REPO_FILE_ATIME_SEC), - ('st_atime_nsec', obnamlib.REPO_FILE_ATIME_NSEC), - ('st_mode', obnamlib.REPO_FILE_MODE), - ('st_nlink', obnamlib.REPO_FILE_NLINK), - ('st_size', obnamlib.REPO_FILE_SIZE), - ('st_uid', obnamlib.REPO_FILE_UID), - ('st_gid', obnamlib.REPO_FILE_GID), - ('st_blocks', obnamlib.REPO_FILE_BLOCKS), - ('st_dev', obnamlib.REPO_FILE_DEV), - ('st_ino', obnamlib.REPO_FILE_INO), - ('username', obnamlib.REPO_FILE_USERNAME), - ('groupname', obnamlib.REPO_FILE_GROUPNAME), - ('target', obnamlib.REPO_FILE_SYMLINK_TARGET), - ('xattr', obnamlib.REPO_FILE_XATTR_BLOB), - ('md5', obnamlib.REPO_FILE_MD5), - ] - - for field, key in things: - self.repo.set_file_key( - self.new_generation, filename, key, - getattr(metadata, field)) + self.repo.set_file_keys_from_metadata( + self.new_generation, filename, metadata) def backup_parents(self, root): '''Back up parents of root, non-recursively.''' diff --git a/obnamlib/repo_interface.py b/obnamlib/repo_interface.py index 7c00a0fe..d0d1521a 100644 --- a/obnamlib/repo_interface.py +++ b/obnamlib/repo_interface.py @@ -690,7 +690,42 @@ class RepositoryInterface(object): ''' raise NotImplementedError() + def set_file_keys_from_metadata(self, generation_id, filename, metadata): + '''Set all allowed file keys from obnamlib.Metadata. + + This is the same as calling set_file_key for each allowed key, + but hopefully faster. + + ''' + + mapping = [ + (REPO_FILE_MODE, 'st_mode'), + (REPO_FILE_MTIME_SEC, 'st_mtime_sec'), + (REPO_FILE_MTIME_NSEC, 'st_mtime_nsec'), + (REPO_FILE_ATIME_SEC, 'st_atime_sec'), + (REPO_FILE_ATIME_NSEC, 'st_atime_nsec'), + (REPO_FILE_NLINK, 'st_nlink'), + (REPO_FILE_SIZE, 'st_size'), + (REPO_FILE_UID, 'st_uid'), + (REPO_FILE_USERNAME, 'username'), + (REPO_FILE_GID, 'st_gid'), + (REPO_FILE_GROUPNAME, 'groupname'), + (REPO_FILE_SYMLINK_TARGET, 'target'), + (REPO_FILE_XATTR_BLOB, 'xattr'), + (REPO_FILE_BLOCKS, 'st_blocks'), + (REPO_FILE_DEV, 'st_dev'), + (REPO_FILE_INO, 'st_ino'), + (REPO_FILE_MD5, 'md5'), + ] + + allowed = set(self.get_allowed_file_keys()) + for key, field in mapping: + if key in allowed: + self.set_file_key( + generation_id, filename, key, getattr(metadata, field)) + def get_file_chunk_ids(self, generation_id, filename): + '''Get the list of chunk ids for a file.''' raise NotImplementedError() |