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.
181 lines
5.8 KiB
181 lines
5.8 KiB
package medal |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
|
|
"go-common/app/service/main/usersuit/model" |
|
"go-common/library/database/sql" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
const ( |
|
_sharding = 10 |
|
|
|
_insOwnerSQL = "INSERT INTO medal_owner_%s(mid,nid) VALUES (?,?)" |
|
_updateOwnerSQL = "UPDATE medal_owner_%s SET is_activated=? WHERE mid=? AND nid=?" |
|
_updateOwnerUnallSQL = "UPDATE medal_owner_%s SET is_activated=0 WHERE mid=? AND nid!=?" |
|
_selInfoAllSQL = "SELECT id,name,description,image,image_small,cond,gid,level,level_rank,sort FROM medal_info ORDER BY sort ASC,gid ASC,level ASC" |
|
_selOwnerByMidSQL = "SELECT id,mid,nid,is_activated,ctime,mtime FROM medal_owner_%s WHERE mid=? AND is_del=0 ORDER BY ctime DESC" |
|
_selInfoByNidSQL = "SELECT name FROM medal_info WHERE id=? AND is_online=1" |
|
_selInstalledOwnerBYMidSQL = "SELECT nid FROM medal_owner_%s WHERE mid=? AND is_activated=1 AND is_del=0 LIMIT 1" |
|
_countOwnerBYNidMidSQL = "SELECT COUNT(*) FROM medal_owner_%s WHERE mid=? AND nid=?" |
|
_OwnerBYNidMidSQL = "SELECT id,mid,nid,is_activated,ctime,mtime FROM medal_owner_%s WHERE mid=? AND nid=?" |
|
_selGroupAllSQL = "SELECT id,name,pid,rank FROM medal_group WHERE is_online=1 ORDER BY pid ASC,rank ASC" |
|
) |
|
|
|
func (d *Dao) hit(id int64) string { |
|
return fmt.Sprintf("%d", id%_sharding) |
|
} |
|
|
|
// AddMedalOwner insert into medal_owner. |
|
func (d *Dao) AddMedalOwner(c context.Context, mid, nid int64) (err error) { |
|
if _, err = d.db.Exec(c, fmt.Sprintf(_insOwnerSQL, d.hit(mid)), mid, nid); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// InstallMedalOwner update medal_owner set is_activated=1. |
|
func (d *Dao) InstallMedalOwner(c context.Context, mid, nid int64) (err error) { |
|
if _, err = d.db.Exec(c, fmt.Sprintf(_updateOwnerSQL, d.hit(mid)), model.OwnerInstall, mid, nid); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// UninstallMedalOwner update medal_owner set is_activated=0. |
|
func (d *Dao) UninstallMedalOwner(c context.Context, mid, nid int64) (err error) { |
|
if _, err = d.db.Exec(c, fmt.Sprintf(_updateOwnerSQL, d.hit(mid)), model.OwnerUninstall, mid, nid); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// UninstallAllMedalOwner uninst all medal_owner set is_activated=0. |
|
func (d *Dao) UninstallAllMedalOwner(c context.Context, mid, nid int64) (err error) { |
|
if _, err = d.db.Exec(c, fmt.Sprintf(_updateOwnerUnallSQL, d.hit(mid)), mid, nid); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// MedalInfoAll retun all medal_info where is_online=1. |
|
func (d *Dao) MedalInfoAll(c context.Context) (res map[int64]*model.MedalInfo, err error) { |
|
res = make(map[int64]*model.MedalInfo) |
|
rows, err := d.db.Query(c, _selInfoAllSQL) |
|
if err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
defer rows.Close() |
|
for rows.Next() { |
|
info := new(model.MedalInfo) |
|
if err = rows.Scan(&info.ID, &info.Name, &info.Description, &info.Image, &info.ImageSmall, &info.Condition, &info.GID, &info.Level, &info.LevelRank, &info.Sort); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
info.Build() |
|
res[info.ID] = info |
|
} |
|
err = rows.Err() |
|
return |
|
} |
|
|
|
// MedalOwnerByMid return medal_owner by mid. |
|
func (d *Dao) MedalOwnerByMid(c context.Context, mid int64) (res []*model.MedalOwner, err error) { |
|
res = make([]*model.MedalOwner, 0) |
|
rows, err := d.db.Query(c, fmt.Sprintf(_selOwnerByMidSQL, d.hit(mid)), mid) |
|
if err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
defer rows.Close() |
|
for rows.Next() { |
|
r := new(model.MedalOwner) |
|
if err = rows.Scan(&r.ID, &r.MID, &r.NID, &r.IsActivated, &r.CTime, &r.MTime); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
res = append(res, r) |
|
} |
|
err = rows.Err() |
|
return |
|
} |
|
|
|
// MedalInfoByNid return medal_info by nid. |
|
func (d *Dao) MedalInfoByNid(c context.Context, nid int64) (res *model.MedalInfo, err error) { |
|
res = &model.MedalInfo{} |
|
rows := d.db.QueryRow(c, _selInfoByNidSQL, nid) |
|
if err = rows.Scan(&res.Name); err != nil { |
|
if err != sql.ErrNoRows { |
|
err = errors.Wrap(err, "InstalledOwnerBYMid") |
|
return |
|
} |
|
err = nil |
|
} |
|
return |
|
} |
|
|
|
// ActivatedOwnerByMid retun nid of medal_owner by mid where is_activated=1. |
|
func (d *Dao) ActivatedOwnerByMid(c context.Context, mid int64) (nid int64, err error) { |
|
row := d.db.QueryRow(c, fmt.Sprintf(_selInstalledOwnerBYMidSQL, d.hit(mid)), mid) |
|
if err = row.Scan(&nid); err != nil { |
|
if err != sql.ErrNoRows { |
|
err = errors.Wrap(err, "InstalledOwnerBYMid") |
|
return |
|
} |
|
err = nil |
|
} |
|
return |
|
} |
|
|
|
// CountOwnerBYNidMid retun number of medal_owner by mid and nid. |
|
func (d *Dao) CountOwnerBYNidMid(c context.Context, mid, nid int64) (count int64, err error) { |
|
row := d.db.QueryRow(c, fmt.Sprintf(_countOwnerBYNidMidSQL, d.hit(mid)), mid, nid) |
|
if err = row.Scan(&count); err != nil { |
|
if err != sql.ErrNoRows { |
|
err = errors.Wrap(err, "CountOwnerBYNidMid") |
|
return |
|
} |
|
count = 0 |
|
err = nil |
|
} |
|
return |
|
} |
|
|
|
// OwnerBYNidMid retun medal_owner by mid and nid. |
|
func (d *Dao) OwnerBYNidMid(c context.Context, mid, nid int64) (res *model.MedalOwner, err error) { |
|
res = &model.MedalOwner{} |
|
row := d.db.QueryRow(c, fmt.Sprintf(_OwnerBYNidMidSQL, d.hit(mid)), mid, nid) |
|
if err = row.Scan(&res.ID, &res.MID, &res.NID, &res.IsActivated, &res.CTime, &res.MTime); err != nil { |
|
if err != sql.ErrNoRows { |
|
err = errors.Wrap(err, "OwnerBYNidMid") |
|
return |
|
} |
|
res = nil |
|
err = nil |
|
} |
|
return |
|
} |
|
|
|
// MedalGroupAll retun all medal_group where is_online=1. |
|
func (d *Dao) MedalGroupAll(c context.Context) (res []*model.MedalGroup, err error) { |
|
rows, err := d.db.Query(c, _selGroupAllSQL) |
|
if err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
defer rows.Close() |
|
for rows.Next() { |
|
info := new(model.MedalGroup) |
|
if err = rows.Scan(&info.ID, &info.Name, &info.PID, &info.Rank); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
res = append(res, info) |
|
} |
|
err = rows.Err() |
|
return |
|
}
|
|
|