current duplicate check uses IS ? which is fragile in MySQL. Using the NULL-safe equality operator <=> instead.
This commit is contained in:
@@ -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
|
||||||
|
const dupQuery = `
|
||||||
SELECT COUNT(*) FROM my_tickets
|
SELECT COUNT(*) FROM my_tickets
|
||||||
WHERE game_type = ? AND draw_date = ?
|
WHERE game_type = ?
|
||||||
|
AND draw_date = ?
|
||||||
AND ball1 = ? AND ball2 = ? AND ball3 = ?
|
AND ball1 = ? AND ball2 = ? AND ball3 = ?
|
||||||
AND ball4 = ? AND ball5 = ? AND bonus1 IS ? AND bonus2 IS ?;`
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user