You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.7 KiB
66 lines
1.7 KiB
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 |
|
}
|
|
|