@@ -2,6 +2,7 @@ package score
22
33import (
44 "os"
5+ "sync"
56 "time"
67
78 "github.com/jinzhu/gorm"
@@ -11,7 +12,10 @@ import (
1112var sdb * scoredb
1213
1314// scoredb 分数数据库
14- type scoredb gorm.DB
15+ type scoredb struct {
16+ db * gorm.DB
17+ scoremu sync.Mutex
18+ }
1519
1620// scoretable 分数结构体
1721type scoretable struct {
@@ -52,25 +56,31 @@ func initialize(dbpath string) *scoredb {
5256 panic (err )
5357 }
5458 gdb .AutoMigrate (& scoretable {}).AutoMigrate (& signintable {})
55- return (* scoredb )(gdb )
59+ return & scoredb {
60+ db : gdb ,
61+ }
5662}
5763
5864// Close ...
5965func (sdb * scoredb ) Close () error {
60- db := ( * gorm . DB )( sdb )
66+ db := sdb . db
6167 return db .Close ()
6268}
6369
6470// GetScoreByUID 取得分数
6571func (sdb * scoredb ) GetScoreByUID (uid int64 ) (s scoretable ) {
66- db := (* gorm .DB )(sdb )
72+ sdb .scoremu .Lock ()
73+ defer sdb .scoremu .Unlock ()
74+ db := sdb .db
6775 db .Model (& scoretable {}).FirstOrCreate (& s , "uid = ? " , uid )
6876 return s
6977}
7078
7179// InsertOrUpdateScoreByUID 插入或更新分数
7280func (sdb * scoredb ) InsertOrUpdateScoreByUID (uid int64 , score int ) (err error ) {
73- db := (* gorm .DB )(sdb )
81+ sdb .scoremu .Lock ()
82+ defer sdb .scoremu .Unlock ()
83+ db := sdb .db
7484 s := scoretable {
7585 UID : uid ,
7686 Score : score ,
@@ -91,14 +101,18 @@ func (sdb *scoredb) InsertOrUpdateScoreByUID(uid int64, score int) (err error) {
91101
92102// GetSignInByUID 取得签到次数
93103func (sdb * scoredb ) GetSignInByUID (uid int64 ) (si signintable ) {
94- db := (* gorm .DB )(sdb )
104+ sdb .scoremu .Lock ()
105+ defer sdb .scoremu .Unlock ()
106+ db := sdb .db
95107 db .Model (& signintable {}).FirstOrCreate (& si , "uid = ? " , uid )
96108 return si
97109}
98110
99111// InsertOrUpdateSignInCountByUID 插入或更新签到次数
100112func (sdb * scoredb ) InsertOrUpdateSignInCountByUID (uid int64 , count int ) (err error ) {
101- db := (* gorm .DB )(sdb )
113+ sdb .scoremu .Lock ()
114+ defer sdb .scoremu .Unlock ()
115+ db := sdb .db
102116 si := signintable {
103117 UID : uid ,
104118 Count : count ,
@@ -118,7 +132,9 @@ func (sdb *scoredb) InsertOrUpdateSignInCountByUID(uid int64, count int) (err er
118132}
119133
120134func (sdb * scoredb ) GetScoreRankByTopN (n int ) (st []scoretable , err error ) {
121- db := (* gorm .DB )(sdb )
135+ sdb .scoremu .Lock ()
136+ defer sdb .scoremu .Unlock ()
137+ db := sdb .db
122138 err = db .Model (& scoretable {}).Order ("score desc" ).Limit (n ).Find (& st ).Error
123139 return
124140}
0 commit comments