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 )