Check for existing filter before inserting a new one

Signed-off-by: Andrew (anoa) <anoa@openmailbox.org>
This commit is contained in:
Andrew (anoa) 2017-11-05 10:38:31 -08:00
parent e5944e0fdb
commit 5a09d5123d
No known key found for this signature in database
GPG key ID: 174BEAB009FD176D

View file

@ -38,11 +38,15 @@ CREATE INDEX IF NOT EXISTS account_filter_localpart ON account_filter(localpart)
const selectFilterSQL = "" +
"SELECT filter FROM account_filter WHERE localpart = $1 AND id = $2"
const selectFilterByContentSQL = "" +
"SELECT filter FROM account_filter WHERE localpart = $1 AND filter = $2"
const insertFilterSQL = "" +
"INSERT INTO account_filter (filter, id, localpart) VALUES ($1, DEFAULT, $2) RETURNING id"
type filterStatements struct {
selectFilterStmt *sql.Stmt
selectFilterByContentStmt *sql.Stmt
insertFilterStmt *sql.Stmt
}
@ -54,6 +58,9 @@ func (s *filterStatements) prepare(db *sql.DB) (err error) {
if s.selectFilterStmt, err = db.Prepare(selectFilterSQL); err != nil {
return
}
if s.selectFilterByContentStmt, err = db.Prepare(selectFilterByContentSQL); err != nil {
return
}
if s.insertFilterStmt, err = db.Prepare(insertFilterSQL); err != nil {
return
}
@ -70,6 +77,15 @@ func (s *filterStatements) selectFilter(
func (s *filterStatements) insertFilter(
ctx context.Context, filter string, localpart string,
) (pos string, err error) {
var existingFilter string
// Check if filter already exists in the database
err = s.selectFilterByContentStmt.QueryRowContext(ctx,
localpart, filter).Scan(&existingFilter)
if existingFilter != "" {
return existingFilter, err
}
err = s.insertFilterStmt.QueryRowContext(ctx, filter, localpart).Scan(&pos)
return
}