Mail-SpamAssassin
view release on metacpan or search on metacpan
lib/Mail/SpamAssassin/Conf/SQL.pm view on Meta::CPAN
local $SIG{'__DIE__'} = sub { die "$_[0]"; };
require DBI;
load_with_dbi($self, $username, $dsn);
1;
} or do {
my $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat;
if ($conf->{user_scores_fail_to_global}) {
info("config: failed to load user (%s) scores from SQL database, ".
"using a global default: %s", $username, $eval_stat);
return 1;
} else {
warn sprintf(
"config: failed to load user (%s) scores from SQL database: %s\n",
$username, $eval_stat);
return 0;
}
};
return 1;
}
sub load_with_dbi {
my ($self, $username, $dsn) = @_;
my $main = $self->{main};
my $conf = $main->{conf};
my $dbuser = $conf->{user_scores_sql_username};
my $dbpass = $conf->{user_scores_sql_password};
my $custom_query = $conf->{user_scores_sql_custom_query};
my $f_preference = 'preference';
my $f_value = 'value';
my $f_username = 'username';
my $f_table = 'userpref';
my $dbh = DBI->connect($dsn, $dbuser, $dbpass, {'PrintError' => 0});
if ($dbh) {
my $sql;
if (defined($custom_query)) {
$sql = $custom_query;
my $quoted_username = $dbh->quote($username);
my ($mailbox, $domain) = split('@', $username);
my $quoted_mailbox = $dbh->quote($mailbox);
my $quoted_domain = $dbh->quote($domain);
$sql =~ s/_USERNAME_/$quoted_username/g;
$sql =~ s/_TABLE_/$f_table/g;
$sql =~ s/_MAILBOX_/$quoted_mailbox/g;
$sql =~ s/_DOMAIN_/$quoted_domain/g;
}
else {
$sql = "select $f_preference, $f_value from $f_table where ".
"$f_username = ".$dbh->quote($username).
" or $f_username = '\@GLOBAL' order by $f_username asc";
}
dbg("config: Conf::SQL: executing SQL: $sql");
my $sth = $dbh->prepare($sql);
if ($sth) {
my $rv = $sth->execute();
if ($rv) {
dbg("config: retrieving prefs for $username from SQL server");
my @row;
my $config_text = '';
while (@row = $sth->fetchrow_array()) {
$config_text .= (defined($row[0]) ? $row[0] : '') . "\t" .
(defined($row[1]) ? $row[1] : '') . "\n";
}
if ($config_text ne '') {
$conf->{main} = $main;
$config_text = "file start (sql config)\n".
$config_text.
"file end (sql config)\n";
$conf->parse_scores_only($config_text);
delete $conf->{main};
}
$sth->finish();
undef $sth;
}
else {
die "config: SQL error: $sql\n".$sth->errstr."\n";
}
}
else {
die "config: SQL error: " . $dbh->errstr . "\n";
}
$dbh->disconnect();
}
else {
die "config: SQL error: " . DBI->errstr . "\n";
}
}
###########################################################################
sub sa_die { Mail::SpamAssassin::sa_die(@_); }
###########################################################################
1;
( run in 0.464 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )