You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by gb...@apache.org on 2020/01/03 09:55:51 UTC
svn commit: r1872280 -
/spamassassin/trunk/lib/Mail/SpamAssassin/SQLBasedAddrList.pm
Author: gbechis
Date: Fri Jan 3 09:55:51 2020
New Revision: 1872280
URL: http://svn.apache.org/viewvc?rev=1872280&view=rev
Log:
use "ON CONFLICT UPDATE" when available (MySQL and PgSQL) instead
of printing errors on duplicate key violations
bz #7218
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/SQLBasedAddrList.pm
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/SQLBasedAddrList.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/SQLBasedAddrList.pm?rev=1872280&r1=1872279&r2=1872280&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/SQLBasedAddrList.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/SQLBasedAddrList.pm Fri Jan 3 09:55:51 2020
@@ -296,10 +296,20 @@ sub add_score {
my @args = ($self->{_username}, $email, $ip, 1, $score);
my $sql = sprintf("INSERT INTO %s (%s) VALUES (%s)", $self->{tablename},
join(',', @fields), join(',', ('?') x @fields));
+ if ($self->{dsn} =~ /DBI:pg/i) {
+ $sql .= " ON CONFLICT (username, email, signedby, ip) DO UPDATE set msgcount = ?, totscore = ?";
+ } elsif ($self->{dsn} =~ /DBI:mysql/i) {
+ $sql .= " ON DUPLICATE KEY UPDATE msgcount = ?, totscore = ?";
+ }
my $sth = $self->{dbh}->prepare($sql);
if (!$self->{_with_awl_signer}) {
- my $rc = $sth->execute(@args);
+ my $rc;
+ if ($self->{dsn} =~ /DBI:(pg|mysql)/i) {
+ $rc = $sth->execute(@args, $entry->{msgcount}, $score);
+ } else {
+ $rc = $sth->execute(@args);
+ }
if (!$rc) {
dbg("auto-whitelist: sql-based add_score/insert %s: SQL error: %s",
join('|',@args), $sth->errstr);
@@ -310,7 +320,12 @@ sub add_score {
}
} else {
for my $s (@signedby) {
- my $rc = $sth->execute(@args, $s);
+ my $rc;
+ if ($self->{dsn} =~ /DBI:(pg|mysql)/i) {
+ $rc = $sth->execute(@args, $s, $entry->{msgcount}, $score);
+ } else {
+ $rc = $sth->execute(@args, $s);
+ }
if (!$rc) {
dbg("auto-whitelist: sql-based add_score/insert %s: SQL error: %s",
join('|',@args,$s), $sth->errstr);
@@ -323,7 +338,7 @@ sub add_score {
}
}
- if (!$inserted) {
+ if (!$inserted && $self->{dsn} !~ /DBI:(pg|mysql)/i) {
# insert failed, assume primary key constraint, so try the update
my $sql = "UPDATE $self->{tablename} ".
@@ -346,7 +361,7 @@ sub add_score {
my $sth = $self->{dbh}->prepare($sql);
my $rc = $sth->execute(@args);
-
+
if (!$rc) {
info("auto-whitelist: sql-based add_score/update %s: SQL error: %s",
join('|',@args), $sth->errstr);
@@ -357,7 +372,7 @@ sub add_score {
$entry->{exists_p} = 1;
}
}
-
+
return $entry;
}