aboutsummaryrefslogtreecommitdiff
path: root/app/SQL
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-02 22:49:35 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-02 22:49:35 +0200
commit7c1b5e322cca0134f57b3a436129985ba9170b9f (patch)
tree48e17355367549337a9bb2ba00237a5dbec2e240 /app/SQL
parent4a516aef583f4292293026ebc1d1a3984b75b4e8 (diff)
PostgreSQL draft
https://github.com/FreshRSS/FreshRSS/issues/416 Based on @Damstre work https://github.com/FreshRSS/FreshRSS/pull/1071 Not tested
Diffstat (limited to 'app/SQL')
-rw-r--r--app/SQL/install.sql.mysql.php2
-rw-r--r--app/SQL/install.sql.pgsql.php91
2 files changed, 93 insertions, 0 deletions
diff --git a/app/SQL/install.sql.mysql.php b/app/SQL/install.sql.mysql.php
index c78839ef7..92a00aecc 100644
--- a/app/SQL/install.sql.mysql.php
+++ b/app/SQL/install.sql.mysql.php
@@ -1,4 +1,6 @@
<?php
+define('SQL_CREATE_DB', 'CREATE DATABASE IF NOT EXISTS %1$s DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;');
+
define('SQL_CREATE_TABLES', '
CREATE TABLE IF NOT EXISTS `%1$scategory` (
`id` SMALLINT NOT NULL AUTO_INCREMENT, -- v0.7
diff --git a/app/SQL/install.sql.pgsql.php b/app/SQL/install.sql.pgsql.php
new file mode 100644
index 000000000..0f243bdb5
--- /dev/null
+++ b/app/SQL/install.sql.pgsql.php
@@ -0,0 +1,91 @@
+<?php
+define('SQL_CREATE_TABLES', '
+CREATE TABLE IF NOT EXISTS "%1$scategory" (
+ id SERIAL PRIMARY KEY,
+ name varchar(255) UNIQUE NOT NULL
+)
+
+CREATE TABLE IF NOT EXISTS "%1$sfeed" (
+ id SERIAL PRIMARY KEY,
+ url varchar(511) UNIQUE NOT NULL,
+ category SMALLINT DEFAULT 0,
+ name varchar(255) NOT NULL,
+ website varchar(255),
+ description text,
+ lastUpdate int DEFAULT 0,
+ priority smallint NOT NULL DEFAULT 10,
+ pathEntries varchar(511) DEFAULT NULL,
+ httpAuth varchar(511) DEFAULT NULL,
+ error boolean DEFAULT FALSE,
+ keep_history INT NOT NULL DEFAULT -2,
+ ttl INT NOT NULL DEFAULT -2,
+ cache_nbEntries int DEFAULT 0,
+ cache_nbUnreads int DEFAULT 0,
+ FOREIGN KEY (category) REFERENCES "%1$scategory" (id) ON DELETE SET NULL ON UPDATE CASCADE
+)
+CREATE INDEX name_index ON "%1$sfeed" (name)
+CREATE INDEX priority_index ON "%1$sfeed" (priority)
+CREATE INDEX keep_history_index ON "%1$sfeed" (keep_history)
+
+CREATE TABLE IF NOT EXISTS "%1$sentry" (
+ id bigint NOT NULL PRIMARY KEY,
+ guid varchar(760) UNIQUE NOT NULL,
+ title varchar(255) NOT NULL,
+ author varchar(255),
+ content_bin text,
+ link varchar(1023) NOT NULL,
+ date INT,
+ lastSeen INT DEFAULT 0,
+ hash BYTEA,
+ is_read boolean NOT NULL DEFAULT false,
+ is_favorite boolean NOT NULL DEFAULT false,
+ id_feed SMALLINT,
+ tags varchar(1023),
+ FOREIGN KEY (id_feed) REFERENCES "%1$sfeed" (id) ON DELETE CASCADE ON UPDATE CASCADE
+)
+CREATE INDEX is_favorite_index ON "%1$sentry" (is_favorite)
+CREATE INDEX is_read_index ON "%1$sentry" (is_read)
+CREATE INDEX entry_lastSeen_index ON "%1$sentry" (lastSeen)
+
+CREATE OR REPLACE FUNCTION update_unread_feed() RETURNS TRIGGER AS $$
+ BEGIN
+ UPDATE "%1$sfeed"
+ SET cache_nbUnreads=(SELECT COUNT(*) FROM "%1$sentry" WHERE id_feed=OLD.id_feed AND NOT is_read)
+ WHERE id=OLD.id_feed;
+ return NULL;
+ end;
+ $$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER update_unread_feed
+ AFTER UPDATE OF is_read OR DELETE OR INSERT ON "%1$sentry"
+ FOR EACH ROW
+ EXECUTE PROCEDURE update_unread_feed();
+
+CREATE OR REPLACE FUNCTION reset_feed_seq() RETURNS TRIGGER AS $$
+ BEGIN
+ PERFORM 1 FROM "%1$sfeed";
+ IF NOT FOUND THEN
+ ALTER SEQUENCE IF EXISTS "%1$sfeed_id_seq" RESTART;
+ END IF;
+ return NULL;
+ end;
+ $$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER reset_feed_seq
+ AFTER DELETE ON "%1$sfeed"
+ FOR EACH STATEMENT
+ EXECUTE PROCEDURE reset_feed_seq();
+
+
+CREATE OR REPLACE RULE check_constraints_on_entry AS ON INSERT TO "%1$sentry" WHERE EXISTS(SELECT 1 FROM "%1$sentry" WHERE guid=NEW.guid) DO INSTEAD NOTHING;
+CREATE OR REPLACE RULE check_constraints_on_feed AS ON INSERT TO "%1$sfeed" WHERE EXISTS(SELECT 1 FROM "%1$sfeed" WHERE url=NEW.url) DO INSTEAD NOTHING;
+CREATE OR REPLACE RULE check_constraints_on_category AS ON INSERT TO "%1$scategory" WHERE EXISTS(SELECT 1 FROM "%1$scategory" WHERE name=NEW.name) DO INSTEAD NOTHING;
+CREATE OR REPLACE RULE check_constraints_on_category as on update to "%1$scategory" WHERE EXISTS(SELECT 1 FROM "%1$scategory" WHERE name=NEW.name) DO INSTEAD NOTHING;
+
+
+INSERT IGNORE INTO "%1$scategory" (id, name) VALUES(1, "%2$s");
+INSERT IGNORE INTO "%1$sfeed" (url, category, name, website, description, ttl) VALUES("http://freshrss.org/feeds/all.atom.xml", 1, "FreshRSS.org", "http://freshrss.org/", "FreshRSS, a free, self-hostable aggregator…", 86400);
+INSERT IGNORE INTO "%1$sfeed" (url, category, name, website, description, ttl) VALUES("https://github.com/FreshRSS/FreshRSS/releases.atom", 1, "FreshRSS @ GitHub", "https://github.com/FreshRSS/FreshRSS/", "FreshRSS releases @ GitHub", 86400);
+');
+
+define('SQL_DROP_TABLES', 'DROP TABLES "%1$sentry", "%1$sfeed", "%1$scategory"');