mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
// Copyright 2016 The Xorm Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package xorm
 | 
						|
 | 
						|
// Begin a transaction
 | 
						|
func (session *Session) Begin() error {
 | 
						|
	if session.isAutoCommit {
 | 
						|
		tx, err := session.DB().BeginTx(session.ctx, nil)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		session.isAutoCommit = false
 | 
						|
		session.isCommitedOrRollbacked = false
 | 
						|
		session.tx = tx
 | 
						|
 | 
						|
		session.saveLastSQL("BEGIN TRANSACTION")
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Rollback When using transaction, you can rollback if any error
 | 
						|
func (session *Session) Rollback() error {
 | 
						|
	if !session.isAutoCommit && !session.isCommitedOrRollbacked {
 | 
						|
		session.saveLastSQL("ROLL BACK")
 | 
						|
		session.isCommitedOrRollbacked = true
 | 
						|
		session.isAutoCommit = true
 | 
						|
 | 
						|
		return session.tx.Rollback()
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Commit When using transaction, Commit will commit all operations.
 | 
						|
func (session *Session) Commit() error {
 | 
						|
	if !session.isAutoCommit && !session.isCommitedOrRollbacked {
 | 
						|
		session.saveLastSQL("COMMIT")
 | 
						|
		session.isCommitedOrRollbacked = true
 | 
						|
		session.isAutoCommit = true
 | 
						|
 | 
						|
		if err := session.tx.Commit(); err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
 | 
						|
		// handle processors after tx committed
 | 
						|
		closureCallFunc := func(closuresPtr *[]func(interface{}), bean interface{}) {
 | 
						|
			if closuresPtr != nil {
 | 
						|
				for _, closure := range *closuresPtr {
 | 
						|
					closure(bean)
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		for bean, closuresPtr := range session.afterInsertBeans {
 | 
						|
			closureCallFunc(closuresPtr, bean)
 | 
						|
 | 
						|
			if processor, ok := interface{}(bean).(AfterInsertProcessor); ok {
 | 
						|
				processor.AfterInsert()
 | 
						|
			}
 | 
						|
		}
 | 
						|
		for bean, closuresPtr := range session.afterUpdateBeans {
 | 
						|
			closureCallFunc(closuresPtr, bean)
 | 
						|
 | 
						|
			if processor, ok := interface{}(bean).(AfterUpdateProcessor); ok {
 | 
						|
				processor.AfterUpdate()
 | 
						|
			}
 | 
						|
		}
 | 
						|
		for bean, closuresPtr := range session.afterDeleteBeans {
 | 
						|
			closureCallFunc(closuresPtr, bean)
 | 
						|
 | 
						|
			if processor, ok := interface{}(bean).(AfterDeleteProcessor); ok {
 | 
						|
				processor.AfterDelete()
 | 
						|
			}
 | 
						|
		}
 | 
						|
		cleanUpFunc := func(slices *map[interface{}]*[]func(interface{})) {
 | 
						|
			if len(*slices) > 0 {
 | 
						|
				*slices = make(map[interface{}]*[]func(interface{}), 0)
 | 
						|
			}
 | 
						|
		}
 | 
						|
		cleanUpFunc(&session.afterInsertBeans)
 | 
						|
		cleanUpFunc(&session.afterUpdateBeans)
 | 
						|
		cleanUpFunc(&session.afterDeleteBeans)
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 |