1 -- for the regression suite
4 \set httpd_user 'wikiuser'
6 \set page_tbl :prefix 'page'
7 \set page_id_seq :prefix 'page_id_seq'
8 \set page_id_idx :prefix 'page_id_idx'
9 \set page_name_idx :prefix 'page_name_idx'
11 \set version_tbl :prefix 'version'
12 \set vers_id_idx :prefix 'vers_id_idx'
13 \set vers_mtime_idx :prefix 'vers_mtime_idx'
15 \set recent_tbl :prefix 'recent'
16 \set recent_id_idx :prefix 'recent_id_idx'
17 \set recent_lv_idx :prefix 'recent_lv_idx'
19 \set nonempty_tbl :prefix 'nonempty'
20 \set nonmt_id_idx :prefix 'nonmt_id_idx'
22 \set link_tbl :prefix 'link'
23 \set link_from_idx :prefix 'link_from_idx'
24 \set link_to_idx :prefix 'link_to_idx'
25 \set relation_idx :prefix 'relation_idx'
27 \set pagedata_tbl :prefix 'pagedata'
28 \set pagedata_id_idx :prefix 'pagedata_id_idx'
29 \set versiondata_tbl :prefix 'versiondata'
30 \set pageperm_tbl :prefix 'pageperm'
31 \set pageperm_id_idx :prefix 'pageperm_id_idx'
32 \set pageperm_access_idx :prefix 'pageperm_access_idx'
33 \set existing_page_view :prefix 'existing_page'
34 \set curr_page_view :prefix 'curr_page'
36 \set session_tbl :prefix 'session'
37 \set sess_id_idx :prefix 'sess_id_idx'
38 \set sess_date_idx :prefix 'sess_date_idx'
39 \set sess_ip_idx :prefix 'sess_ip_idx'
41 \set pref_tbl :prefix 'pref'
42 \set pref_id_idx :prefix 'pref_id_idx'
43 \set pref_pkey :prefix 'pref_pkey'
45 --\set user_tbl :prefix 'users'
46 --\set user_id_idx :prefix 'users_id_idx'
47 \set member_tbl :prefix 'member'
48 \set member_id_idx :prefix 'member_id_idx'
49 \set member_group_idx :prefix 'member_group_idx'
51 \set rating_tbl :prefix 'rating'
52 \set rating_id_idx :prefix 'rating_id_idx'
54 \set accesslog_tbl :prefix 'accesslog'
55 \set accesslog_time_idx :prefix 'log_time_idx'
56 \set accesslog_host_idx :prefix 'log_host_idx'
58 \set update_recent_fn :prefix 'update_recent'
59 \set prepare_rename_fn :prefix 'prepare_rename_page'
61 \echo Dropping all test relations
63 DROP TABLE :version_tbl CASCADE;
64 DROP TABLE :recent_tbl CASCADE;
65 DROP TABLE :nonempty_tbl CASCADE;
66 DROP TABLE :link_tbl CASCADE;
67 DROP TABLE :rating_tbl CASCADE;
69 DROP TABLE :pagedata_tbl CASCADE;
70 DROP TABLE :versiondata_tbl CASCADE;
71 DROP TABLE :pageperm_tbl CASCADE;
73 DROP VIEW :existing_page_view;
74 DROP VIEW :curr_page_view;
76 DROP TABLE :page_tbl CASCADE;
77 --DROP SEQUENCE :page_id_seq;
79 DROP TABLE :member_tbl CASCADE;
80 DROP TABLE :pref_tbl CASCADE;
81 DROP TABLE :session_tbl CASCADE;
82 DROP TABLE :accesslog_tbl CASCADE;
84 DROP FUNCTION :update_recent_fn (INT4, INT4);
85 DROP FUNCTION :prepare_rename_fn (INT4, INT4);
87 ------------------------------------------------------------
89 \echo Creating :page_tbl
90 CREATE TABLE :page_tbl (
91 id SERIAL PRIMARY KEY,
92 pagename VARCHAR(100) NOT NULL UNIQUE CHECK (pagename <> ''),
93 hits INT4 NOT NULL DEFAULT 0,
94 pagedata TEXT NOT NULL DEFAULT '',
95 cached_html bytea DEFAULT ''
97 -- CREATE UNIQUE INDEX :page_id_idx ON :page_tbl (id);
98 -- CREATE UNIQUE INDEX :page_name_idx ON :page_tbl (pagename);
100 -- we use 0 <=> global_data to satisfy the relation = 0 constraint
101 INSERT INTO :page_tbl VALUES (0,'global_data',0,'','');
103 \echo Creating :version_tbl
104 CREATE TABLE :version_tbl (
105 id INT4 REFERENCES :page_tbl,
106 version INT4 NOT NULL,
108 -- FIXME: should use boolean, but that returns 't' or 'f'. not 0 or 1.
109 minor_edit INT2 DEFAULT 0,
110 -- use bytea instead?
111 content TEXT NOT NULL DEFAULT '',
112 versiondata TEXT NOT NULL DEFAULT ''
114 CREATE UNIQUE INDEX :vers_id_idx ON :version_tbl (id, version);
115 CREATE INDEX :vers_mtime_idx ON :version_tbl (mtime);
116 -- deletion order: version, recent, nonempty
118 \echo Creating :recent_tbl
119 CREATE TABLE :recent_tbl (
120 id INT4 REFERENCES :page_tbl,
124 FOREIGN KEY (id, latestversion) REFERENCES :version_tbl (id, version),
125 CHECK (latestminor >= latestmajor)
127 CREATE UNIQUE INDEX :recent_id_idx ON :recent_tbl (id);
128 CREATE INDEX :recent_lv_idx ON :recent_tbl (latestversion);
130 \echo Creating :nonempty_tbl
131 CREATE TABLE :nonempty_tbl (
132 id INT4 NOT NULL REFERENCES :page_tbl
134 CREATE UNIQUE INDEX :nonmt_id_idx ON :nonempty_tbl (id);
136 \echo Creating experimental pagedata (not yet used)
137 CREATE TABLE :pagedata_tbl (
138 id INT4 NOT NULL REFERENCES :page_tbl,
141 rest TEXT NOT NULL DEFAULT ''
143 CREATE INDEX :pagedata_id_idx ON pagedata (id);
145 \echo Creating experimental versiondata (not yet used)
146 CREATE TABLE :versiondata_tbl (
148 version INT4 NOT NULL,
149 markup INT2 DEFAULT 2,
151 author_id VARCHAR(48),
152 pagetype VARCHAR(20) DEFAULT 'wikitext',
153 rest TEXT NOT NULL DEFAULT '',
154 FOREIGN KEY (id, version) REFERENCES :version_tbl (id, version)
156 \echo Creating experimental pageperm (not yet used)
157 CREATE TABLE :pageperm_tbl (
158 id INT4 NOT NULL REFERENCES :page_tbl(id),
159 -- view,edit,create,list,remove,change,dump
160 access CHAR(12) NOT NULL,
161 groupname VARCHAR(48),
164 CREATE INDEX :pageperm_id_idx ON pageperm (id);
165 CREATE INDEX :pageperm_access_idx ON pageperm (access);
167 \echo Creating experimental page views (not yet used)
169 -- nonempty versiondata
170 CREATE VIEW :existing_page_view AS
171 SELECT * FROM :page_tbl P INNER JOIN :nonempty_tbl N USING (id);
173 -- latest page version
174 CREATE VIEW :curr_page_view AS
175 SELECT P.id,P.pagename,P.hits,P.pagedata,P.cached_html,
176 V.version,V.mtime,V.minor_edit,V.content,V.versiondata
178 JOIN :version_tbl V USING (id)
179 JOIN :recent_tbl R ON (V.id=R.id AND V.version=R.latestversion);
181 \echo Creating :link_tbl
182 CREATE TABLE :link_tbl (
183 linkfrom INT4 NOT NULL REFERENCES :page_tbl,
184 linkto INT4 NOT NULL REFERENCES :page_tbl,
187 CREATE INDEX :link_from_idx ON :link_tbl (linkfrom);
188 CREATE INDEX :link_to_idx ON :link_tbl (linkto);
189 CREATE INDEX :relation_idx ON :link_tbl (relation);
191 -- ALTER TABLE link DROP CONSTRAINT link_relation_fkey;
193 -- if you plan to use the wikilens theme
194 \echo Creating :rating_tbl
195 CREATE TABLE :rating_tbl (
196 dimension INTEGER NOT NULL,
197 raterpage INT8 NOT NULL REFERENCES :page_tbl,
198 rateepage INT8 NOT NULL REFERENCES :page_tbl,
199 ratingvalue FLOAT NOT NULL,
200 rateeversion INT8 NOT NULL,
201 tstamp TIMESTAMP NOT NULL
203 CREATE UNIQUE INDEX :rating_id_idx ON :rating_tbl (dimension, raterpage, rateepage);
205 --================================================================
206 -- end of page relations
207 --================================================================
209 \echo Creating :session_tbl
210 CREATE TABLE :session_tbl (
211 sess_id CHAR(32) PRIMARY KEY,
212 sess_data bytea NOT NULL,
214 sess_ip CHAR(40) NOT NULL
216 -- CREATE UNIQUE INDEX :sess_id_idx ON :session_tbl (sess_id);
217 CREATE INDEX :sess_date_idx ON :session_tbl (sess_date);
218 CREATE INDEX :sess_ip_idx ON :session_tbl (sess_ip);
220 -- Optional DB Auth and Prefs
221 -- For these tables below the default table prefix must be used
222 -- in the DBAuthParam SQL statements also.
224 \echo Creating :pref_tbl
225 CREATE TABLE :pref_tbl (
226 userid CHAR(48) PRIMARY KEY,
227 prefs TEXT NULL DEFAULT '',
228 passwd CHAR(48) DEFAULT '',
229 groupname CHAR(48) DEFAULT 'users'
231 -- CREATE UNIQUE INDEX :pref_id_idx ON :pref_tbl (userid);
232 CREATE INDEX pref_group_idx ON :pref_tbl (groupname);
234 -- Use the member table, if you need it for n:m user-group relations,
235 -- and adjust your DBAUTH_AUTH_ SQL statements.
236 CREATE TABLE :member_tbl (
237 userid CHAR(48) NOT NULL REFERENCES :pref_tbl,
238 groupname CHAR(48) NOT NULL DEFAULT 'users'
240 CREATE INDEX :member_id_idx ON :member_tbl (userid);
241 CREATE INDEX :member_group_idx ON :member_tbl (groupname);
243 -- if ACCESS_LOG_SQL > 0
244 -- only if you need fast log-analysis (spam prevention, recent referrers)
245 -- see http://www.outoforder.cc/projects/apache/mod_log_sql/docs-2.0/#id2756178
246 \echo Creating :accesslog_tbl
247 CREATE TABLE :accesslog_tbl (
249 remote_host VARCHAR(100),
250 remote_user VARCHAR(50),
251 request_method VARCHAR(10),
252 request_line VARCHAR(255),
253 request_args VARCHAR(255),
254 request_file VARCHAR(255),
255 request_uri VARCHAR(255),
256 request_time CHAR(28),
259 referer VARCHAR(255),
261 request_duration FLOAT
263 CREATE INDEX :accesslog_time_idx ON :accesslog_tbl (time_stamp);
264 CREATE INDEX :accesslog_host_idx ON :accesslog_tbl (remote_host);
265 -- create extra indices on demand (usually referer. see plugin/AccessLogSql)
267 --================================================================
269 -- Use the tsearch2 fulltextsearch extension: (recommended) 7.4, 8.0, 8.1
270 -- at first init it for the database:
271 -- $ psql phpwiki < /usr/share/postgresql/contrib/tsearch2.sql
273 -- example of ISpell dictionary
274 -- UPDATE pg_ts_dict SET dict_initoption='DictFile="/usr/local/share/ispell/russian.dict" ,AffFile ="/usr/local/share/ispell/russian.aff", StopFile="/usr/local/share/ispell/russian.stop"' WHERE dict_name='ispell_template';
275 -- example of synonym dict
276 -- UPDATE pg_ts_dict SET dict_initoption='/usr/local/share/ispell/english.syn' WHERE dict_id=5;
278 \echo Initializing tsearch2 indices
279 GRANT SELECT ON pg_ts_dict, pg_ts_parser, pg_ts_cfg, pg_ts_cfgmap TO :httpd_user;
280 ALTER TABLE :version_tbl ADD COLUMN idxFTI tsvector;
281 UPDATE :version_tbl SET idxFTI=to_tsvector('default', content);
283 CREATE INDEX idxFTI_idx ON :version_tbl USING gist(idxFTI);
285 CREATE TRIGGER tsvectorupdate BEFORE UPDATE OR INSERT ON :version_tbl
286 FOR EACH ROW EXECUTE PROCEDURE tsearch2(idxFTI, content);
288 --================================================================
290 \echo You might want to ignore the following errors or run
291 \echo /usr/sbin/createuser -S -R -d :httpd_user
293 \echo Applying permissions for role :httpd_user
294 GRANT SELECT,INSERT,UPDATE,DELETE ON :page_tbl TO :httpd_user;
295 GRANT SELECT,INSERT,UPDATE,DELETE ON :version_tbl TO :httpd_user;
296 GRANT SELECT,INSERT,UPDATE,DELETE ON :recent_tbl TO :httpd_user;
297 GRANT SELECT,INSERT,UPDATE,DELETE ON :nonempty_tbl TO :httpd_user;
298 GRANT SELECT,INSERT,UPDATE,DELETE ON :link_tbl TO :httpd_user;
300 GRANT SELECT,INSERT,UPDATE,DELETE ON :session_tbl TO :httpd_user;
301 -- you may want to fine tune this:
302 GRANT SELECT,INSERT,UPDATE,DELETE ON :pref_tbl TO :httpd_user;
303 -- GRANT SELECT ON :user_tbl TO :httpd_user;
304 GRANT SELECT ON :member_tbl TO :httpd_user;
305 GRANT SELECT,INSERT,UPDATE,DELETE ON :rating_tbl TO :httpd_user;
306 GRANT SELECT,INSERT,UPDATE,DELETE ON :accesslog_tbl TO :httpd_user;
308 --================================================================
309 -- some stored procedures to put unneccesary syntax into the server
311 \echo Initializing stored procedures
314 CREATE OR REPLACE FUNCTION :update_recent_fn (INT4, INT4)
315 RETURNS integer AS $$
316 DELETE FROM test_recent WHERE id = $1;
317 INSERT INTO test_recent (id, latestversion, latestmajor, latestminor)
318 SELECT id, MAX(version) AS latestversion,
319 MAX(CASE WHEN minor_edit = 0 THEN version END) AS latestmajor,
320 MAX(CASE WHEN minor_edit <> 0 THEN version END) AS latestminor
321 FROM test_version version WHERE id = $2 GROUP BY id;
322 DELETE FROM test_nonempty WHERE id = $1;
323 INSERT INTO test_nonempty (id)
325 FROM test_recent recent, test_version version
326 WHERE recent.id = version.id
327 AND version = latestversion
330 SELECT id FROM test_nonempty WHERE id = $1;
334 CREATE OR REPLACE FUNCTION :prepare_rename_fn (INT4, INT4)
336 DELETE FROM test_page WHERE id = $2;
337 DELETE FROM test_version WHERE id = $2;
338 DELETE FROM test_recent WHERE id = $2;
339 DELETE FROM test_nonempty WHERE id = $2;
340 -- We have to fix all referring tables to the old id
341 UPDATE test_link SET linkfrom = $1 WHERE linkfrom = $2;
342 UPDATE test_link SET linkto = $1 WHERE linkto = $2;