|
23 | 23 | total_threads int DEFAULT 0 -- member's total threads created |
24 | 24 | ); |
25 | 25 |
|
26 | | - CREATE TABLE pref_type |
27 | | - ( |
28 | | - id serial PRIMARY KEY, |
29 | | - name text NOT NULL CHECK(name <> ''), |
30 | | - UNIQUE(name) |
31 | | - ); |
32 | | - INSERT INTO pref_type (name) VALUES ('input'); |
33 | | - INSERT INTO pref_type (name) VALUES ('checkbox'); |
34 | | - INSERT INTO pref_type (name) VALUES ('textarea'); |
35 | | - |
36 | | - CREATE TABLE pref |
37 | | - ( |
38 | | - id serial PRIMARY KEY, |
39 | | - pref_type_id int NOT NULL REFERENCES pref_type(id), |
40 | | - name text NOT NULL CHECK(name <> ''), |
41 | | - display text NOT NULL CHECK(display <> ''), |
42 | | - profile bool NOT NULL DEFAULT false, |
43 | | - editable bool NOT NULL DEFAULT true, |
44 | | - width int, |
45 | | - ordering int, |
46 | | - UNIQUE(name) |
47 | | - ); |
48 | | - |
49 | | - CREATE TABLE member_pref |
50 | | - ( |
51 | | - id serial PRIMARY KEY, |
52 | | - pref_id int NOT NULL, |
53 | | - member_id bigint NOT NULL, |
54 | | - value text NOT NULL CHECK(value <> '') |
55 | | - ); |
56 | | - |
57 | 26 | CREATE TABLE thread |
58 | 27 | ( |
59 | 28 | id bigserial UNIQUE PRIMARY KEY, |
|
93 | 62 | last_view_posts int NOT NULL DEFAULT 0 |
94 | 63 | ); |
95 | 64 |
|
96 | | - |
97 | | - CREATE TABLE message |
98 | | - ( |
99 | | - id bigserial UNIQUE PRIMARY KEY, |
100 | | - member_id bigint NOT NULL, -- id of member who created message |
101 | | - subject varchar(200) NOT NULL CHECK(subject <> ''), -- subject of message |
102 | | - first_post_id int, -- first post id for message |
103 | | - date_posted timestamp NOT NULL DEFAULT now(), -- date message was created |
104 | | - posts int DEFAULT 0, -- total posts in a message |
105 | | - views int DEFAULT 0, -- total views to message |
106 | | - last_member_id bigint NOT NULL, -- last member to reply |
107 | | - date_last_posted timestamp NOT NULL DEFAULT now() |
108 | | - ); |
109 | | - |
110 | | - CREATE TABLE message_post |
111 | | - ( |
112 | | - id bigserial UNIQUE PRIMARY KEY, |
113 | | - message_id int NOT NULL, -- message post belongs to |
114 | | - date_posted timestamp DEFAULT now(), -- time message post was created |
115 | | - member_id bigint NOT NULL, -- id of member who created message post |
116 | | - member_ip cidr NOT NULL, -- current ip address of member who created message post |
117 | | - body text -- body text of message post |
118 | | - ); |
119 | | - |
120 | | - CREATE TABLE message_member |
121 | | - ( |
122 | | - member_id bigint NOT NULL, |
123 | | - message_id bigint NOT NULL, |
124 | | - date_posted timestamp, |
125 | | - last_view_posts int NOT NULL DEFAULT 0, |
126 | | - deleted bool NOT NULL DEFAULT false |
127 | | - ); |
128 | | - |
129 | | - CREATE TABLE favorite |
130 | | - ( |
131 | | - id serial PRIMARY KEY, |
132 | | - member_id bigint NOT NULL, -- member who this watched thread belongs to |
133 | | - thread_id bigint NOT NULL -- thread member is watching |
134 | | - ); |
135 | | - |
136 | 65 | CREATE OR REPLACE FUNCTION member_sync() RETURNS trigger AS $$ |
137 | 66 | BEGIN |
138 | 67 | IF TG_OP = 'DELETE' THEN |
|
222 | 151 | END; |
223 | 152 | $$ LANGUAGE plpgsql; |
224 | 153 |
|
225 | | - |
226 | | - CREATE OR REPLACE FUNCTION message_post_sync() RETURNS trigger AS $$ |
227 | | - BEGIN |
228 | | - IF TG_OP = 'DELETE' THEN |
229 | | - IF (SELECT count(*) FROM message_post WHERE message_id=OLD.message_id) > 1 THEN |
230 | | - UPDATE |
231 | | - message |
232 | | - SET |
233 | | - posts=posts-1, |
234 | | - first_post_id=(SELECT id FROM message_post WHERE message_id=OLD.message_id ORDER BY date_posted ASC LIMIT 1), |
235 | | - last_member_id=(SELECT member_id FROM message_post WHERE message_id=OLD.message_id ORDER BY date_posted DESC LIMIT 1), |
236 | | - date_last_posted=(SELECT date_posted FROM message_post WHERE message_id=OLD. message_id ORDER BY date_posted DESC LIMIT 1) |
237 | | - WHERE |
238 | | - id=OLD.message_id; |
239 | | - ELSEIF (SELECT posts FROM message WHERE id=OLD.message_id) = 1 THEN |
240 | | - DELETE FROM message_member WHERE message_id=OLD.message_id; |
241 | | - DELETE FROM message WHERE id=OLD.message_id; |
242 | | - END IF; |
243 | | - IF (SELECT count(*) FROM message_post WHERE member_id=OLD.member_id AND message_id=OLD.message_id) = 0 THEN |
244 | | - DELETE FROM message_member WHERE member_id=OLD.member_id AND message_id=OLD.message_id; |
245 | | - END IF; |
246 | | - RETURN OLD; |
247 | | - ELSEIF TG_OP = 'INSERT' THEN |
248 | | - UPDATE |
249 | | - message |
250 | | - SET |
251 | | - posts=posts+1, |
252 | | - first_post_id=(SELECT id FROM message_post WHERE message_id=NEW.message_id ORDER BY date_posted ASC LIMIT 1), |
253 | | - last_member_id=(SELECT member_id FROM message_post WHERE message_id=NEW.message_id ORDER BY date_posted DESC LIMIT 1), |
254 | | - date_last_posted=now() |
255 | | - WHERE |
256 | | - id=NEW.message_id; |
257 | | - IF NOT EXISTS (SELECT 1 FROM message_member WHERE member_id=NEW.member_id AND message_id=NEW.message_id) THEN |
258 | | - INSERT INTO |
259 | | - message_member (member_id,message_id,date_posted,last_view_posts) |
260 | | - VALUES |
261 | | - (NEW.member_id,NEW.message_id,now(),(SELECT posts FROM message WHERE id=NEW.message_id)); |
262 | | - ELSE |
263 | | - UPDATE |
264 | | - message_member |
265 | | - SET |
266 | | - date_posted=now(), |
267 | | - last_view_posts=(SELECT posts FROM message WHERE id=NEW.message_id) |
268 | | - WHERE |
269 | | - member_id=NEW.member_id |
270 | | - AND |
271 | | - message_id=NEW.message_id; |
272 | | - END IF; |
273 | | - RETURN NEW; |
274 | | - END IF; |
275 | | - RETURN NULL; |
276 | | - END; |
277 | | - $$ LANGUAGE plpgsql; |
278 | | - |
279 | | - |
280 | | - CREATE OR REPLACE FUNCTION message_member_sync() RETURNS trigger AS $$ |
281 | | - BEGIN |
282 | | - IF TG_OP = 'UPDATE' THEN |
283 | | - IF NEW.deleted IS TRUE THEN |
284 | | - IF (SELECT count(*) FROM message_member WHERE message_id=OLD.message_id AND deleted IS false) < 1 THEN |
285 | | - DELETE FROM message_member WHERE message_id=OLD.message_id; |
286 | | - DELETE FROM message_post WHERE id=OLD.message_id; |
287 | | - END IF; |
288 | | - END IF; |
289 | | - END IF; |
290 | | - RETURN NULL; |
291 | | - END; |
292 | | - $$ LANGUAGE plpgsql; |
293 | | - |
294 | | - |
295 | 154 | CREATE OR REPLACE FUNCTION join(varchar,anyarray) RETURNS varchar AS $$ |
296 | 155 | DECLARE |
297 | 156 | sep ALIAS FOR $1; |
|
357 | 216 | FOR EACH ROW EXECUTE PROCEDURE member_sync(); |
358 | 217 | -- end member |
359 | 218 |
|
360 | | - |
361 | | - -- start member_pref |
362 | | - ALTER TABLE member_pref ADD FOREIGN KEY (pref_id) REFERENCES pref(id); |
363 | | - ALTER TABLE member_pref ADD FOREIGN KEY (member_id) REFERENCES member(id); |
364 | | - CREATE UNIQUE INDEX mp_mi_pi_index ON member_pref(member_id,pref_id); |
365 | | - -- end member_pref |
366 | | - |
367 | | - |
368 | 219 | -- start thread |
369 | 220 | CREATE INDEX thread_member_id_index ON thread(member_id); |
370 | 221 | CREATE INDEX thread_sticky_index ON thread(sticky); |
|
405 | 256 | ALTER TABLE thread_member ADD FOREIGN KEY (member_id) REFERENCES member(id); |
406 | 257 | ALTER TABLE thread_member ADD FOREIGN KEY (thread_id) REFERENCES thread(id); |
407 | 258 | -- end thread_member |
408 | | - |
409 | | - |
410 | | - -- start message |
411 | | - CREATE INDEX message_member_id_index ON message(member_id); |
412 | | - CREATE INDEX message_date_last_posted_index ON message(date_last_posted); |
413 | | - CLUSTER message_date_last_posted_index ON message; |
414 | | - |
415 | | - ALTER TABLE message ADD FOREIGN KEY (member_id) REFERENCES member(id); |
416 | | - ALTER TABLE message ADD FOREIGN KEY (last_member_id) REFERENCES member(id); |
417 | | - -- end message |
418 | | - |
419 | | - |
420 | | - -- start message_member |
421 | | - CREATE UNIQUE INDEX mm_mi_mi_lvr ON message_member(member_id,message_id,last_view_posts); |
422 | | - |
423 | | - ALTER TABLE message_member ADD FOREIGN KEY (member_id) REFERENCES member(id); |
424 | | - ALTER TABLE message_member ADD FOREIGN KEY (message_id) REFERENCES message(id); |
425 | | - |
426 | | - CREATE TRIGGER message_post_sync AFTER INSERT OR DELETE OR UPDATE ON message_member |
427 | | - FOR EACH ROW EXECUTE PROCEDURE message_member_sync(); |
428 | | - -- end message_member |
429 | | - |
430 | | - |
431 | | - -- start message_post |
432 | | - CREATE INDEX message_post_member_id_index ON message_post(member_id); |
433 | | - CREATE INDEX message_post_message_id_index ON message_post(message_id); |
434 | | - CREATE INDEX message_post_date_posted_index ON message_post(date_posted); |
435 | | - CREATE INDEX message_post_member_ip ON message_post(member_ip); |
436 | | - |
437 | | - ALTER TABLE message_post ADD FOREIGN KEY (member_id) REFERENCES member(id); |
438 | | - ALTER TABLE message_post ADD FOREIGN KEY (message_id) REFERENCES message(id); |
439 | | - |
440 | | - CREATE TRIGGER message_post_sync AFTER INSERT OR DELETE ON message_post |
441 | | - FOR EACH ROW EXECUTE PROCEDURE message_post_sync(); |
442 | | - -- end message_post |
443 | | - |
444 | | - |
445 | | - -- start favorites |
446 | | - CREATE INDEX favorite_member_id_thread_id_index ON favorite(member_id,thread_id); |
447 | | - |
448 | | - ALTER TABLE favorite ADD FOREIGN KEY (member_id) REFERENCES member(id); |
449 | | - ALTER TABLE favorite ADD FOREIGN KEY (thread_id) REFERENCES thread(id); |
450 | | - -- end favorites |
0 commit comments