user.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "zero/core/stores/cache"
  6. "zero/core/stores/sqlc"
  7. "zero/core/stores/sqlx"
  8. "zero/kq"
  9. )
  10. var (
  11. userRows = "id, mobile, name, sex"
  12. cacheUserMobilePrefix = "cache#user#mobile#"
  13. cacheUserIdPrefix = "cache#user#id#"
  14. ErrNotFound = sqlc.ErrNotFound
  15. )
  16. type (
  17. User struct {
  18. Id int64 `db:"id" json:"id,omitempty"`
  19. Mobile string `db:"mobile" json:"mobile,omitempty"`
  20. Name string `db:"name" json:"name,omitempty"`
  21. Sex int `db:"sex" json:"sex,omitempty"`
  22. }
  23. UserModel struct {
  24. sqlc.CachedConn
  25. // sqlx.SqlConn
  26. table string
  27. // kafka use kq not kmq
  28. push *kq.Pusher
  29. }
  30. )
  31. func NewUserModel(db sqlx.SqlConn, c cache.CacheConf, table string, pusher *kq.Pusher) *UserModel {
  32. return &UserModel{
  33. CachedConn: sqlc.NewConn(db, c),
  34. table: table,
  35. push: pusher,
  36. }
  37. }
  38. func (um *UserModel) FindOne(id int64) (*User, error) {
  39. key := fmt.Sprintf("%s%d", cacheUserIdPrefix, id)
  40. var user User
  41. err := um.QueryRow(&user, key, func(conn sqlx.SqlConn, v interface{}) error {
  42. query := fmt.Sprintf("SELECT %s FROM user WHERE id=?", userRows)
  43. return conn.QueryRow(v, query, id)
  44. })
  45. switch err {
  46. case nil:
  47. return &user, nil
  48. case sqlc.ErrNotFound:
  49. return nil, ErrNotFound
  50. default:
  51. return nil, err
  52. }
  53. }
  54. func (um *UserModel) FindByMobile(mobile string) (*User, error) {
  55. var user User
  56. key := fmt.Sprintf("%s%s", cacheUserMobilePrefix, mobile)
  57. err := um.QueryRowIndex(&user, key, func(primary interface{}) string {
  58. return fmt.Sprintf("%s%d", cacheUserIdPrefix, primary.(int64))
  59. }, func(conn sqlx.SqlConn, v interface{}) (interface{}, error) {
  60. query := fmt.Sprintf("SELECT %s FROM user WHERE mobile=?", userRows)
  61. if err := conn.QueryRow(&user, query, mobile); err != nil {
  62. return nil, err
  63. }
  64. return user.Id, nil
  65. }, func(conn sqlx.SqlConn, v interface{}, primary interface{}) error {
  66. return conn.QueryRow(v, "SELECT * FROM user WHERE id=?", primary)
  67. })
  68. switch err {
  69. case nil:
  70. return &user, nil
  71. case sqlc.ErrNotFound:
  72. return nil, ErrNotFound
  73. default:
  74. return nil, err
  75. }
  76. }
  77. // Count for no cache
  78. func (um *UserModel) Count() (int64, error) {
  79. var count int64
  80. err := um.QueryRowNoCache(&count, "SELECT count(1) FROM user")
  81. if err != nil {
  82. return 0, err
  83. }
  84. return count, nil
  85. }
  86. // Query rows
  87. func (um *UserModel) FindByName(name string) ([]*User, error) {
  88. var users []*User
  89. query := fmt.Sprintf("SELECT %s FROM user WHERE name=?", userRows)
  90. err := um.QueryRowsNoCache(&userRows, query, name)
  91. if err != nil {
  92. return nil, err
  93. }
  94. return users, nil
  95. }
  96. func (um *UserModel) UpdateSexById(sex int, id int64) error {
  97. key := fmt.Sprintf("%s%d", cacheUserIdPrefix, id)
  98. _, err := um.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  99. query := fmt.Sprintf("UPDATE user SET sex=? WHERE id=?")
  100. return conn.Exec(query, sex, id)
  101. }, key)
  102. return err
  103. }
  104. func (um *UserModel) UpdateMobileById(mobile string, id int64) error {
  105. idKey := fmt.Sprintf("%s%d", cacheUserIdPrefix, id)
  106. mobileKey := fmt.Sprintf("%s%s", cacheUserMobilePrefix, mobile)
  107. _, err := um.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  108. query := fmt.Sprintf("UPDATE user SET mobile=? WHERE id=?")
  109. return conn.Exec(query, mobile, id)
  110. }, idKey, mobileKey)
  111. return err
  112. }
  113. func (um *UserModel) Update(u *User) error {
  114. oldUser, err := um.FindOne(u.Id)
  115. if err != nil {
  116. return err
  117. }
  118. idKey := fmt.Sprintf("%s%d", cacheUserIdPrefix, oldUser.Id)
  119. mobileKey := fmt.Sprintf("%s%s", cacheUserMobilePrefix, oldUser.Mobile)
  120. _, err = um.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  121. query := fmt.Sprintf("UPDATE user SET mobile=?, name=?, sex=? WHERE id=?")
  122. return conn.Exec(query, u.Mobile, u.Name, u.Sex, u.Id)
  123. }, idKey, mobileKey)
  124. return err
  125. }