diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-12-29 12:19:36 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-12-29 12:20:48 +0100 |
commit | 9db46ad3b00b1b70b0a86ec8fbc585fb5f448ff7 (patch) | |
tree | 5ff0ca88b977480ce859ab96d3ee4a0171412835 /sql/sql.go | |
parent | 3c1b7302454069b1eadbfe87d82d5f6bf1189dfc (diff) |
Fix deletion of log entries with zero answers
Diffstat (limited to 'sql/sql.go')
-rw-r--r-- | sql/sql.go | 36 |
1 files changed, 24 insertions, 12 deletions
@@ -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() } |