bilibili-backup/app/service/main/share/dao/mysql.go
2019-04-22 02:59:20 +00:00

67 lines
1.7 KiB
Go

package dao
import (
"context"
"fmt"
"go-common/app/service/main/share/model"
"go-common/library/database/sql"
"go-common/library/log"
"github.com/pkg/errors"
)
const (
_shareSQL = "SELECT oid,tp,share FROM %s WHERE oid=? AND tp=?"
_addShareSQL = "INSERT INTO %s(oid,tp,share) VALUES(?,?,1) ON DUPLICATE KEY UPDATE share=share+1"
)
func table(oid int64) string {
return fmt.Sprintf("share_count_%02d", oid%100)
}
// Share get share
func (d *Dao) Share(c context.Context, oid int64, tp int) (share *model.Share, err error) {
row := d.db.QueryRow(c, fmt.Sprintf(_shareSQL, table(oid)), oid, tp)
share = &model.Share{}
if err = row.Scan(&share.OID, &share.Tp, &share.Count); err != nil {
if err == sql.ErrNoRows {
share = nil
err = nil
} else {
err = errors.WithStack(err)
}
return
}
return
}
// AddShare add share
func (d *Dao) AddShare(c context.Context, oid int64, tp int) (err error) {
if _, err = d.db.Exec(c, fmt.Sprintf(_addShareSQL, table(oid)), oid, tp); err != nil {
err = errors.Wrapf(err, "d.db.Exec(%s, %d, %d)", fmt.Sprintf(_addShareSQL, table(oid)), oid, tp)
return
}
if _, ok := d.sources[oid]; ok && tp == model.ArchiveTyp {
if _, err = d.db.Exec(c, fmt.Sprintf(_addShareSQL, table(d.c.Target)), d.c.Target, tp); err != nil {
return
}
var share *model.Share
if share, err = d.Share(c, d.c.Target, tp); err != nil {
return
}
// pub msg
if err = d.PubStatShare(c, model.ArchiveMsgTyp, d.c.Target, share.Count); err != nil {
log.Error("s.dao.PubArchiveShare error(%v)", err)
err = nil
}
d.asyncCache.Save(func() {
if err = d.SetShareCache(context.Background(), d.c.Target, tp, share.Count); err != nil {
log.Error("d.SetShareCache error(%v)", err)
return
}
})
}
return
}