@@ -12,12 +12,17 @@ CREATE VIEW wiki.page AS
1212 pd .editor_id ,
1313 pl .markup ,
1414 pl .language ,
15- pd .created_on AS edited_on
15+ pd .created_on AS edited_on,
16+ pl .is_locked
1617 FROM wiki .page_latest AS pl, wiki .page_diff AS pd
1718 WHERE pl .id = pd .page_id
19+ AND is_deleted = FALSE
1820 UNION
19- SELECT *
20- FROM wiki .page_latest AS pl;
21+ SELECT pl .id , pl .title , pl .slug , pl .namespace , pl .content , pl .comment ,
22+ pl .num_lines , pl .revision , pl .editor_id , pl .markup , pl .language ,
23+ pl .edited_on , pl .is_locked
24+ FROM wiki .page_latest AS pl
25+ WHERE is_deleted = FALSE;
2126
2227CREATE OR REPLACE FUNCTION wiki .do_update_page_trigger() RETURNS trigger AS $$
2328declare
@@ -27,10 +32,14 @@ begin
2732 IF NOT FOUND THEN
2833 RAISE ' Page % not found' , id;
2934 END IF;
35+ IF latest .is_locked THEN
36+ RAISE ' Page % is locked for editing' , NEW .id ;
37+ END IF;
3038 IF latest .revision = NEW .revision THEN
3139 PERFORM wiki .update_page (NEW .id , NEW .content , NEW .editor_id , NEW .comment );
3240 ELSE
33- RAISE notice ' not updating revision % (latest is %)' , NEW .revision , latest .revision ;
41+ RAISE notice ' not updating old revision % of page % (latest revision is %)' ,
42+ NEW .revision , NEW .id , latest .revision ;
3443 END IF;
3544 RETURN null ;
3645end;
@@ -40,3 +49,47 @@ CREATE TRIGGER update_page_trigger
4049 INSTEAD OF UPDATE ON wiki .page
4150 FOR EACH ROW
4251 EXECUTE PROCEDURE wiki .do_update_page_trigger ();
52+
53+ CREATE OR REPLACE FUNCTION wiki .do_insert_page_trigger() RETURNS trigger AS $$
54+ declare
55+ num_lines int ;
56+ begin
57+ IF NEW .num_lines IS NULL THEN
58+ num_lines = array_length(string_to_array(NEW .content , E' \n ' ), 1 );
59+ ELSE
60+ num_lines = NEW .num_lines ;
61+ END IF;
62+ INSERT INTO wiki .page_latest (id, title, slug, namespace, content, comment,
63+ num_lines, editor_id, markup, language) VALUES
64+ (NEW .id , NEW .title , NEW .slug , NEW .namespace , NEW .content , NEW .comment ,
65+ num_lines, NEW .editor_id , NEW .markup , NEW .language );
66+ RETURN NEW;
67+ end;
68+ $$ language plpgsql;
69+
70+ CREATE TRIGGER insert_page_trigger
71+ INSTEAD OF INSERT ON wiki .page
72+ FOR EACH ROW
73+ EXECUTE PROCEDURE wiki .do_insert_page_trigger ();
74+
75+ CREATE OR REPLACE FUNCTION wiki .do_delete_page_trigger() RETURNS trigger AS $$
76+ declare
77+ latest wiki .page_latest ;
78+ begin
79+ SELECT * INTO latest FROM wiki .page_latest WHERE id = NEW .id ;
80+ IF NOT FOUND THEN
81+ RAISE ' Page % not found' , id;
82+ END IF;
83+ IF latest .is_deleted THEN
84+ RETURN null ;
85+ ELSE
86+ UPDATE wiki .page_latest SET is_deleted = TRUE WHERE id = OLD .id ;
87+ RETURN OLD;
88+ END IF;
89+ end;
90+ $$ language plpgsql;
91+
92+ CREATE TRIGGER delete_page_trigger
93+ INSTEAD OF DELETE ON wiki .page
94+ FOR EACH ROW
95+ EXECUTE PROCEDURE wiki .do_delete_page_trigger ();
0 commit comments