current duplicate check uses IS ? which is fragile in MySQL. Using the NULL-safe equality operator <=> instead.

This commit is contained in:
2025-10-29 09:29:51 +00:00
parent 5fcb4fb016
commit ddafdd0468

View File

@@ -7,7 +7,6 @@ import (
"synlotto-website/internal/models" "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 { func InsertTicket(db *sql.DB, ticket models.Ticket) error {
var bonus1Val interface{} var bonus1Val interface{}
var bonus2Val interface{} var bonus2Val interface{}
@@ -24,14 +23,18 @@ func InsertTicket(db *sql.DB, ticket models.Ticket) error {
bonus2Val = nil bonus2Val = nil
} }
query := ` // Use NULL-safe equality <=> for possible NULLs
SELECT COUNT(*) FROM my_tickets const dupQuery = `
WHERE game_type = ? AND draw_date = ? SELECT COUNT(*) FROM my_tickets
AND ball1 = ? AND ball2 = ? AND ball3 = ? WHERE game_type = ?
AND ball4 = ? AND ball5 = ? AND bonus1 IS ? AND bonus2 IS ?;` AND draw_date = ?
AND ball1 = ? AND ball2 = ? AND ball3 = ?
AND ball4 = ? AND ball5 = ?
AND bonus1 <=> ? AND bonus2 <=> ?;
`
var count int var count int
err := db.QueryRow(query, if err := db.QueryRow(dupQuery,
ticket.GameType, ticket.GameType,
ticket.DrawDate, ticket.DrawDate,
ticket.Ball1, ticket.Ball1,
@@ -41,30 +44,30 @@ func InsertTicket(db *sql.DB, ticket models.Ticket) error {
ticket.Ball5, ticket.Ball5,
bonus1Val, bonus1Val,
bonus2Val, bonus2Val,
).Scan(&count) ).Scan(&count); err != nil {
return err
}
isDuplicate := count > 0 isDuplicate := count > 0
insert := ` const insert = `
INSERT INTO my_tickets ( INSERT INTO my_tickets (
game_type, draw_date, game_type, draw_date,
ball1, ball2, ball3, ball4, ball5, ball1, ball2, ball3, ball4, ball5,
bonus1, bonus2, duplicate bonus1, bonus2, duplicate
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);` ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
`
_, err = db.Exec(insert, _, err := db.Exec(insert,
ticket.GameType, ticket.DrawDate, ticket.GameType, ticket.DrawDate,
ticket.Ball1, ticket.Ball2, ticket.Ball3, ticket.Ball1, ticket.Ball2, ticket.Ball3,
ticket.Ball4, ticket.Ball5, ticket.Ball4, ticket.Ball5,
bonus1Val, bonus2Val, bonus1Val, bonus2Val,
isDuplicate, isDuplicate,
) )
if err != nil { if err != nil {
log.Println("❌ Failed to insert ticket:", err) log.Println("❌ Failed to insert ticket:", err)
} else if isDuplicate { } else if isDuplicate {
log.Println("⚠️ Duplicate ticket detected and flagged.") log.Println("⚠️ Duplicate ticket detected and flagged.")
} }
return err return err
} }