refactor: deduplicate persistence, add upsert queries, throttle snake saves
Some checks failed
CI / Deploy / test (pull_request) Failing after 15s
CI / Deploy / lint (pull_request) Failing after 23s
CI / Deploy / deploy (pull_request) Has been skipped

- Replace Create+Get+Update with UpsertGame/UpsertSnakeGame queries
- Extract free functions (saveGame, loadGame, etc.) from duplicated
  receiver methods on Store and Instance types
- Remove duplicate generateID from snake package, reuse game.GenerateID
- Throttle snake game DB writes to every 2s instead of every tick
- Fix double-lock in c4game chat handler
- Update all code for sqlc pointer types (*string instead of sql.NullString)
This commit is contained in:
Ryan Hamamura
2026-03-02 16:56:29 -10:00
parent 9c3f659e96
commit bc6488f063
14 changed files with 318 additions and 494 deletions

View File

@@ -49,7 +49,7 @@ func (gs *GameStore) Create() *GameInstance {
gs.gamesMu.Unlock()
if gs.queries != nil {
gs.saveGame(gi.game) //nolint:errcheck
saveGame(gs.queries, gi.game) //nolint:errcheck
}
return gi
@@ -68,12 +68,12 @@ func (gs *GameStore) Get(id string) (*GameInstance, bool) {
return nil, false
}
g, err := gs.loadGame(id)
g, err := loadGame(gs.queries, id)
if err != nil || g == nil {
return nil, false
}
players, _ := gs.loadGamePlayers(id)
players, _ := loadGamePlayers(gs.queries, id)
for _, p := range players {
switch p.Color {
case 1:
@@ -152,8 +152,8 @@ func (gi *GameInstance) Join(ps *PlayerSession) bool {
}
if gi.queries != nil {
gi.saveGamePlayer(gi.game.ID, ps.Player, slot) //nolint:errcheck
gi.saveGame(gi.game) //nolint:errcheck
saveGamePlayer(gi.queries, gi.game.ID, ps.Player, slot) //nolint:errcheck
saveGame(gi.queries, gi.game) //nolint:errcheck
}
gi.notify()
@@ -190,7 +190,7 @@ func (gi *GameInstance) CreateRematch(gs *GameStore) *GameInstance {
gi.game.RematchGameID = &newID
if gi.queries != nil {
if err := gi.saveGame(gi.game); err != nil {
if err := saveGame(gi.queries, gi.game); err != nil {
gs.Delete(newID) //nolint:errcheck
gi.game.RematchGameID = nil
return nil
@@ -224,7 +224,7 @@ func (gi *GameInstance) DropPiece(col int, playerColor int) bool {
}
if gi.queries != nil {
gi.saveGame(gi.game) //nolint:errcheck
saveGame(gi.queries, gi.game) //nolint:errcheck
}
gi.notify()