123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- package dao
- import (
- "context"
- "database/sql"
- "fmt"
- "math/rand"
- "strconv"
- "strings"
- "time"
- "go-common/app/service/live/resource/model"
- "go-common/library/log"
- "github.com/siddontang/go-mysql/mysql"
- )
- const (
- _addResourceSQL = "INSERT INTO resource (`platform`,`build`,`limit_type`,`start_time`,`end_time`,`type`,`title`,`image_info`) values(?,?,?,?,?,?,?,?)"
- )
- // AddResource -
- func (d *Dao) AddResource(c context.Context, insert *model.Resource) (row int64, err error) {
- types := strings.Split(insert.Type, ",")
- for _, t := range types {
- insert.Type = t
- row, err = d.addDBResource(c, insert)
- if err != nil {
- return row, err
- }
- }
- return
- }
- // EditResource -
- func (d *Dao) EditResource(c context.Context, id int64, update map[string]interface{}) (row int64, err error) {
- return d.editDBResource(c, id, update)
- }
- // GetResourceList -
- func (d *Dao) GetResourceList(c context.Context, typ string, page int64, pageSize int64) (resp []model.Resource, err error) {
- return d.getDBResourceList(c, typ, page, pageSize)
- }
- // GetResourceListEx -
- func (d *Dao) GetResourceListEx(c context.Context, typ []string, page int64, pageSize int64, devPlatform string, status string, startTime string, endTime string) (resp []model.Resource, count int64, err error) {
- return d.getDBResourceListEx(c, typ, page, pageSize, devPlatform, status, startTime, endTime)
- }
- // OfflineResource -
- func (d *Dao) OfflineResource(c context.Context, id int64) (row int64, err error) {
- return d.offlineDBResource(c, id)
- }
- // SelectById -
- func (d *Dao) SelectById(c context.Context, id int64) (resp *model.Resource, err error) {
- return d.selectDBById(c, id)
- }
- // GetInfo -
- func (d *Dao) GetInfo(ctx context.Context, typ string, platform string, build int64) (resp *model.Resource, err error) {
- inst := rand.Intn(d.c.CacheInstCnt)
- res, ok := d.sCache[inst].Get(cacheResourceKey(typ, platform, build))
- if !ok {
- resp, err = d.getDBInfo(ctx, typ, platform, build)
- if err != nil {
- return
- }
- var resNew []model.Resource
- resNew = append(resNew, *resp)
- d.sCache[inst].Put(cacheResourceKey(typ, platform, build), resNew)
- return
- }
- r := res.([]model.Resource)
- if len(r) > 0 {
- return &r[0], nil
- }
- return nil, nil
- }
- // GetBanner -
- func (d *Dao) GetBanner(ctx context.Context, platform string, build int64, t string) (resp []model.Resource, err error) {
- inst := rand.Intn(d.c.CacheInstCnt)
- res, ok := d.sCache[inst].Get(cacheResourceKey(t, platform, build))
- if !ok {
- resp, err = d.getDBBanner(ctx, platform, build, t)
- if err != nil {
- return
- }
- d.sCache[inst].Put(cacheResourceKey(t, platform, build), resp)
- return
- }
- resp = res.([]model.Resource)
- return
- }
- // SelectByTypeAndPlatform -
- func (d *Dao) SelectByTypeAndPlatform(ctx context.Context, typ string, platform string) (resp *model.Resource, err error) {
- return d.selectDBByTypeAndPlatform(ctx, typ, platform)
- }
- // GetDBCount -
- func (d *Dao) GetDBCount(ctx context.Context, typ string) (resp int64, err error) {
- return d.getDBCount(ctx, typ)
- }
- // get data from db source
- // addSResource add resource to mysql
- func (d *Dao) addDBResource(c context.Context, insert *model.Resource) (row int64, err error) {
- if insert == nil {
- return
- }
- var reply sql.Result
- if _, err = d.db.Begin(c); err != nil {
- log.Error("db.begin error(%v)", err)
- return
- }
- reply, err = d.db.Exec(c, _addResourceSQL, insert.Platform, insert.Build, insert.LimitType, insert.StartTime, insert.EndTime, insert.Type, insert.Title, insert.ImageInfo)
- if err != nil {
- log.Error("resource.addSResource d.db.Exec err: %v", err)
- return
- }
- row, err = reply.LastInsertId()
- return
- }
- func (d *Dao) editDBResource(c context.Context, id int64, update map[string]interface{}) (row int64, err error) {
- if update == nil || id < 0 {
- return
- }
- var tx = d.rsDB
- tableInfo := &model.Resource{}
- var reply = tx.Model(tableInfo).Where("id=?", id).Update(update)
- log.Info("effected rows: %d, id : %d", reply.RowsAffected, id)
- if reply.Error != nil {
- log.Error("resource.editResource error: %v", err)
- return
- }
- row = reply.RowsAffected
- return
- }
- func (d *Dao) getDBResourceList(c context.Context, typ string, page int64, pageSize int64) (resp []model.Resource, err error) {
- if typ == "" {
- return
- }
- var tx = d.rsDBReader
- tableInfo := &model.Resource{}
- err = tx.Model(tableInfo).
- Select("`id`,`platform`,`build`,`limit_type`,`start_time`,`end_time`,`title`,`image_info`").
- Where("type=?", typ).
- Order("id DESC").
- Limit(pageSize).
- Offset((page - 1) * pageSize).
- Find(&resp).Error
- if err != nil {
- log.Error("resource.editResource error: %v", err)
- return
- }
- return
- }
- func (d *Dao) getDBResourceListEx(c context.Context, typ []string, page int64, pageSize int64, devPlatform string, status string, startTime string, endTime string) (resp []model.Resource, count int64, err error) {
- if len(typ) <= 0 {
- return
- }
- whereStr := "1=1"
- for i, t := range typ {
- if i != 0 {
- whereStr += " or "
- } else {
- whereStr += " and ("
- }
- whereStr += fmt.Sprintf("`type` like \"%s%%\"", mysql.Escape(t))
- }
- whereStr += ")"
- if devPlatform != "" {
- whereStr += fmt.Sprintf(" and `platform`=\"%s\"", mysql.Escape(devPlatform))
- }
- if status != "" {
- var i int
- if i, err = strconv.Atoi(status); err != nil {
- return
- }
- now := time.Now().Format("2006-01-02 15:04:05")
- switch i {
- case 0:
- whereStr += fmt.Sprintf(" and `start_time`>=\"%s\"", now)
- case 1:
- whereStr += fmt.Sprintf(" and `start_time`<=\"%s\" and `end_time`>=\"%s\"", now, now)
- case -1:
- whereStr += fmt.Sprintf(" and `end_time`<=\"%s\"", now)
- }
- }
- if startTime != "" {
- whereStr += fmt.Sprintf(" and `start_time`>=\"%s\"", mysql.Escape(startTime))
- }
- if endTime != "" {
- whereStr += fmt.Sprintf(" and `end_time`<=\"%s\"", mysql.Escape(endTime))
- }
- var tx = d.rsDBReader
- tableInfo := &model.Resource{}
- err = tx.Model(tableInfo).
- Select("`id`,`platform`,`build`,`limit_type`,`start_time`,`end_time`,`title`,`image_info`,`type`").
- Where(whereStr).
- Order("id DESC").
- Limit(pageSize).
- Offset((page - 1) * pageSize).
- Find(&resp).Error
- if err != nil {
- log.Error("resource.editResource error: %v", err)
- return
- }
- err = tx.Model(tableInfo).
- Select("`id`").
- Where(whereStr).
- Count(&count).Error
- if err != nil {
- log.Error("resource.editResource error: %v", err)
- return
- }
- return
- }
- func (d *Dao) getDBCount(c context.Context, typ string) (resp int64, err error) {
- if typ == "" {
- return
- }
- var tx = d.rsDBReader
- tableInfo := &model.Resource{}
- err = tx.Model(tableInfo).
- Select("`id`").
- Where("type=?", typ).
- Count(&resp).Error
- if err != nil {
- log.Error("resource.editResource error: %v", err)
- return
- }
- return
- }
- func (d *Dao) offlineDBResource(c context.Context, id int64) (row int64, err error) {
- if id == 0 {
- return
- }
- reply, err := d.SelectById(c, id)
- if err != nil || reply == nil {
- log.Error("resource.OfflineResource select error: %v reply %v", err, reply)
- return
- }
- var tx = d.rsDB
- tableInfo := &model.Resource{}
- var updateReply = tx.Model(tableInfo).Where("id=?", id).Update("end_time", time.Now())
- if updateReply.Error != nil {
- log.Error("resource.OfflineResource update error: %v", err)
- return
- }
- return
- }
- func (d *Dao) selectDBById(c context.Context, id int64) (resp *model.Resource, err error) {
- if id == 0 {
- return
- }
- resp = &model.Resource{}
- var tx = d.rsDBReader
- var reply = tx.Model(&model.Resource{}).Where("id=?", id).Find(resp)
- if reply.Error != nil {
- log.Error("resource.SelectById error: %v", err)
- return
- }
- return
- }
- func (d *Dao) getDBInfo(ctx context.Context, typ string, platform string, build int64) (resp *model.Resource, err error) {
- if platform == "" || build == 0 {
- return
- }
- resp = &model.Resource{}
- var tx = d.rsDBReader
- now := time.Now()
- var reply = tx.Model(&model.Resource{}).Where("start_time<? and end_time>? and type=? and `platform`=? and ((`limit_type`=0 and `build`<=?) or (`limit_type`=1 and `build`=?) or (`limit_type`=2 and `build`>=?))", now, now, typ, platform, build, build, build).Limit(1).Find(resp)
- if reply.Error != nil {
- log.Error("resource.GetInfo error: %v", err)
- return
- }
- return
- }
- func (d *Dao) getDBBanner(ctx context.Context, platform string, build int64, t string) (resp []model.Resource, err error) {
- if platform == "" || build == 0 || t == "" {
- return
- }
- var tx = d.rsDBReader
- var reply = tx.Model(&model.Resource{}).Where("`start_time`<? and `end_time`>? and `type`=? and (`platform`='' or `platform`=?) and ((`limit_type`=0 and `build`<=?) or (`limit_type`=1 and `build`=?) or (`limit_type`=2 and `build`>=?))", time.Now(), time.Now(), t, platform, build, build, build).Order("mtime DESC").Find(&resp)
- if reply.Error != nil {
- log.Error("resource.GetBanner error: %v", err)
- return
- }
- return
- }
- func (d *Dao) selectDBByTypeAndPlatform(ctx context.Context, typ string, platform string) (resp *model.Resource, err error) {
- if typ == "" || platform == "" {
- return
- }
- resp = &model.Resource{}
- var tx = d.rsDBReader
- now := time.Now()
- var reply = tx.Model(&model.Resource{}).Where("`type`=? and `end_time`>? and `platform`=? ", typ, now, platform).Limit(1).Find(resp)
- if reply.Error != nil {
- resp = nil
- log.Error("resource.SelectByTypeAndPlatform error: %v", err)
- return
- }
- return
- }
|