session.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. newSess.Begin()
  25. return newSess
  26. }
  27. return sess
  28. }
  29. func withDbSession(ctx context.Context, callback dbTransactionFunc) error {
  30. sess := startSession(ctx)
  31. return callback(sess)
  32. }
  33. func (sess *DBSession) InsertId(bean interface{}) (int64, error) {
  34. table := sess.DB().Mapper.Obj2Table(getTypeName(bean))
  35. dialect.PreInsertId(table, sess.Session)
  36. id, err := sess.Session.InsertOne(bean)
  37. dialect.PostInsertId(table, sess.Session)
  38. return id, err
  39. }
  40. func getTypeName(bean interface{}) (res string) {
  41. t := reflect.TypeOf(bean)
  42. for t.Kind() == reflect.Ptr {
  43. t = t.Elem()
  44. }
  45. return t.Name()
  46. }