Index: database.sql ================================================================== --- database.sql +++ database.sql @@ -13,80 +13,10 @@ LANGUAGE sql IMMUTABLE STRICT AS $_$ select array_agg(item) as result from (select distinct unnest($1) as item order by item) a; $_$; --- this functions returns id of site -create or replace function get_site(my_site text[]) returns integer - language plpgsql strict - as $$ -declare - site_id integer; -begin - select id_site from site where my_site = site into site_id; - if not found then - insert into site (site) values (my_site); - select id_site from site where my_site = site into site_id; - end if; - return site_id; -end; -$$; - -create or replace function get_site(domain text) returns integer - language sql immutable strict - as $$ -select get_site(tripdomain($1)) as result; -$$; - --- this function adds tag to domain -CREATE or replace FUNCTION mark(domain text, new_tag text) RETURNS integer - LANGUAGE sql immutable STRICT - AS $$ -select mark(get_site($1), $2) as result; -$$; - --- this function adds tag to site by site id -CREATE or replace FUNCTION mark(my_id_site integer, new_tag text) RETURNS integer - LANGUAGE plpgsql STRICT - AS $$ -declare - -- maybe check should be added to make sure supplied site id really exists - my_tag text[]; - my_tag_id integer; -begin - -- selecting tags site already have and adding new tag to them - -- note that tags should be sorted to eliminate permutations - select coalesce(tag, '{}'::text[]) from urls natural left join tag where id_site = my_id_site into my_tag; - if not found then - -- no records found - creating new tag - insert into urls (id_site, id_tag) values (my_id_site, get_tag(array[new_tag])); - else - -- joining tags - select usort(my_tag || array[new_tag]) into my_tag; - -- updating existing record - update urls set id_tag = get_tag(my_tag || array[new_tag]) where id_site = my_id_site; - end if; - return my_id_site; -end; -$$; - --- this function returns id of tag array -create or replace function get_tag(my_tag text[]) returns integer - language plpgsql strict - as $$ -declare - tag_id integer; -begin - select id_tag from tag where usort(my_tag) = tag into tag_id; - if not found then - insert into tag (tag) values (usort(my_tag)); - select id_tag from tag where usort(my_tag) = tag into tag_id; - end if; - return tag_id; -end; -$$; - -- transforms domain into ordered array for indexing CREATE or replace FUNCTION tripdomain(url text) RETURNS text[] LANGUAGE plpgsql IMMUTABLE STRICT AS $_$ declare @@ -123,10 +53,80 @@ x := x - 1; end loop; return array_to_string(splitted, '.'); end; $_$; + +-- this functions returns id of site +create or replace function get_site(my_site text[]) returns integer + language plpgsql strict + as $$ +declare + site_id integer; +begin + select id_site from site where my_site = site into site_id; + if not found then + insert into site (site) values (my_site); + select id_site from site where my_site = site into site_id; + end if; + return site_id; +end; +$$; + +create or replace function get_site(domain text) returns integer + language sql immutable strict + as $$ +select get_site(tripdomain($1)) as result; +$$; + +-- this function adds tag to site by site id +CREATE or replace FUNCTION mark(my_id_site integer, new_tag text) RETURNS integer + LANGUAGE plpgsql STRICT + AS $$ +declare + -- maybe check should be added to make sure supplied site id really exists + my_tag text[]; + my_tag_id integer; +begin + -- selecting tags site already have and adding new tag to them + -- note that tags should be sorted to eliminate permutations + select coalesce(tag, '{}'::text[]) from urls natural left join tag where id_site = my_id_site into my_tag; + if not found then + -- no records found - creating new tag + insert into urls (id_site, id_tag) values (my_id_site, get_tag(array[new_tag])); + else + -- joining tags + select usort(my_tag || array[new_tag]) into my_tag; + -- updating existing record + update urls set id_tag = get_tag(my_tag || array[new_tag]) where id_site = my_id_site; + end if; + return my_id_site; +end; +$$; + +-- this function adds tag to domain +CREATE or replace FUNCTION mark(domain text, new_tag text) RETURNS integer + LANGUAGE sql immutable STRICT + AS $$ +select mark(get_site($1), $2) as result; +$$; + +-- this function returns id of tag array +create or replace function get_tag(my_tag text[]) returns integer + language plpgsql strict + as $$ +declare + tag_id integer; +begin + select id_tag from tag where usort(my_tag) = tag into tag_id; + if not found then + insert into tag (tag) values (usort(my_tag)); + select id_tag from tag where usort(my_tag) = tag into tag_id; + end if; + return tag_id; +end; +$$; -- table to hold all rules CREATE TABLE rules ( netmask cidr NOT NULL, redirect_url text DEFAULT 'about::blank'::text NOT NULL, @@ -169,11 +169,11 @@ -- table to hold tag - site links CREATE TABLE urls ( date_added timestamp without time zone DEFAULT ('now'::text)::timestamp(0) without time zone NOT NULL, id_site smallint NOT NULL, id_tag smallint NOT NULL, - regex text + regexp text ); ALTER TABLE ONLY urls ADD CONSTRAINT urls_pkey PRIMARY KEY (date_added);