diff --git a/bricktracker/metadata.py b/bricktracker/metadata.py index 50132ec..1ae7b1a 100644 --- a/bricktracker/metadata.py +++ b/bricktracker/metadata.py @@ -182,7 +182,8 @@ class BrickMetadata(BrickRecord): /, *, json: Any | None = None, - state: Any | None = None + state: Any | None = None, + commit: bool = True ) -> Any: if state is None and json is not None: state = json.get('value', False) @@ -191,13 +192,22 @@ class BrickMetadata(BrickRecord): parameters['set_id'] = brickset.fields.id parameters['state'] = state - rows, _ = BrickSQL().execute_and_commit( - self.update_set_state_query, - parameters=parameters, - name=self.as_column(), - ) + if commit: + rows, _ = BrickSQL().execute_and_commit( + self.update_set_state_query, + parameters=parameters, + name=self.as_column(), + ) + else: + rows, _ = BrickSQL().execute( + self.update_set_state_query, + parameters=parameters, + defer=True, + name=self.as_column(), + ) - if rows != 1: + # When deferred, rows will be -1, so skip the check + if commit and rows != 1: raise DatabaseException('Could not update the {kind} state for set {set} ({id})'.format( kind=self.kind, set=brickset.fields.set, diff --git a/bricktracker/set.py b/bricktracker/set.py index cb67620..117da03 100644 --- a/bricktracker/set.py +++ b/bricktracker/set.py @@ -82,19 +82,19 @@ class BrickSet(RebrickableSet): # All operations are atomic - if anything fails, nothing is committed self.insert(commit=False) - # Save the owners + # Save the owners (deferred - will execute at final commit) owners: list[str] = list(data.get('owners', [])) for id in owners: owner = BrickSetOwnerList.get(id) - owner.update_set_state(self, state=True) + owner.update_set_state(self, state=True, commit=False) - # Save the tags + # Save the tags (deferred - will execute at final commit) tags: list[str] = list(data.get('tags', [])) for id in tags: tag = BrickSetTagList.get(id) - tag.update_set_state(self, state=True) + tag.update_set_state(self, state=True, commit=False) # Load the inventory if not BrickPartList.download(socket, self, refresh=refresh):