Squid url redirector

Diff
anonymous

Diff

Differences From Artifact [c71bdf1f8e]:

To Artifact [6f8e0e1cc8]:


12
13
14
15
16
17
18
19

20
21
22
23
24

25
26

27
28
29
30
31

32
33
34

35
36
37
38
39

40
41

42
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57
58
59
60
61
62
63

64
65
66
67
68
69

70
71
72
73

74
75
76

77
78
79
80
81


82


83
84
85








86
87
88


89
90

91
92
93
94
95
96
97
98
99
12
13
14
15
16
17
18

19
20
21
22
23

24
25

26
27
28
29
30

31
32
33

34
35
36
37
38

39
40
41
42
43
44
45
46
47



48





49



50
51
52
53

54
55
56
57
58
59

60
61
62
63

64
65
66

67
68
69
70


71
72
73
74
75
76


77
78
79
80
81
82
83
84
85


86
87
88

89


90
91
92
93
94
95
96







-
+




-
+

-
+




-
+


-
+




-
+


+





-
-
-
+
-
-
-
-
-

-
-
-




-
+





-
+



-
+


-
+



-
-
+
+

+
+

-
-
+
+
+
+
+
+
+
+

-
-
+
+

-
+
-
-







CREATE FUNCTION usort(original anyarray) RETURNS anyarray
	LANGUAGE sql IMMUTABLE STRICT
	AS $_$
select array_agg(item) as result from (select distinct unnest($1) as item order by item) a;
$_$;

-- this function adds tag to domain
CREATE FUNCTION mark(domain text, new_tag text) RETURNS void
CREATE or replace FUNCTION mark(domain text, new_tag text) RETURNS void
	LANGUAGE plpgsql STRICT
	AS $$
declare
	my_site text[];
	my_site_id smallint;
	my_id_site smallint;
	my_tag text[];
	my_tag_id smallint;
	my_id_tag smallint;
begin
	my_site := tripdomain(domain);

	-- selecting site id from table or adding site to the table
	select id_site from site where my_site = site into my_site_id;
	select id_site from site where my_site = site into my_id_site;
	if not found then
		insert into site (site) values (my_site);
		select id_site from site where my_site = site into my_site_id;
		select id_site from site where my_site = site into my_id_site;
	end if;

	-- selecting tags site already have and adding new tag to them
	-- note that tags should be sorted to eliminate permutations
	select tag from urls natural join tag where id_site = my_site_id into my_tag;
	select coalesce(tag, '{}'::text[]) from urls natural 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]));
		my_tag := array[new_tag];
	else
		-- joining tags
		select usort(my_tag || array[new_tag]) into my_tag;
		-- deleting old site specification
		delete from urls where id_site = my_site_id;
	end if;

		update urls set id_tag = get_tag(my_tag || array[new_tag]) where id_site = my_id_site;
	-- selecting new tag id or adding tag to the table
	select id_tag from tag where my_tag = tag into my_tag_id;
	if not found then
		insert into tag (tag) values(my_tag);
		select id_tag from tag where my_tag = tag into my_tag_id;
	end if;

	-- adding new site specification
	insert into urls (id_site, id_tag) values (my_site_id, my_tag_id);
end;
$$;

-- this function adds tag to site by site id
CREATE FUNCTION mark(my_site_id smallint, new_tag text) RETURNS void
CREATE or replace FUNCTION mark(my_id_site integer, new_tag text) RETURNS void
	LANGUAGE plpgsql STRICT
	AS $$
declare
	-- maybe check should be added to make sure supplied site id really exists
	my_tag text[];
	my_tag_id smallint;
	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 tag from urls natural join tag where id_site = my_site_id into my_tag;
	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
		my_tag := array[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;
		-- deleting old site specification
		delete from urls where id_site = my_site_id;
		-- updating existing record
		update urls set id_tag = get_tag(my_tag || array[new_tag]) where id_site = my_id_site;
	end if;
end;
$$;

	-- selecting new tag id or adding tag to the table
	select id_tag from tag where my_tag = tag into my_tag_id;
-- 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(my_tag);
		select id_tag from tag where my_tag = tag into my_tag_id;
		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;
	-- adding new site specification
	insert into urls (id_site, id_tag) values (my_site_id, my_tag_id);
end;
$$;

-- transforms domain into ordered array for indexing
CREATE FUNCTION tripdomain(url text) RETURNS text[]
	LANGUAGE plpgsql IMMUTABLE STRICT
	AS $_$
151
152
153
154
155
156
157
158

159
160
161
162
163
164
165
148
149
150
151
152
153
154

155
156
157
158
159
160
161
162







-
+







-- table to hold site arrays
CREATE TABLE site (
	id_site serial,
	site text[] NOT NULL
);

ALTER TABLE ONLY site
	ADD CONSTRAINT site_id PRIMARY KEY (id_site);
	ADD CONSTRAINT id_site PRIMARY KEY (id_site);

CREATE UNIQUE INDEX site_s ON site (usort(site));

CREATE INDEX site_g ON site USING gin (site);

-- table to hold tag combinations
CREATE TABLE tag (