Lines 36-41
Link Here
|
36 |
use Mail::SpamAssassin::BayesStore; |
36 |
use Mail::SpamAssassin::BayesStore; |
37 |
use Mail::SpamAssassin::Logger; |
37 |
use Mail::SpamAssassin::Logger; |
38 |
use Digest::SHA1 qw(sha1); |
38 |
use Digest::SHA1 qw(sha1); |
|
|
39 |
use String::CRC32; |
39 |
|
40 |
|
40 |
use vars qw( @ISA ); |
41 |
use vars qw( @ISA ); |
41 |
|
42 |
|
Lines 238-244
Link Here
|
238 |
return %delta unless (defined($self->{_dbh})); |
239 |
return %delta unless (defined($self->{_dbh})); |
239 |
|
240 |
|
240 |
my $sql = "SELECT count(*) |
241 |
my $sql = "SELECT count(*) |
241 |
FROM bayes_token |
242 |
FROM $$self{_token_table} |
242 |
WHERE id = ? |
243 |
WHERE id = ? |
243 |
AND atime < ?"; |
244 |
AND atime < ?"; |
244 |
|
245 |
|
Lines 290-296
Link Here
|
290 |
my $too_old = $vars[10] - $newdelta; # tooold = newest - delta |
291 |
my $too_old = $vars[10] - $newdelta; # tooold = newest - delta |
291 |
|
292 |
|
292 |
# if token atime > newest, reset to newest ... |
293 |
# if token atime > newest, reset to newest ... |
293 |
my $sql = "UPDATE bayes_token SET atime = ? |
294 |
my $sql = "UPDATE $$self{_token_table} SET atime = ? |
294 |
WHERE id = ? |
295 |
WHERE id = ? |
295 |
AND atime > ?"; |
296 |
AND atime > ?"; |
296 |
|
297 |
|
Lines 303-309
Link Here
|
303 |
} |
304 |
} |
304 |
|
305 |
|
305 |
# Check to make sure the expire won't remove too many tokens |
306 |
# Check to make sure the expire won't remove too many tokens |
306 |
$sql = "SELECT count(token) FROM bayes_token |
307 |
$sql = "SELECT count(token) FROM $$self{_token_table} |
307 |
WHERE id = ? |
308 |
WHERE id = ? |
308 |
AND atime < ?"; |
309 |
AND atime < ?"; |
309 |
|
310 |
|
Lines 336-342
Link Here
|
336 |
} |
337 |
} |
337 |
else { |
338 |
else { |
338 |
# Do the expire |
339 |
# Do the expire |
339 |
$sql = "DELETE from bayes_token |
340 |
$sql = "DELETE from $$self{_token_table} |
340 |
WHERE id = ? |
341 |
WHERE id = ? |
341 |
AND atime < ?"; |
342 |
AND atime < ?"; |
342 |
|
343 |
|
Lines 628-634
Link Here
|
628 |
my $token_select = $self->_token_select_string(); |
629 |
my $token_select = $self->_token_select_string(); |
629 |
|
630 |
|
630 |
my $sql = "SELECT $token_select, spam_count, ham_count, atime |
631 |
my $sql = "SELECT $token_select, spam_count, ham_count, atime |
631 |
FROM bayes_token |
632 |
FROM $$self{_token_table} |
632 |
WHERE id = ? |
633 |
WHERE id = ? |
633 |
AND (spam_count > 0 OR ham_count > 0)"; |
634 |
AND (spam_count > 0 OR ham_count > 0)"; |
634 |
|
635 |
|
Lines 806-812
Link Here
|
806 |
return (0,0,0) unless (defined($self->{_dbh})); |
807 |
return (0,0,0) unless (defined($self->{_dbh})); |
807 |
|
808 |
|
808 |
my $sql = "SELECT spam_count, ham_count, atime |
809 |
my $sql = "SELECT spam_count, ham_count, atime |
809 |
FROM bayes_token |
810 |
FROM $$self{_token_table} |
810 |
WHERE id = ? |
811 |
WHERE id = ? |
811 |
AND token = ?"; |
812 |
AND token = ?"; |
812 |
|
813 |
|
Lines 861-867
Link Here
|
861 |
my $token_select = $self->_token_select_string(); |
862 |
my $token_select = $self->_token_select_string(); |
862 |
|
863 |
|
863 |
my $multi_sql = "SELECT $token_select, spam_count, ham_count, atime |
864 |
my $multi_sql = "SELECT $token_select, spam_count, ham_count, atime |
864 |
FROM bayes_token |
865 |
FROM $$self{_token_table} |
865 |
WHERE id = ? |
866 |
WHERE id = ? |
866 |
AND token IN "; |
867 |
AND token IN "; |
867 |
|
868 |
|
Lines 1058-1064
Link Here
|
1058 |
|
1059 |
|
1059 |
# shortcut, will only update atime for the token if the atime is less than |
1060 |
# shortcut, will only update atime for the token if the atime is less than |
1060 |
# what we are updating to |
1061 |
# what we are updating to |
1061 |
my $sql = "UPDATE bayes_token |
1062 |
my $sql = "UPDATE $$self{_token_table} |
1062 |
SET atime = ? |
1063 |
SET atime = ? |
1063 |
WHERE id = ? |
1064 |
WHERE id = ? |
1064 |
AND token = ? |
1065 |
AND token = ? |
Lines 1117-1123
Link Here
|
1117 |
|
1118 |
|
1118 |
return 1 unless (scalar(@{$tokens})); |
1119 |
return 1 unless (scalar(@{$tokens})); |
1119 |
|
1120 |
|
1120 |
my $sql = "UPDATE bayes_token SET atime = ? WHERE id = ? AND token IN ("; |
1121 |
my $sql = "UPDATE $$self{_token_table} SET atime = ? WHERE id = ? AND token IN ("; |
1121 |
|
1122 |
|
1122 |
my @bindings = ($atime, $self->{_userid}); |
1123 |
my @bindings = ($atime, $self->{_userid}); |
1123 |
foreach my $token (@{$tokens}) { |
1124 |
foreach my $token (@{$tokens}) { |
Lines 1176-1182
Link Here
|
1176 |
# cleanup was needed, go ahead and clear the cleanup flag |
1177 |
# cleanup was needed, go ahead and clear the cleanup flag |
1177 |
$self->{needs_cleanup} = 0; |
1178 |
$self->{needs_cleanup} = 0; |
1178 |
|
1179 |
|
1179 |
my $sql = "DELETE from bayes_token |
1180 |
my $sql = "DELETE from $$self{_token_table} |
1180 |
WHERE id = ? |
1181 |
WHERE id = ? |
1181 |
AND spam_count = 0 |
1182 |
AND spam_count = 0 |
1182 |
AND ham_count = 0"; |
1183 |
AND ham_count = 0"; |
Lines 1299-1305
Link Here
|
1299 |
return 0; |
1300 |
return 0; |
1300 |
} |
1301 |
} |
1301 |
|
1302 |
|
1302 |
$rows = $self->{_dbh}->do("DELETE FROM bayes_token WHERE id = ?", |
1303 |
$rows = $self->{_dbh}->do("DELETE FROM $$self{_token_table} WHERE id = ?", |
1303 |
undef, |
1304 |
undef, |
1304 |
$self->{_userid}); |
1305 |
$self->{_userid}); |
1305 |
unless (defined($rows)) { |
1306 |
unless (defined($rows)) { |
Lines 1338-1344
Link Here
|
1338 |
my $token_select = $self->_token_select_string(); |
1339 |
my $token_select = $self->_token_select_string(); |
1339 |
|
1340 |
|
1340 |
my $token_sql = "SELECT spam_count, ham_count, atime, $token_select |
1341 |
my $token_sql = "SELECT spam_count, ham_count, atime, $token_select |
1341 |
FROM bayes_token |
1342 |
FROM $$self{_token_table} |
1342 |
WHERE id = ? |
1343 |
WHERE id = ? |
1343 |
AND (spam_count > 0 OR ham_count > 0)"; |
1344 |
AND (spam_count > 0 OR ham_count > 0)"; |
1344 |
|
1345 |
|
Lines 1745-1751
Link Here
|
1745 |
} |
1746 |
} |
1746 |
} |
1747 |
} |
1747 |
|
1748 |
|
1748 |
my $sqlselect = "SELECT id FROM bayes_vars WHERE username = ?"; |
1749 |
my $sqlselect = "SELECT id, token_table FROM bayes_vars WHERE username = ?"; |
1749 |
|
1750 |
|
1750 |
my $sthselect = $self->{_dbh}->prepare_cached($sqlselect); |
1751 |
my $sthselect = $self->{_dbh}->prepare_cached($sqlselect); |
1751 |
|
1752 |
|
Lines 1761-1784
Link Here
|
1761 |
return 0; |
1762 |
return 0; |
1762 |
} |
1763 |
} |
1763 |
|
1764 |
|
1764 |
my ($id) = $sthselect->fetchrow_array(); |
1765 |
my ($id, $token_table) = $sthselect->fetchrow_array(); |
1765 |
|
1766 |
|
1766 |
if ($id) { |
1767 |
if ($id) { |
1767 |
$self->{_userid} = $id; |
1768 |
$self->{_userid} = $id; |
1768 |
dbg("bayes: Using userid: ".$self->{_userid}); |
1769 |
$self->{_token_table} = $token_table; |
|
|
1770 |
dbg("bayes: Using userid: ".$self->{_userid}.", token table: ".$self->{_token_table}); |
1769 |
$sthselect->finish(); |
1771 |
$sthselect->finish(); |
1770 |
return 1; |
1772 |
return 1; |
1771 |
} |
1773 |
} |
1772 |
|
1774 |
|
|
|
1775 |
$self->{_token_table} = "bayes_token"; |
1773 |
# Do not create an entry for this user unless we were specifically asked to |
1776 |
# Do not create an entry for this user unless we were specifically asked to |
1774 |
return 0 unless ($create_entry_p); |
1777 |
return 0 unless ($create_entry_p); |
1775 |
|
1778 |
|
1776 |
# For now let the database setup the other variables as defaults |
1779 |
# For now let the database setup the other variables as defaults |
1777 |
my $sqlinsert = "INSERT INTO bayes_vars (username) VALUES (?)"; |
1780 |
my $sqlinsert = "INSERT INTO bayes_vars (username, token_table) VALUES (?, ?)"; |
|
|
1781 |
if ($self->{bayes}->{conf}->{bayes_sql_token_table_count} |
1782 |
&& $self->{bayes}->{conf}->{bayes_sql_token_table_count} > 1) { |
1783 |
$self->{_token_table} = "bayes_token_" |
1784 |
. (crc32($self->{_username}) % $self->{bayes}->{conf}->{token_table_count}); |
1785 |
} |
1778 |
|
1786 |
|
1779 |
my $rows = $self->{_dbh}->do($sqlinsert, |
1787 |
my $rows = $self->{_dbh}->do($sqlinsert, |
1780 |
undef, |
1788 |
undef, |
1781 |
$self->{_username}); |
1789 |
$self->{_username}, |
|
|
1790 |
$self->{_token_table}); |
1782 |
unless (defined($rows)) { |
1791 |
unless (defined($rows)) { |
1783 |
dbg("bayes: _initialize_db: SQL error: ".$self->{_dbh}->errstr()); |
1792 |
dbg("bayes: _initialize_db: SQL error: ".$self->{_dbh}->errstr()); |
1784 |
return 0; |
1793 |
return 0; |
Lines 1843-1849
Link Here
|
1843 |
# if we are unable to find an entry. |
1852 |
# if we are unable to find an entry. |
1844 |
return 1 if ($spam_count < 0 || $ham_count < 0); |
1853 |
return 1 if ($spam_count < 0 || $ham_count < 0); |
1845 |
|
1854 |
|
1846 |
my $sql = "INSERT INTO bayes_token |
1855 |
my $sql = "INSERT INTO $$self{_token_table} |
1847 |
(id, token, spam_count, ham_count, atime) |
1856 |
(id, token, spam_count, ham_count, atime) |
1848 |
VALUES (?,?,?,?,?)"; |
1857 |
VALUES (?,?,?,?,?)"; |
1849 |
|
1858 |
|
Lines 1930-1936
Link Here
|
1930 |
my $sql; |
1939 |
my $sql; |
1931 |
my @args; |
1940 |
my @args; |
1932 |
if ($update_atime_p) { |
1941 |
if ($update_atime_p) { |
1933 |
$sql = "UPDATE bayes_token |
1942 |
$sql = "UPDATE $$self{_token_table} |
1934 |
SET spam_count = spam_count + ?, |
1943 |
SET spam_count = spam_count + ?, |
1935 |
atime = ? |
1944 |
atime = ? |
1936 |
WHERE id = ? |
1945 |
WHERE id = ? |
Lines 1940-1946
Link Here
|
1940 |
$updated_atime_p = 1; # note the fact that we did do it |
1949 |
$updated_atime_p = 1; # note the fact that we did do it |
1941 |
} |
1950 |
} |
1942 |
else { |
1951 |
else { |
1943 |
$sql = "UPDATE bayes_token |
1952 |
$sql = "UPDATE $$self{_token_table} |
1944 |
SET spam_count = spam_count + ? |
1953 |
SET spam_count = spam_count + ? |
1945 |
WHERE id = ? |
1954 |
WHERE id = ? |
1946 |
AND token = ? |
1955 |
AND token = ? |
Lines 1960-1966
Link Here
|
1960 |
my $sql; |
1969 |
my $sql; |
1961 |
my @args; |
1970 |
my @args; |
1962 |
if ($update_atime_p && !$updated_atime_p) { |
1971 |
if ($update_atime_p && !$updated_atime_p) { |
1963 |
$sql = "UPDATE bayes_token |
1972 |
$sql = "UPDATE $$self{_token_table} |
1964 |
SET ham_count = ham_count + ?, |
1973 |
SET ham_count = ham_count + ?, |
1965 |
atime = ? |
1974 |
atime = ? |
1966 |
WHERE id = ? |
1975 |
WHERE id = ? |
Lines 1970-1976
Link Here
|
1970 |
$updated_atime_p = 1; # note the fact that we did do it |
1979 |
$updated_atime_p = 1; # note the fact that we did do it |
1971 |
} |
1980 |
} |
1972 |
else { |
1981 |
else { |
1973 |
$sql = "UPDATE bayes_token |
1982 |
$sql = "UPDATE $$self{_token_table} |
1974 |
SET ham_count = ham_count + ? |
1983 |
SET ham_count = ham_count + ? |
1975 |
WHERE id = ? |
1984 |
WHERE id = ? |
1976 |
AND token = ? |
1985 |
AND token = ? |
Lines 2034-2040
Link Here
|
2034 |
my $atime_inserted_p = 0; |
2043 |
my $atime_inserted_p = 0; |
2035 |
my $new_tokens = 0; |
2044 |
my $new_tokens = 0; |
2036 |
|
2045 |
|
2037 |
my $insertsql = "INSERT INTO bayes_token |
2046 |
my $insertsql = "INSERT INTO $$self{_token_table} |
2038 |
(id, token, spam_count, ham_count, atime) |
2047 |
(id, token, spam_count, ham_count, atime) |
2039 |
VALUES (?,?,?,?,?)"; |
2048 |
VALUES (?,?,?,?,?)"; |
2040 |
|
2049 |
|
Lines 2101-2107
Link Here
|
2101 |
my $sql; |
2110 |
my $sql; |
2102 |
my @args; |
2111 |
my @args; |
2103 |
if ($update_atime_p) { |
2112 |
if ($update_atime_p) { |
2104 |
$sql = "UPDATE bayes_token |
2113 |
$sql = "UPDATE $$self{_token_table} |
2105 |
SET spam_count = spam_count + ?, |
2114 |
SET spam_count = spam_count + ?, |
2106 |
atime = ? |
2115 |
atime = ? |
2107 |
WHERE id = ? |
2116 |
WHERE id = ? |
Lines 2111-2117
Link Here
|
2111 |
$atime_updated_p = 1; |
2120 |
$atime_updated_p = 1; |
2112 |
} |
2121 |
} |
2113 |
else { |
2122 |
else { |
2114 |
$sql = "UPDATE bayes_token |
2123 |
$sql = "UPDATE $$self{_token_table} |
2115 |
SET spam_count = spam_count + ? |
2124 |
SET spam_count = spam_count + ? |
2116 |
WHERE id = ? |
2125 |
WHERE id = ? |
2117 |
AND token = ? |
2126 |
AND token = ? |
Lines 2131-2137
Link Here
|
2131 |
my @args; |
2140 |
my @args; |
2132 |
# if $spam_count then we already updated the atime |
2141 |
# if $spam_count then we already updated the atime |
2133 |
if ($update_atime_p && !$spam_count) { |
2142 |
if ($update_atime_p && !$spam_count) { |
2134 |
$sql = "UPDATE bayes_token |
2143 |
$sql = "UPDATE $$self{_token_table} |
2135 |
SET ham_count = ham_count + ?, |
2144 |
SET ham_count = ham_count + ?, |
2136 |
atime = ? |
2145 |
atime = ? |
2137 |
WHERE id = ? |
2146 |
WHERE id = ? |
Lines 2141-2147
Link Here
|
2141 |
$atime_updated_p = 1; |
2150 |
$atime_updated_p = 1; |
2142 |
} |
2151 |
} |
2143 |
else { |
2152 |
else { |
2144 |
$sql = "UPDATE bayes_token |
2153 |
$sql = "UPDATE $$self{_token_table} |
2145 |
SET ham_count = ham_count + ? |
2154 |
SET ham_count = ham_count + ? |
2146 |
WHERE id = ? |
2155 |
WHERE id = ? |
2147 |
AND token = ? |
2156 |
AND token = ? |
Lines 2219-2225
Link Here
|
2219 |
|
2228 |
|
2220 |
return 0 unless (defined($self->{_dbh})); |
2229 |
return 0 unless (defined($self->{_dbh})); |
2221 |
|
2230 |
|
2222 |
my $sql = "SELECT min(atime) FROM bayes_token |
2231 |
my $sql = "SELECT min(atime) FROM $$self{_token_table} |
2223 |
WHERE id = ?"; |
2232 |
WHERE id = ?"; |
2224 |
|
2233 |
|
2225 |
my $sth = $self->{_dbh}->prepare_cached($sql); |
2234 |
my $sth = $self->{_dbh}->prepare_cached($sql); |
Lines 2260-2266
Link Here
|
2260 |
return 0 unless (defined($self->{_dbh})); |
2269 |
return 0 unless (defined($self->{_dbh})); |
2261 |
|
2270 |
|
2262 |
my $sql = "SELECT count(*) |
2271 |
my $sql = "SELECT count(*) |
2263 |
FROM bayes_token |
2272 |
FROM $$self{_token_table} |
2264 |
WHERE id = ? |
2273 |
WHERE id = ? |
2265 |
AND spam_count + ham_count = 1"; |
2274 |
AND spam_count + ham_count = 1"; |
2266 |
|
2275 |
|
Lines 2302-2308
Link Here
|
2302 |
return 0 unless (defined($self->{_dbh})); |
2311 |
return 0 unless (defined($self->{_dbh})); |
2303 |
|
2312 |
|
2304 |
my $sql = "SELECT count(*) |
2313 |
my $sql = "SELECT count(*) |
2305 |
FROM bayes_token |
2314 |
FROM $$self{_token_table} |
2306 |
WHERE id = ? |
2315 |
WHERE id = ? |
2307 |
AND (spam_count >= 0 AND spam_count < 8) |
2316 |
AND (spam_count >= 0 AND spam_count < 8) |
2308 |
AND (ham_count >= 0 AND ham_count < 8) |
2317 |
AND (ham_count >= 0 AND ham_count < 8) |