From ddafdd0468ff346a51e0a036961d2400576f14df Mon Sep 17 00:00:00 2001 From: H3ALY Date: Wed, 29 Oct 2025 09:29:51 +0000 Subject: [PATCH] current duplicate check uses IS ? which is fragile in MySQL. Using the NULL-safe equality operator <=> instead. --- internal/storage/tickets/create.go | 39 ++++++++++++++++-------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/internal/storage/tickets/create.go b/internal/storage/tickets/create.go index 28fbbed..bd8dc4e 100644 --- a/internal/storage/tickets/create.go +++ b/internal/storage/tickets/create.go @@ -7,7 +7,6 @@ import ( "synlotto-website/internal/models" ) -// ToDo: Has both insert and select need to break into read and write. func InsertTicket(db *sql.DB, ticket models.Ticket) error { var bonus1Val interface{} var bonus2Val interface{} @@ -24,14 +23,18 @@ func InsertTicket(db *sql.DB, ticket models.Ticket) error { bonus2Val = nil } - query := ` - SELECT COUNT(*) FROM my_tickets - WHERE game_type = ? AND draw_date = ? - AND ball1 = ? AND ball2 = ? AND ball3 = ? - AND ball4 = ? AND ball5 = ? AND bonus1 IS ? AND bonus2 IS ?;` + // Use NULL-safe equality <=> for possible NULLs + const dupQuery = ` + SELECT COUNT(*) FROM my_tickets + WHERE game_type = ? + AND draw_date = ? + AND ball1 = ? AND ball2 = ? AND ball3 = ? + AND ball4 = ? AND ball5 = ? + AND bonus1 <=> ? AND bonus2 <=> ?; + ` var count int - err := db.QueryRow(query, + if err := db.QueryRow(dupQuery, ticket.GameType, ticket.DrawDate, ticket.Ball1, @@ -41,30 +44,30 @@ func InsertTicket(db *sql.DB, ticket models.Ticket) error { ticket.Ball5, bonus1Val, bonus2Val, - ).Scan(&count) - + ).Scan(&count); err != nil { + return err + } isDuplicate := count > 0 - insert := ` - INSERT INTO my_tickets ( - game_type, draw_date, - ball1, ball2, ball3, ball4, ball5, - bonus1, bonus2, duplicate - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);` + const insert = ` + INSERT INTO my_tickets ( + game_type, draw_date, + ball1, ball2, ball3, ball4, ball5, + bonus1, bonus2, duplicate + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?); + ` - _, err = db.Exec(insert, + _, err := db.Exec(insert, ticket.GameType, ticket.DrawDate, ticket.Ball1, ticket.Ball2, ticket.Ball3, ticket.Ball4, ticket.Ball5, bonus1Val, bonus2Val, isDuplicate, ) - if err != nil { log.Println("❌ Failed to insert ticket:", err) } else if isDuplicate { log.Println("⚠️ Duplicate ticket detected and flagged.") } - return err }