removed locks, switching to WAL for SQLite default
This commit is contained in:
@@ -22,7 +22,6 @@ import (
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -60,11 +59,6 @@ type Conf struct {
|
||||
}
|
||||
}
|
||||
|
||||
type DBWithLock struct {
|
||||
Client *ent.Client
|
||||
Lock *sync.RWMutex
|
||||
}
|
||||
|
||||
type CommunityXML struct {
|
||||
SteamID64 uint64 `xml:"steamID64"`
|
||||
AvatarURL string `xml:"avatarFull"`
|
||||
@@ -221,8 +215,8 @@ func SendJSON(data interface{}, w http.ResponseWriter) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetMatchStats(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int, int, error) {
|
||||
wins, loss, ties, err := getWinLossTieFromPlayer(dbPlayer, lock)
|
||||
func GetMatchStats(dbPlayer *ent.Player) (int, int, int, error) {
|
||||
wins, loss, ties, err := getWinLossTieFromPlayer(dbPlayer)
|
||||
if err != nil {
|
||||
return 0, 0, 0, err
|
||||
}
|
||||
@@ -230,20 +224,16 @@ func GetMatchStats(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int, int, err
|
||||
return wins, ties, loss, nil
|
||||
}
|
||||
|
||||
func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse, error) {
|
||||
func GetMetaStats(dbPlayer *ent.Player) (*MetaStatsResponse, error) {
|
||||
mResponse := new(MetaStatsResponse)
|
||||
mResponse.Player = &PlayerResponse{SteamID64: dbPlayer.ID}
|
||||
|
||||
lock.RLock()
|
||||
tPlayers, err := dbPlayer.QueryMatches().QueryPlayers().Select(player.FieldID).All(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
lock.RLock()
|
||||
matchIDs, err := dbPlayer.QueryMatches().IDs(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -266,14 +256,12 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse,
|
||||
SteamID64: s.ID,
|
||||
}
|
||||
|
||||
lock.RLock()
|
||||
pMatches, err := s.QueryMatches().
|
||||
Select(match.FieldID, match.FieldMatchResult, match.FieldMap).
|
||||
Where(match.IDIn(matchIDs...)).
|
||||
WithStats().
|
||||
Where(match.HasStatsWith(stats.Or(stats.PlayerStats(dbPlayer.ID), stats.PlayerStats(s.ID)))).
|
||||
All(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -307,10 +295,8 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse,
|
||||
}
|
||||
}
|
||||
|
||||
lock.RLock()
|
||||
wSs, err := subjectStats.QueryWeaponStats().
|
||||
Select(weaponstats.FieldEqType, weaponstats.FieldDmg).All(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -396,13 +382,12 @@ func GetMetaStats(dbPlayer *ent.Player, lock *sync.RWMutex) (*MetaStatsResponse,
|
||||
return mResponse, nil
|
||||
}
|
||||
|
||||
func getWinLossTieFromPlayer(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int, int, error) {
|
||||
func getWinLossTieFromPlayer(dbPlayer *ent.Player) (int, int, int, error) {
|
||||
var res []struct {
|
||||
MatchResult int `json:"match_result"`
|
||||
Count int `json:"count"`
|
||||
}
|
||||
|
||||
lock.RLock()
|
||||
err := dbPlayer.QueryMatches().GroupBy(match.FieldMatchResult).Aggregate(func(s *sql.Selector) string {
|
||||
sT := sql.Table(stats.Table)
|
||||
|
||||
@@ -416,16 +401,13 @@ func getWinLossTieFromPlayer(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int
|
||||
))
|
||||
return sql.Count("*")
|
||||
}).Scan(context.Background(), &res)
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return 0, 0, 0, err
|
||||
}
|
||||
|
||||
lock.RLock()
|
||||
total, err := dbPlayer.QueryMatches().Modify(func(s *sql.Selector) {
|
||||
s.Select("COUNT(*)")
|
||||
}).Int(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return 0, 0, 0, err
|
||||
}
|
||||
@@ -447,13 +429,11 @@ func getWinLossTieFromPlayer(dbPlayer *ent.Player, lock *sync.RWMutex) (int, int
|
||||
return wins, total - wins - ties, ties, nil
|
||||
}
|
||||
|
||||
func IsAuthCodeValid(player *ent.Player, lock *sync.RWMutex, apiKey string, shareCode string, authCode string, rl ratelimit.Limiter) (bool, error) {
|
||||
func IsAuthCodeValid(player *ent.Player, apiKey string, shareCode string, authCode string, rl ratelimit.Limiter) (bool, error) {
|
||||
var tMatch *ent.Match
|
||||
var err error
|
||||
if shareCode == "" {
|
||||
lock.RLock()
|
||||
tMatch, err = player.QueryMatches().Order(ent.Asc(match.FieldDate)).First(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@@ -472,17 +452,13 @@ func IsAuthCodeValid(player *ent.Player, lock *sync.RWMutex, apiKey string, shar
|
||||
}
|
||||
}
|
||||
|
||||
func GetNewShareCodesForPlayer(player *ent.Player, lock *sync.RWMutex, apiKey string, rl ratelimit.Limiter) ([]string, error) {
|
||||
lock.RLock()
|
||||
func GetNewShareCodesForPlayer(player *ent.Player, apiKey string, rl ratelimit.Limiter) ([]string, error) {
|
||||
latestMatch, err := player.QueryMatches().Order(ent.Desc(match.FieldDate)).First(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
lock.RLock()
|
||||
oldestMatch, err := player.QueryMatches().Order(ent.Asc(match.FieldDate)).First(context.Background())
|
||||
lock.RUnlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -506,9 +482,7 @@ func GetNewShareCodesForPlayer(player *ent.Player, lock *sync.RWMutex, apiKey st
|
||||
}
|
||||
}
|
||||
|
||||
lock.Lock()
|
||||
err = player.Update().SetSharecodeUpdated(time.Now().UTC()).SetOldestSharecodeSeen(oldestMatch.ShareCode).Exec(context.Background())
|
||||
lock.Unlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -562,7 +536,7 @@ func getNextShareCode(lastCode string, apiKey string, authCode string, steamId u
|
||||
return rJson.Result.Code, nil
|
||||
}
|
||||
|
||||
func GetPlayer(db *DBWithLock, id interface{}, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
|
||||
func GetPlayer(db *ent.Client, id interface{}, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
|
||||
switch e := id.(type) {
|
||||
case uint64:
|
||||
return GetPlayerFromSteamID64(db, e, apiKey, rl)
|
||||
@@ -582,14 +556,12 @@ func GetPlayer(db *DBWithLock, id interface{}, apiKey string, rl ratelimit.Limit
|
||||
}
|
||||
}
|
||||
|
||||
func GetPlayerFromVanityURL(db *DBWithLock, id string, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
|
||||
func GetPlayerFromVanityURL(db *ent.Client, id string, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
|
||||
if id == "" {
|
||||
return nil, fmt.Errorf("invalid arguments")
|
||||
}
|
||||
|
||||
db.Lock.RLock()
|
||||
tPlayer, err := db.Client.Player.Query().Where(player.VanityURL(strings.ToLower(id))).Only(context.Background())
|
||||
db.Lock.RUnlock()
|
||||
tPlayer, err := db.Player.Query().Where(player.VanityURL(strings.ToLower(id))).Only(context.Background())
|
||||
if err == nil {
|
||||
return tPlayer, nil
|
||||
} else {
|
||||
@@ -614,21 +586,17 @@ func GetPlayerFromVanityURL(db *DBWithLock, id string, apiKey string, rl ratelim
|
||||
}
|
||||
}
|
||||
|
||||
func GetPlayerFromSteamID64(db *DBWithLock, steamID uint64, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
|
||||
db.Lock.RLock()
|
||||
tPlayer, err := db.Client.Player.Get(context.Background(), steamID)
|
||||
db.Lock.RUnlock()
|
||||
func GetPlayerFromSteamID64(db *ent.Client, steamID uint64, apiKey string, rl ratelimit.Limiter) (*ent.Player, error) {
|
||||
tPlayer, err := db.Player.Get(context.Background(), steamID)
|
||||
if err == nil {
|
||||
return tPlayer, nil
|
||||
} else {
|
||||
db.Lock.Lock()
|
||||
nPlayer, err := db.Client.Player.Create().SetID(steamID).Save(context.Background())
|
||||
db.Lock.Unlock()
|
||||
nPlayer, err := db.Player.Create().SetID(steamID).Save(context.Background())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
uPlayer, err := UpdatePlayerFromSteam([]*ent.Player{nPlayer}, db.Client, apiKey, db.Lock, rl)
|
||||
uPlayer, err := UpdatePlayerFromSteam([]*ent.Player{nPlayer}, db, apiKey, rl)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -641,7 +609,7 @@ func GetPlayerFromSteamID64(db *DBWithLock, steamID uint64, apiKey string, rl ra
|
||||
}
|
||||
}
|
||||
|
||||
func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, lock *sync.RWMutex, rl ratelimit.Limiter) ([]*ent.Player, error) {
|
||||
func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string, rl ratelimit.Limiter) ([]*ent.Player, error) {
|
||||
var idsToUpdate []uint64
|
||||
|
||||
for _, updatePlayer := range players {
|
||||
@@ -667,7 +635,6 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
|
||||
pS.ProfileURL = path.Base(pS.ProfileURL)
|
||||
}
|
||||
|
||||
lock.Lock()
|
||||
tPlayer, err := db.Player.UpdateOneID(pS.SteamID).
|
||||
SetName(pS.PersonaName).
|
||||
SetAvatar(pS.AvatarHash).
|
||||
@@ -677,7 +644,6 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
|
||||
SetSteamUpdated(time.Now().UTC()).
|
||||
SetProfileCreated(time.Unix(pS.TimeCreated, 0).UTC()).
|
||||
Save(context.Background())
|
||||
lock.Unlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -696,9 +662,7 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
|
||||
if ban.NumberOfVACBans > 0 {
|
||||
banDate := time.Now().UTC().AddDate(0, 0, -1*int(ban.DaysSinceLastBan))
|
||||
|
||||
lock.Lock()
|
||||
err := db.Player.UpdateOneID(ban.SteamID).SetVacCount(int(ban.NumberOfVACBans)).SetVacDate(banDate).Exec(context.Background())
|
||||
lock.Unlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -706,9 +670,7 @@ func UpdatePlayerFromSteam(players []*ent.Player, db *ent.Client, apiKey string,
|
||||
if ban.NumberOfGameBans > 0 {
|
||||
banDate := time.Now().UTC().AddDate(0, 0, -1*int(ban.DaysSinceLastBan))
|
||||
|
||||
lock.Lock()
|
||||
err := db.Player.UpdateOneID(ban.SteamID).SetGameBanCount(int(ban.NumberOfGameBans)).SetGameBanDate(banDate).Exec(context.Background())
|
||||
lock.Unlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
Reference in New Issue
Block a user