Add rollback queue, like commit queue.
This commit is contained in:
parent
8c854f3b6a
commit
0a984117c5
2 changed files with 26 additions and 6 deletions
|
@ -1033,16 +1033,22 @@ class Photo(ObjectBase):
|
||||||
|
|
||||||
if new_path.normcase == old_path.normcase:
|
if new_path.normcase == old_path.normcase:
|
||||||
# If they are equivalent but differently cased, just rename.
|
# If they are equivalent but differently cased, just rename.
|
||||||
action = os.rename
|
self.photodb.on_commit_queue.append({
|
||||||
args = [old_path.absolute_path, new_path.absolute_path]
|
'action': os.rename,
|
||||||
|
'args': [old_path.absolute_path, new_path.absolute_path],
|
||||||
|
})
|
||||||
else:
|
else:
|
||||||
# Delete the original, leaving only the new copy / hardlink.
|
# Delete the original, leaving only the new copy / hardlink.
|
||||||
action = os.remove
|
self.photodb.on_commit_queue.append({
|
||||||
args = [old_path.absolute_path]
|
'action': os.remove,
|
||||||
|
'args': [old_path.absolute_path],
|
||||||
|
})
|
||||||
|
self.photodb.on_rollback_queue.append({
|
||||||
|
'action': os.remove,
|
||||||
|
'args': [new_path.absolute_path],
|
||||||
|
})
|
||||||
|
|
||||||
self._uncache()
|
self._uncache()
|
||||||
queue_action = {'action': action, 'args': args}
|
|
||||||
self.photodb.on_commit_queue.append(queue_action)
|
|
||||||
|
|
||||||
self.__reinit__()
|
self.__reinit__()
|
||||||
|
|
||||||
|
|
|
@ -671,6 +671,7 @@ class PDBSQLMixin:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.on_commit_queue = []
|
self.on_commit_queue = []
|
||||||
|
self.on_rollback_queue = []
|
||||||
self.savepoints = []
|
self.savepoints = []
|
||||||
|
|
||||||
def assert_table_exists(self, table):
|
def assert_table_exists(self, table):
|
||||||
|
@ -689,6 +690,7 @@ class PDBSQLMixin:
|
||||||
args = task.get('args', [])
|
args = task.get('args', [])
|
||||||
kwargs = task.get('kwargs', {})
|
kwargs = task.get('kwargs', {})
|
||||||
task['action'](*args, **kwargs)
|
task['action'](*args, **kwargs)
|
||||||
|
|
||||||
self.savepoints.clear()
|
self.savepoints.clear()
|
||||||
self.sql.commit()
|
self.sql.commit()
|
||||||
|
|
||||||
|
@ -739,6 +741,17 @@ class PDBSQLMixin:
|
||||||
self.log.debug('Nothing to roll back.')
|
self.log.debug('Nothing to roll back.')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
while len(self.on_rollback_queue) > 0:
|
||||||
|
task = self.on_rollback_queue.pop(-1)
|
||||||
|
if task == savepoint:
|
||||||
|
break
|
||||||
|
if isinstance(task, str):
|
||||||
|
# Intermediate savepoints.
|
||||||
|
continue
|
||||||
|
args = task.get('args', [])
|
||||||
|
kwargs = task.get('kwargs', {})
|
||||||
|
task['action'](*args, **kwargs)
|
||||||
|
|
||||||
if savepoint is not None:
|
if savepoint is not None:
|
||||||
self.log.debug('Rolling back to %s', savepoint)
|
self.log.debug('Rolling back to %s', savepoint)
|
||||||
self.sql_execute(f'ROLLBACK TO "{savepoint}"')
|
self.sql_execute(f'ROLLBACK TO "{savepoint}"')
|
||||||
|
@ -761,6 +774,7 @@ class PDBSQLMixin:
|
||||||
self.sql.execute(query)
|
self.sql.execute(query)
|
||||||
self.savepoints.append(savepoint_id)
|
self.savepoints.append(savepoint_id)
|
||||||
self.on_commit_queue.append(savepoint_id)
|
self.on_commit_queue.append(savepoint_id)
|
||||||
|
self.on_rollback_queue.append(savepoint_id)
|
||||||
return savepoint_id
|
return savepoint_id
|
||||||
|
|
||||||
def sql_delete(self, table, pairs):
|
def sql_delete(self, table, pairs):
|
||||||
|
|
Loading…
Reference in a new issue