session.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package sqlstore
  2. import (
  3. "context"
  4. "reflect"
  5. "github.com/go-xorm/xorm"
  6. )
  7. type DBSession struct {
  8. *xorm.Session
  9. events []interface{}
  10. }
  11. type dbTransactionFunc func(sess *DBSession) error
  12. func (sess *DBSession) publishAfterCommit(msg interface{}) {
  13. sess.events = append(sess.events, msg)
  14. }
  15. func newSession() *DBSession {
  16. return &DBSession{Session: x.NewSession()}
  17. }
  18. func startSession(ctx context.Context) *DBSession {
  19. value := ctx.Value(ContextSessionName)
  20. var sess *DBSession
  21. sess, ok := value.(*DBSession)
  22. if !ok {
  23. newSess := newSession()
  24. return newSess
  25. }
  26. return sess
  27. }
  28. func withDbSession(ctx context.Context, callback dbTransactionFunc) error {
  29. sess := startSession(ctx)
  30. return callback(sess)
  31. }
  32. func (sess *DBSession) InsertId(bean interface{}) (int64, error) {
  33. table := sess.DB().Mapper.Obj2Table(getTypeName(bean))
  34. dialect.PreInsertId(table, sess.Session)
  35. id, err := sess.Session.InsertOne(bean)
  36. dialect.PostInsertId(table, sess.Session)
  37. return id, err
  38. }
  39. func getTypeName(bean interface{}) (res string) {
  40. t := reflect.TypeOf(bean)
  41. for t.Kind() == reflect.Ptr {
  42. t = t.Elem()
  43. }
  44. return t.Name()
  45. }