PhotoDB.rollback without savepoint should roll all, like real sql.
In sqlite3, rollback without a savepoint undoes the entire pending transaction stack, whereas I was just popping the last save. This change makes it match real sqlite. Also the only current call for rollback is in the @transaction decorator which is already explicit.
This commit is contained in:
		
							parent
							
								
									9e0051ca9c
								
							
						
					
					
						commit
						e7c90faf79
					
				
					 1 changed files with 19 additions and 19 deletions
				
			
		|  | @ -715,27 +715,27 @@ class PDBSQLMixin: | |||
|         savepoint was created. Keep in mind that a @transaction savepoint is | ||||
|         always created *before* the method actually does anything. | ||||
| 
 | ||||
|         If no savepoint is provided then just roll back the most recent save. | ||||
|         If no savepoint is provided then rollback the entire transaction. | ||||
|         ''' | ||||
|         if savepoint is None: | ||||
|             try: | ||||
|                 savepoint = self.savepoints.pop(-1) | ||||
|             except IndexError: | ||||
|                 self.log.debug('Nothing to roll back.') | ||||
|                 return | ||||
|         else: | ||||
|             try: | ||||
|                 # Will reassign after everything goes well. | ||||
|                 _savepoints = helpers.slice_before(self.savepoints, savepoint) | ||||
|             except ValueError: | ||||
|                 self.log.warn('Tried to restore nonexistent savepoint %s.', savepoint) | ||||
|                 return | ||||
|         if savepoint is not None and savepoint not in self.savepoints: | ||||
|             self.log.warn('Tried to restore nonexistent savepoint %s.', savepoint) | ||||
|             return | ||||
| 
 | ||||
|         self.log.debug('Rolling back to %s', savepoint) | ||||
|         query = f'ROLLBACK TO "{savepoint}"' | ||||
|         self.sql_execute(query) | ||||
|         self.savepoints = _savepoints | ||||
|         self.on_commit_queue = helpers.slice_before(self.on_commit_queue, savepoint) | ||||
|         if len(self.savepoints) == 0: | ||||
|             self.log.debug('Nothing to roll back.') | ||||
|             return | ||||
| 
 | ||||
|         if savepoint is not None: | ||||
|             self.log.debug('Rolling back to %s', savepoint) | ||||
|             self.sql_execute(f'ROLLBACK TO "{savepoint}"') | ||||
|             self.savepoints = helpers.slice_before(self.savepoints, savepoint) | ||||
|             self.on_commit_queue = helpers.slice_before(self.on_commit_queue, savepoint) | ||||
| 
 | ||||
|         else: | ||||
|             self.log.debug('Rolling back.') | ||||
|             self.sql_execute('ROLLBACK') | ||||
|             self.savepoints = [] | ||||
|             self.on_commit_queue = [] | ||||
| 
 | ||||
|     def savepoint(self, message=None): | ||||
|         savepoint_id = helpers.random_hex(length=16) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue