aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sql/sql.go36
-rw-r--r--sql/sql_test.go1
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)},