123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- // Copyright 2015 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
- // BeforeInsertProcessor executed before an object is initially persisted to the database
- type BeforeInsertProcessor interface {
- BeforeInsert()
- }
- // BeforeUpdateProcessor executed before an object is updated
- type BeforeUpdateProcessor interface {
- BeforeUpdate()
- }
- // BeforeDeleteProcessor executed before an object is deleted
- type BeforeDeleteProcessor interface {
- BeforeDelete()
- }
- // BeforeSetProcessor executed before data set to the struct fields
- type BeforeSetProcessor interface {
- BeforeSet(string, Cell)
- }
- // AfterSetProcessor executed after data set to the struct fields
- type AfterSetProcessor interface {
- AfterSet(string, Cell)
- }
- // AfterInsertProcessor executed after an object is persisted to the database
- type AfterInsertProcessor interface {
- AfterInsert()
- }
- // AfterUpdateProcessor executed after an object has been updated
- type AfterUpdateProcessor interface {
- AfterUpdate()
- }
- // AfterDeleteProcessor executed after an object has been deleted
- type AfterDeleteProcessor interface {
- AfterDelete()
- }
- // AfterLoadProcessor executed after an ojbect has been loaded from database
- type AfterLoadProcessor interface {
- AfterLoad()
- }
- // AfterLoadSessionProcessor executed after an ojbect has been loaded from database with session parameter
- type AfterLoadSessionProcessor interface {
- AfterLoad(*Session)
- }
- type executedProcessorFunc func(*Session, interface{}) error
- type executedProcessor struct {
- fun executedProcessorFunc
- session *Session
- bean interface{}
- }
- func (executor *executedProcessor) execute() error {
- return executor.fun(executor.session, executor.bean)
- }
- func (session *Session) executeProcessors() error {
- processors := session.afterProcessors
- session.afterProcessors = make([]executedProcessor, 0)
- for _, processor := range processors {
- if err := processor.execute(); err != nil {
- return err
- }
- }
- return nil
- }
- func cleanupProcessorsClosures(slices *[]func(interface{})) {
- if len(*slices) > 0 {
- *slices = make([]func(interface{}), 0)
- }
- }
- func executeBeforeClosures(session *Session, bean interface{}) {
- // handle before delete processors
- for _, closure := range session.beforeClosures {
- closure(bean)
- }
- cleanupProcessorsClosures(&session.beforeClosures)
- }
- func executeBeforeSet(bean interface{}, fields []string, scanResults []interface{}) {
- if b, hasBeforeSet := bean.(BeforeSetProcessor); hasBeforeSet {
- for ii, key := range fields {
- b.BeforeSet(key, Cell(scanResults[ii].(*interface{})))
- }
- }
- }
- func executeAfterSet(bean interface{}, fields []string, scanResults []interface{}) {
- if b, hasAfterSet := bean.(AfterSetProcessor); hasAfterSet {
- for ii, key := range fields {
- b.AfterSet(key, Cell(scanResults[ii].(*interface{})))
- }
- }
- }
- func buildAfterProcessors(session *Session, bean interface{}) {
- // handle afterClosures
- for _, closure := range session.afterClosures {
- session.afterProcessors = append(session.afterProcessors, executedProcessor{
- fun: func(sess *Session, bean interface{}) error {
- closure(bean)
- return nil
- },
- session: session,
- bean: bean,
- })
- }
- if a, has := bean.(AfterLoadProcessor); has {
- session.afterProcessors = append(session.afterProcessors, executedProcessor{
- fun: func(sess *Session, bean interface{}) error {
- a.AfterLoad()
- return nil
- },
- session: session,
- bean: bean,
- })
- }
- if a, has := bean.(AfterLoadSessionProcessor); has {
- session.afterProcessors = append(session.afterProcessors, executedProcessor{
- fun: func(sess *Session, bean interface{}) error {
- a.AfterLoad(sess)
- return nil
- },
- session: session,
- bean: bean,
- })
- }
- }
|