Skip to content

Commit 5869a2a

Browse files
Update to my latest code from Dropbox
1 parent a3664eb commit 5869a2a

File tree

3 files changed

+60
-69
lines changed

3 files changed

+60
-69
lines changed

patch.sql

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -136,47 +136,3 @@ begin
136136
end;
137137
$$ language plpgsql STABLE STRICT;
138138

139-
/*
140-
create or replace function wiki.get_page_at_revision(page_id int, revision int)
141-
returns wiki.page as $$
142-
#variable_conflict use_variable
143-
declare
144-
latest wiki.page_latest;
145-
diff wiki.page_diff;
146-
content text;
147-
num_lines int;
148-
result wiki.page;
149-
begin
150-
IF revision < 1 THEN
151-
RAISE 'Revision must be positive (got %)', revision;
152-
END IF;
153-
SELECT * INTO latest FROM wiki.page_latest WHERE id = page_id;
154-
IF NOT FOUND THEN
155-
RAISE 'Page % not found', id;
156-
END IF;
157-
IF revision > latest.revision THEN
158-
RAISE 'Revision does not exist (requested %, latest is %)', revision,
159-
latest.revision;
160-
END IF;
161-
IF revision = latest.revision THEN
162-
result := latest::wiki.page;
163-
RETURN result;
164-
END IF;
165-
SELECT * INTO diff FROM wiki.page_diff AS pd
166-
WHERE pd.page_id = page_id
167-
AND pd.revision = revision;
168-
IF NOT FOUND THEN
169-
RAISE 'Revision % for page % not found', revision, page_id;
170-
END IF;
171-
172-
content := wiki.get_content_at_revision(page_id, revision);
173-
num_lines := wiki.get_num_lines_at_revision(page_id, revision);
174-
175-
result := (latest.id, latest.title, latest.slug, latest.namespace,
176-
content, diff.comment, num_lines, revision, diff.editor, latest.markup,
177-
latest.language, diff.created_on);
178-
RETURN result;
179-
end;
180-
$$ language plpgsql
181-
STABLE STRICT;
182-
*/

tables.sql

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ CREATE TABLE wiki.page_latest (
2424
editor_id int REFERENCES wiki.editor(id),
2525
markup varchar(64) DEFAULT 'plain',
2626
language varchar(8) NOT NULL,
27-
edited_on timestamp DEFAULT now() NOT NULL
27+
edited_on timestamp DEFAULT now() NOT NULL,
28+
is_locked boolean DEFAULT FALSE NOT NULL,
29+
is_deleted boolean DEFAULT FALSE NOT NULL
2830
);
2931

3032
DROP TABLE IF EXISTS wiki.page_diff CASCADE;
@@ -83,23 +85,3 @@ CREATE OPERATOR && (
8385
procedure = wiki.hunk_overlap,
8486
commutator = &&
8587
);
86-
87-
/*
88-
DROP TABLE IF EXISTS wiki.page;
89-
CREATE TABLE wiki.page (LIKE page_latest);
90-
91-
CREATE OR REPLACE FUNCTION wiki.page_latest_to_page(wiki.page_latest)
92-
returns wiki.page as $$
93-
declare
94-
result wiki.page;
95-
begin
96-
result := ($1.id, $1.title, $1.slug, $1.namespace, $1.content, $1.comment,
97-
$1.num_lines, $1.revision, $1.editor_id, $1.markup, $1.language,
98-
$1.edited_on);
99-
RETURN result;
100-
end;
101-
$$ language plpgsql IMMUTABLE STRICT;
102-
103-
CREATE CAST (wiki.page_latest AS wiki.page)
104-
WITH FUNCTION wiki.page_latest_to_page(wiki.page_latest);
105-
*/

virtual.sql

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2227
CREATE OR REPLACE FUNCTION wiki.do_update_page_trigger() RETURNS trigger AS $$
2328
declare
@@ -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;
3645
end;
@@ -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

Comments
 (0)