blob: 62d6b97da98307a2346a97b8fcba2b76cde18588 [file] [log] [blame]
CREATE TABLE bayes_expire (
id integer NOT NULL default '0',
runtime integer NOT NULL default '0'
) WITHOUT OIDS;
CREATE INDEX bayes_expire_idx1 ON bayes_expire (id);
CREATE TABLE bayes_global_vars (
variable varchar(30) NOT NULL default '',
value varchar(200) NOT NULL default '',
PRIMARY KEY (variable)
) WITHOUT OIDS;
INSERT INTO bayes_global_vars VALUES ('VERSION','3');
CREATE TABLE bayes_seen (
id integer NOT NULL default '0',
msgid varchar(200) NOT NULL default '',
flag character(1) NOT NULL default '',
PRIMARY KEY (id,msgid)
) WITHOUT OIDS;
CREATE TABLE bayes_token (
id integer NOT NULL default '0',
token bytea NOT NULL default '',
spam_count integer NOT NULL default '0',
ham_count integer NOT NULL default '0',
atime integer NOT NULL default '0',
PRIMARY KEY (id,token)
) WITHOUT OIDS;
CREATE INDEX bayes_token_idx1 ON bayes_token (token);
CREATE TABLE bayes_vars (
id serial NOT NULL,
username varchar(200) NOT NULL default '',
spam_count integer NOT NULL default '0',
ham_count integer NOT NULL default '0',
token_count integer NOT NULL default '0',
last_expire integer NOT NULL default '0',
last_atime_delta integer NOT NULL default '0',
last_expire_reduce integer NOT NULL default '0',
oldest_token_age integer NOT NULL default '2147483647',
newest_token_age integer NOT NULL default '0',
PRIMARY KEY (id)
) WITHOUT OIDS;
CREATE INDEX bayes_vars_idx1 ON bayes_vars (username);
CREATE OR REPLACE FUNCTION put_token(integer, bytea, integer, integer, integer) RETURNS bool AS '
DECLARE
inuserid ALIAS for $1;
intoken ALIAS for $2;
inspam_count ALIAS for $3;
inham_count ALIAS for $4;
inatime ALIAS for $5;
got_token record;
updated_atime_p bool;
BEGIN
updated_atime_p := FALSE;
SELECT INTO got_token spam_count, ham_count, atime
FROM bayes_token
WHERE id = inuserid
AND token = intoken;
IF NOT FOUND THEN
-- we do not insert negative counts, just return true
IF (inspam_count < 0 OR inham_count < 0) THEN
RETURN TRUE;
END IF;
INSERT INTO bayes_token (id, token, spam_count, ham_count, atime)
VALUES (inuserid, intoken, inspam_count, inham_count, inatime);
IF NOT FOUND THEN
RAISE EXCEPTION ''unable to insert into bayes_token'';
return FALSE;
END IF;
UPDATE bayes_vars SET token_count = token_count + 1
WHERE id = inuserid;
IF NOT FOUND THEN
RAISE EXCEPTION ''unable to update token_count in bayes_vars'';
return FALSE;
END IF;
UPDATE bayes_vars SET newest_token_age = inatime
WHERE id = inuserid AND newest_token_age < inatime;
IF NOT FOUND THEN
UPDATE bayes_vars
SET oldest_token_age = inatime
WHERE id = inuserid
AND oldest_token_age > inatime;
END IF;
return TRUE;
ELSE
IF (inspam_count != 0) THEN
-- no need to update atime if it is < the existing value
IF (inatime < got_token.atime) THEN
UPDATE bayes_token
SET spam_count = spam_count + inspam_count
WHERE id = inuserid
AND token = intoken
AND spam_count + inspam_count >= 0;
ELSE
UPDATE bayes_token
SET spam_count = spam_count + inspam_count,
atime = inatime
WHERE id = inuserid
AND token = intoken
AND spam_count + inspam_count >= 0;
IF FOUND THEN
updated_atime_p := TRUE;
END IF;
END IF;
END IF;
IF (inham_count != 0) THEN
-- no need to update atime is < the existing value or if it was already updated
IF inatime < got_token.atime OR updated_atime_p THEN
UPDATE bayes_token
SET ham_count = ham_count + inham_count
WHERE id = inuserid
AND token = intoken
AND ham_count + inham_count >= 0;
ELSE
UPDATE bayes_token
SET ham_count = ham_count + inham_count,
atime = inatime
WHERE id = inuserid
AND token = intoken
AND ham_count + inham_count >= 0;
IF FOUND THEN
updated_atime_p := TRUE;
END IF;
END IF;
END IF;
IF updated_atime_p THEN
UPDATE bayes_vars
SET oldest_token_age = inatime
WHERE id = inuserid
AND oldest_token_age > inatime;
END IF;
return TRUE;
END IF;
END;
' LANGUAGE 'plpgsql';