mysql.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package dao
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "strings"
  7. "time"
  8. "go-common/app/interface/main/space/model"
  9. xsql "go-common/library/database/sql"
  10. "go-common/library/log"
  11. "go-common/library/xstr"
  12. )
  13. const (
  14. _chSub = 10
  15. _chSQL = "SELECT id,mid,name,intro,modify_time FROM member_channel%d WHERE mid = ? AND id = ? LIMIT 1"
  16. _chListSQL = "SELECT id,mid,name,intro,modify_time FROM member_channel%d WHERE mid = ?"
  17. _chCntSQL = "SELECT COUNT(1) FROM member_channel%d WHERE mid = ? LIMIT 1"
  18. _chAddSQL = "INSERT INTO member_channel%d (mid,name,intro,modify_time) VALUES (?,?,?,?)"
  19. _chEditSQL = "UPDATE member_channel%d SET name = ?,intro = ?,modify_time = ? WHERE mid = ? AND id = ?"
  20. _chDelSQL = "DELETE FROM member_channel%d WHERE mid = ? AND id = ?"
  21. _chArcSQL = "SELECT id,mid,cid,aid,order_num,modify_time FROM member_channel_video%d WHERE mid = ? AND cid = ? ORDER BY order_num"
  22. _chArcCntSQL = "SELECT COUNT(1),IFNULL(aid , 0) FROM member_channel_video%d WHERE mid = ? AND cid = ? ORDER BY order_num DESC LIMIT 1"
  23. _chArcAddSQL = "INSERT INTO member_channel_video%d (mid,cid,aid,order_num,modify_time) VALUES %s"
  24. _chArcDelSQL = "DELETE FROM member_channel_video%d WHERE mid = ? AND cid = ? AND aid = ?"
  25. _chArcsDelSQL = "DELETE FROM member_channel_video%d WHERE mid = ? AND cid = ?"
  26. _chArcsSortDelSQL = "UPDATE member_channel_video%d SET order_num = order_num-1 WHERE mid = ? AND cid = ? AND order_num > ?"
  27. _chArcEditSQL = "UPDATE member_channel_video%d SET order_num = CASE %s END,modify_time = ? WHERE mid = ? AND cid = ? AND aid IN (%s)"
  28. )
  29. func channelHit(mid int64) int64 {
  30. return mid % _chSub
  31. }
  32. // Channel get channel simple info
  33. func (d *Dao) Channel(c context.Context, mid, cid int64) (channel *model.Channel, err error) {
  34. row := d.channelStmt[channelHit(mid)].QueryRow(c, mid, cid)
  35. channel = new(model.Channel)
  36. if err = row.Scan(&channel.Cid, &channel.Mid, &channel.Name, &channel.Intro, &channel.Mtime); err != nil {
  37. if err == sql.ErrNoRows {
  38. channel = nil
  39. err = nil
  40. } else {
  41. log.Error("row.Scan() error(%v)", err)
  42. }
  43. }
  44. return
  45. }
  46. // ChannelCnt get channel count by mid
  47. func (d *Dao) ChannelCnt(c context.Context, mid int64) (count int, err error) {
  48. row := d.channelCntStmt[channelHit(mid)].QueryRow(c, mid)
  49. if err = row.Scan(&count); err != nil {
  50. log.Error("row.Scan error(%v)", err)
  51. }
  52. return
  53. }
  54. // ChannelList get channel list by mid
  55. func (d *Dao) ChannelList(c context.Context, mid int64) (res []*model.Channel, err error) {
  56. var rows *xsql.Rows
  57. if rows, err = d.channelListStmt[channelHit(mid)].Query(c, mid); err != nil {
  58. log.Error("d.channelListStmt[%d].Query(%d) error(%v)", channelHit(mid), mid, err)
  59. return
  60. }
  61. defer rows.Close()
  62. for rows.Next() {
  63. r := new(model.Channel)
  64. if err = rows.Scan(&r.Cid, &r.Mid, &r.Name, &r.Intro, &r.Mtime); err != nil {
  65. log.Error("row.Scan() error(%v)", err)
  66. return
  67. }
  68. res = append(res, r)
  69. }
  70. err = rows.Err()
  71. return
  72. }
  73. // ChannelVideos get channel video list
  74. func (d *Dao) ChannelVideos(c context.Context, mid, cid int64, order bool) (res []*model.ChannelArc, err error) {
  75. var (
  76. orderSQL string
  77. rows *xsql.Rows
  78. )
  79. orderSQL = fmt.Sprintf(_chArcSQL, channelHit(mid))
  80. if !order {
  81. orderSQL = orderSQL + " DESC"
  82. }
  83. if rows, err = d.db.Query(c, orderSQL, mid, cid); err != nil {
  84. log.Error("d.channelVideoStmt[%d].Query(%d,%d) error(%v)", channelHit(mid), mid, cid, err)
  85. return
  86. }
  87. defer rows.Close()
  88. for rows.Next() {
  89. r := new(model.ChannelArc)
  90. if err = rows.Scan(&r.ID, &r.Mid, &r.Cid, &r.Aid, &r.OrderNum, &r.Mtime); err != nil {
  91. log.Error("row.Scan() error(%v)", err)
  92. return
  93. }
  94. res = append(res, r)
  95. }
  96. err = rows.Err()
  97. return
  98. }
  99. // ChannelExtra get channel count and cover aid
  100. func (d *Dao) ChannelExtra(c context.Context, mid, cid int64) (res *model.ChannelExtra, err error) {
  101. row := d.channelArcCntStmt[channelHit(mid)].QueryRow(c, mid, cid)
  102. res = &model.ChannelExtra{Cid: cid}
  103. if err = row.Scan(&res.Count, &res.Aid); err != nil {
  104. if err == sql.ErrNoRows {
  105. res = nil
  106. err = nil
  107. } else {
  108. log.Error("row.Scan() error(%v)", err)
  109. }
  110. }
  111. return
  112. }
  113. // AddChannel add channel
  114. func (d *Dao) AddChannel(c context.Context, mid int64, name, intro string, ts time.Time) (lastID int64, err error) {
  115. var res sql.Result
  116. if res, err = d.db.Exec(c, fmt.Sprintf(_chAddSQL, channelHit(mid)), mid, name, intro, ts.Format("2006-01-02 15:04:05")); err != nil {
  117. log.Error("AddChannel: db.Exec(mid:%d,name:%s,intro:%s) error(%v)", mid, name, intro, err)
  118. return
  119. }
  120. return res.LastInsertId()
  121. }
  122. // EditChannel edit channel name or intro
  123. func (d *Dao) EditChannel(c context.Context, mid, cid int64, name, intro string, ts time.Time) (affected int64, err error) {
  124. var res sql.Result
  125. if res, err = d.db.Exec(c, fmt.Sprintf(_chEditSQL, channelHit(mid)), name, intro, ts.Format("2006-01-02 15:04:05"), mid, cid); err != nil {
  126. log.Error("EditChannel: db.Exec(mid:%d,cid:%d,name:%s,intro:%s) error(%v)", mid, cid, name, intro, err)
  127. return
  128. }
  129. return res.RowsAffected()
  130. }
  131. // DelChannel delete channel
  132. func (d *Dao) DelChannel(c context.Context, mid, cid int64) (affected int64, err error) {
  133. var (
  134. res sql.Result
  135. tx *xsql.Tx
  136. )
  137. if tx, err = d.db.Begin(c); err != nil {
  138. log.Error("d.db.Begin error(%v)", err)
  139. return
  140. }
  141. if res, err = tx.Exec(fmt.Sprintf(_chDelSQL, channelHit(mid)), mid, cid); err != nil {
  142. tx.Rollback()
  143. log.Error("DelChannel: db.Exec(mid:%d,cid:%d) error(%v)", mid, cid, err)
  144. return
  145. }
  146. if _, err = tx.Exec(fmt.Sprintf(_chArcsDelSQL, channelHit(mid)), mid, cid); err != nil {
  147. tx.Rollback()
  148. log.Error("DelChannelArcs: db.Exec(mid:%d,cid:%d) error(%v)", mid, cid, err)
  149. return
  150. }
  151. if err = tx.Commit(); err != nil {
  152. log.Error("tx.Commit error(%v)", err)
  153. return
  154. }
  155. return res.RowsAffected()
  156. }
  157. // AddChannelArc add archives to channel
  158. func (d *Dao) AddChannelArc(c context.Context, mid, cid int64, ts time.Time, chs []*model.ChannelArcSort) (lastID int64, err error) {
  159. var (
  160. res sql.Result
  161. values []string
  162. )
  163. for _, v := range chs {
  164. values = append(values, fmt.Sprintf("(%d,%d,%d,%d,'%s')", mid, cid, v.Aid, v.OrderNum, ts.Format("2006-01-02 15:04:05")))
  165. }
  166. if res, err = d.db.Exec(c, fmt.Sprintf(_chArcAddSQL, channelHit(mid), strings.Join(values, ","))); err != nil {
  167. log.Error("AddChannelArc: db.Exec(%d,%d) error(%v)", mid, cid, err)
  168. return
  169. }
  170. return res.LastInsertId()
  171. }
  172. // DelChannelArc delete channel archives
  173. func (d *Dao) DelChannelArc(c context.Context, mid, cid, aid int64, orderNum int) (affected int64, err error) {
  174. var (
  175. res sql.Result
  176. tx *xsql.Tx
  177. )
  178. if tx, err = d.db.Begin(c); err != nil {
  179. log.Error("d.db.Begin error(%v)", err)
  180. return
  181. }
  182. if res, err = d.db.Exec(c, fmt.Sprintf(_chArcDelSQL, channelHit(mid)), mid, cid, aid); err != nil {
  183. tx.Rollback()
  184. log.Error("DelChannelArc: db.Exec(mid:%d,cid:%d,aid:%d) error (%v)", mid, cid, aid, err)
  185. return
  186. }
  187. if _, err = tx.Exec(fmt.Sprintf(_chArcsSortDelSQL, channelHit(mid)), mid, cid, orderNum); err != nil {
  188. tx.Rollback()
  189. log.Error("DelChannelArcs: db.Exec(mid:%d,cid:%d) error(%v)", mid, cid, err)
  190. return
  191. }
  192. if err = tx.Commit(); err != nil {
  193. log.Error("tx.Commit error(%v)", err)
  194. return
  195. }
  196. return res.RowsAffected()
  197. }
  198. // EditChannelArc edit channel archive order num
  199. func (d *Dao) EditChannelArc(c context.Context, mid, cid int64, ts time.Time, chSort []*model.ChannelArcSort) (affected int64, err error) {
  200. var (
  201. caseStr string
  202. aids []int64
  203. res sql.Result
  204. )
  205. for _, v := range chSort {
  206. caseStr = fmt.Sprintf("%s WHEN aid = %d THEN %d", caseStr, v.Aid, v.OrderNum)
  207. aids = append(aids, v.Aid)
  208. }
  209. if res, err = d.db.Exec(c, fmt.Sprintf(_chArcEditSQL, channelHit(mid), caseStr, xstr.JoinInts(aids)), ts.Format("2006-01-02 15:04:05"), mid, cid); err != nil {
  210. log.Error("EditChannel: db.Exec(mid:%d,cid:%d,%s) error(%v)", mid, cid, caseStr, err)
  211. return
  212. }
  213. return res.RowsAffected()
  214. }