Skip to content

Commit 57c592e

Browse files
committed
use a lighter task for suggesting file path in backup/fileset
1 parent a54b311 commit 57c592e

4 files changed

Lines changed: 51 additions & 6 deletions

File tree

prime_backup/action/get_file_action.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,17 @@ def run(self) -> Dict[str, FileInfo]:
6767
return {file.path: FileInfo.of(file) for file in files}
6868

6969

70+
class GetBackupFilePathsAction(Action[List[str]]):
71+
def __init__(self, backup_id: int):
72+
super().__init__()
73+
self.backup_id = backup_id
74+
75+
@override
76+
def run(self) -> List[str]:
77+
with DbAccess.open_session() as session:
78+
return session.get_backup_file_paths(self.backup_id)
79+
80+
7081
class GetFilesetFileAction(_GetSingleFileActionBase):
7182
def __init__(self, fileset_id: int, file_path: PathLike, *, count_backups: bool = False, sample_backup_num: Optional[int] = None):
7283
super().__init__(count_backups=count_backups, sample_backup_num=sample_backup_num)
@@ -91,6 +102,17 @@ def run(self) -> Dict[str, FileInfo]:
91102
return {file.path: FileInfo.of(file) for file in files}
92103

93104

105+
class GetFilesetFilePathsAction(Action[List[str]]):
106+
def __init__(self, fileset_id: int):
107+
super().__init__()
108+
self.fileset_id = fileset_id
109+
110+
@override
111+
def run(self) -> List[str]:
112+
with DbAccess.open_session() as session:
113+
return session.get_fileset_file_paths(self.fileset_id)
114+
115+
94116
class NotDirectoryError(PrimeBackupError):
95117
pass
96118

prime_backup/db/session.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,21 @@ def get_fileset_files(self, fileset_id: Optional[int]) -> List[schema.File]:
538538
where(schema.File.fileset_id == fileset_id)
539539
).scalars().all())
540540

541+
def get_fileset_file_paths(self, fileset_id: int) -> List[str]:
542+
return _list_it(self.session.execute(
543+
select(schema.File.path).
544+
where(schema.File.fileset_id == fileset_id)
545+
).scalars().all())
546+
547+
def get_fileset_file_path_and_role(self, fileset_id: int) -> Dict[str, int]:
548+
return {
549+
row.path: row.role
550+
for row in self.session.execute(
551+
select(schema.File.path, schema.File.role).
552+
where(schema.File.fileset_id == fileset_id)
553+
)
554+
}
555+
541556
def get_fileset_ids_by_blob_hashes(self, hashes: List[str]) -> List[int]:
542557
fileset_ids = set()
543558
for v_hashes in collection_utils.slicing_iterate(hashes, self.__safe_var_limit):
@@ -775,6 +790,16 @@ def get_backup_files(self, backup_or_backup_id: Union[int, schema.Backup]) -> Li
775790
files_delta = self.get_fileset_files(backup.fileset_id_delta)
776791
return self.merge_fileset_files(files_base, files_delta)
777792

793+
def get_backup_file_paths(self, backup_or_backup_id: Union[int, schema.Backup]) -> List[str]:
794+
backup = self.__convert_backup_or_backup_id_to_backup(backup_or_backup_id)
795+
file_paths: Dict[str, None] = dict.fromkeys(self.get_fileset_file_paths(backup.fileset_id_base), None)
796+
for path, role in self.get_fileset_file_path_and_role(backup.fileset_id_delta).items():
797+
if role == FileRole.delta_add.value:
798+
file_paths[path] = None
799+
elif role == FileRole.delta_remove:
800+
file_paths.pop(path, None)
801+
return list(file_paths.keys())
802+
778803
def get_backups(self, backup_ids: List[int]) -> Dict[int, schema.Backup]:
779804
"""
780805
:return: a dict, backup id -> Backup. All given ids are in the dict

prime_backup/mcdr/task/db/get_backup_file_paths_task.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from mcdreforged.api.all import CommandSource
44
from typing_extensions import override
55

6-
from prime_backup.action.get_file_action import GetBackupFilesAction
6+
from prime_backup.action.get_file_action import GetBackupFilePathsAction
77
from prime_backup.mcdr.task.backup.transform_backup_id_task import TransformBackupIdTask
88
from prime_backup.mcdr.task.basic_task import LightTask
99

@@ -24,5 +24,4 @@ def run(self) -> List[str]:
2424
backup_id = self.backup_id
2525
else: # backup id raw argument
2626
backup_id = TransformBackupIdTask(self.source, [self.backup_id]).run()[0]
27-
file_dict = GetBackupFilesAction(backup_id).run()
28-
return list(file_dict.keys())
27+
return GetBackupFilePathsAction(backup_id).run()

prime_backup/mcdr/task/db/get_fileset_file_paths_task.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from mcdreforged.api.all import CommandSource
44
from typing_extensions import override
55

6-
from prime_backup.action.get_file_action import GetFilesetFilesAction
6+
from prime_backup.action.get_file_action import GetFilesetFilePathsAction
77
from prime_backup.mcdr.task.basic_task import LightTask
88

99

@@ -19,5 +19,4 @@ def id(self) -> str:
1919

2020
@override
2121
def run(self) -> List[str]:
22-
file_dict = GetFilesetFilesAction(self.fileset_id).run()
23-
return list(file_dict.keys())
22+
return GetFilesetFilePathsAction(self.fileset_id).run()

0 commit comments

Comments
 (0)