-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
pg_var.sql
109 lines (92 loc) · 3.71 KB
/
pg_var.sql
1
2
3
4
5
6
7
8
9
10
11
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
100
101
102
103
104
105
106
107
108
109
CREATE TABLE feed_items ("feed" TEXT NOT NULL REFERENCES "feeds" ("url") ON DELETE CASCADE,
"id" TEXT NOT NULL,
"title" TEXT,
"homepage" TEXT,
"published" TIMESTAMP NOT NULL,
"payment" TEXT,
"image" TEXT,
"updated" TIMESTAMP,
"xml" TEXT,
PRIMARY KEY ("feed", "id"));
CREATE INDEX feed_items_published ON feed_items ("published");
CREATE OR REPLACE FUNCTION feed_items_ensure_image() RETURNS trigger AS $$
BEGIN
IF NEW.image IS NULL OR NEW.image='' THEN
SELECT image INTO NEW.image FROM feeds WHERE url=NEW.feed;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER feed_items_ensure_image BEFORE INSERT OR UPDATE ON feed_items
FOR EACH ROW EXECUTE PROCEDURE feed_items_ensure_image();
CREATE TABLE enclosures ("feed" TEXT NOT NULL,
"item" TEXT NOT NULL,
"url" TEXT NOT NULL,
PRIMARY KEY ("feed", "item", "url"),
FOREIGN KEY ("feed", "item")
REFERENCES "feed_items" ("feed", "id")
ON DELETE CASCADE);
CREATE INDEX enclosures_url ON enclosures ("url");
CREATE INDEX enclosure_torrents_info_hash
ON enclosure_torrents (info_hash)
WHERE LENGTH(info_hash) = 20;
CREATE VIEW enclosures_to_hash AS
SELECT enclosures.url,
enclosure_torrents.last_update AS last_update,
enclosure_torrents.error AS error,
enclosure_torrents.info_hash
FROM enclosures LEFT JOIN enclosure_torrents
ON (enclosures.url=enclosure_torrents.url)
WHERE enclosure_torrents.info_hash IS NULL
OR LENGTH(enclosure_torrents.info_hash)=0 ORDER BY last_update NULLS FIRST;
CREATE OR REPLACE FUNCTION enclosure_to_hash(
min_inactivity INTERVAL DEFAULT '2 hours',
OUT enclosure_url TEXT
) RETURNS TEXT AS $$
DECLARE
next_url RECORD;
BEGIN
LOCK "enclosure_torrents" IN SHARE ROW EXCLUSIVE MODE;
SELECT enclosures_to_hash.url, enclosures_to_hash.last_update
INTO next_url
FROM enclosures_to_hash
LIMIT 1;
IF next_url.last_update IS NULL THEN
next_url.last_update = '1970-01-01 00:00:00';
END IF;
IF next_url.last_update <= CURRENT_TIMESTAMP - min_inactivity THEN
enclosure_url := next_url.url;
IF EXISTS (SELECT "url" FROM enclosure_torrents WHERE "url"=enclosure_url) THEN
UPDATE enclosure_torrents SET "last_update"=CURRENT_TIMESTAMP WHERE "url"=enclosure_url;
ELSE
INSERT INTO enclosure_torrents ("url", "last_update") VALUES (enclosure_url, CURRENT_TIMESTAMP);
END IF;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE VIEW torrentified AS
SELECT enclosures.url,
enclosure_torrents.last_update AS last_update,
enclosure_torrents.error AS error,
enclosure_torrents.info_hash
FROM enclosures LEFT JOIN enclosure_torrents
ON (enclosures.url=enclosure_torrents.url)
WHERE LENGTH(enclosure_torrents.info_hash)=20 ORDER BY last_update;
CREATE VIEW item_torrents AS
SELECT enclosures.feed, enclosures.item, enclosures.url,
enclosure_torrents.info_hash
FROM enclosure_torrents LEFT JOIN enclosures ON (enclosures.url=enclosure_torrents.url)
WHERE LENGTH(info_hash)=20;
CREATE OR REPLACE VIEW torrentified_items AS
SELECT *
FROM feed_items
WHERE EXISTS
(SELECT "url"
FROM enclosures
WHERE "feed"=feed_items.feed
AND "item"=feed_items.id
AND EXISTS (SELECT "url"
FROM torrentified
WHERE "url"=enclosures.url
)
) ORDER BY "published" DESC;