shared.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package sqlstore
  2. import (
  3. "github.com/go-xorm/xorm"
  4. "github.com/grafana/grafana/pkg/bus"
  5. "github.com/grafana/grafana/pkg/log"
  6. )
  7. type dbTransactionFunc func(sess *xorm.Session) error
  8. type dbTransactionFunc2 func(sess *session) error
  9. type session struct {
  10. *xorm.Session
  11. events []interface{}
  12. }
  13. func (sess *session) publishAfterCommit(msg interface{}) {
  14. sess.events = append(sess.events, msg)
  15. }
  16. func inTransaction(callback dbTransactionFunc) error {
  17. var err error
  18. sess := x.NewSession()
  19. defer sess.Close()
  20. if err = sess.Begin(); err != nil {
  21. return err
  22. }
  23. err = callback(sess)
  24. if err != nil {
  25. sess.Rollback()
  26. return err
  27. } else if err = sess.Commit(); err != nil {
  28. return err
  29. }
  30. return nil
  31. }
  32. func inTransaction2(callback dbTransactionFunc2) error {
  33. var err error
  34. sess := session{Session: x.NewSession()}
  35. defer sess.Close()
  36. if err = sess.Begin(); err != nil {
  37. return err
  38. }
  39. err = callback(&sess)
  40. if err != nil {
  41. sess.Rollback()
  42. return err
  43. } else if err = sess.Commit(); err != nil {
  44. return err
  45. }
  46. if len(sess.events) > 0 {
  47. for _, e := range sess.events {
  48. if err = bus.Publish(e); err != nil {
  49. log.Error(3, "Failed to publish event after commit", err)
  50. }
  51. }
  52. }
  53. return nil
  54. }