From 9db46ad3b00b1b70b0a86ec8fbc585fb5f448ff7 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Sun, 29 Dec 2019 12:19:36 +0100 Subject: Fix deletion of log entries with zero answers --- sql/sql.go | 36 ++++++++++++++++++++++++------------ sql/sql_test.go | 1 + 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/sql/sql.go b/sql/sql.go index 6763c8f..f33390d 100644 --- a/sql/sql.go +++ b/sql/sql.go @@ -185,23 +185,35 @@ func (c *Client) DeleteLogBefore(t time.Time) (err error) { return nil } defer tx.Rollback() - if _, err := tx.Exec("DELETE FROM log_rr_answer WHERE log_id IN (SELECT id FROM log WHERE time < $1)", t.Unix()); err != nil { - return err - } - if _, err := tx.Exec("DELETE FROM log WHERE id NOT IN (SELECT log_id FROM log_rr_answer)"); err != nil { + var ids []int64 + if err := tx.Select(&ids, "SELECT id FROM log WHERE time < $1", t.Unix()); err == sql.ErrNoRows { + return nil + } else if err != nil { return err } - if _, err := tx.Exec("DELETE FROM rr_type WHERE id NOT IN (SELECT rr_type_id FROM log)"); err != nil { - return err + deleteByIds := []string{ + "DELETE FROM log_rr_answer WHERE log_id IN (?)", + "DELETE FROM log WHERE id IN (?)", } - if _, err := tx.Exec("DELETE FROM rr_question WHERE id NOT IN (SELECT rr_question_id FROM log)"); err != nil { - return err + for _, q := range deleteByIds { + query, args, err := sqlx.In(q, ids) + if err != nil { + return err + } + if _, err := tx.Exec(query, args...); err != nil { + return err + } } - if _, err := tx.Exec("DELETE FROM rr_answer WHERE id NOT IN (SELECT rr_answer_id FROM log_rr_answer)"); err != nil { - return err + deleteBySelection := []string{ + "DELETE FROM rr_type WHERE id NOT IN (SELECT rr_type_id FROM log)", + "DELETE FROM rr_question WHERE id NOT IN (SELECT rr_question_id FROM log)", + "DELETE FROM rr_answer WHERE id NOT IN (SELECT rr_answer_id FROM log_rr_answer)", + "DELETE FROM remote_addr WHERE id NOT IN (SELECT remote_addr_id FROM log)", } - if _, err := tx.Exec("DELETE FROM remote_addr WHERE id NOT IN (SELECT remote_addr_id FROM log)"); err != nil { - return err + for _, q := range deleteBySelection { + if _, err := tx.Exec(q); err != nil { + return err + } } return tx.Commit() } diff --git a/sql/sql_test.go b/sql/sql_test.go index 9fc20e2..8c867ad 100644 --- a/sql/sql_test.go +++ b/sql/sql_test.go @@ -129,6 +129,7 @@ func TestDeleteLogBefore(t *testing.T) { } want := []LogEntry{ + {ID: 8, Question: "baz.example.com", Qtype: 28, Time: 1560647100, RemoteAddr: net.IPv4(192, 0, 2, 102)}, {ID: 7, Question: "baz.example.com", Qtype: 28, Answer: "2001:db8::4", Time: 1560641700, RemoteAddr: net.IPv4(192, 0, 2, 102)}, {ID: 6, Question: "bar.example.com", Qtype: 28, Answer: "2001:db8::3", Time: 1560641700, RemoteAddr: net.IPv4(192, 0, 2, 102)}, {ID: 6, Question: "bar.example.com", Qtype: 28, Answer: "2001:db8::2", Time: 1560641700, RemoteAddr: net.IPv4(192, 0, 2, 102)}, -- cgit v1.2.3