Recent wiki table changes have problems on PostgreSQL 7.4 MDL-6724
[moodle.git] / mod / wiki / db / postgres7.php
1 <?PHP
3 function wiki_upgrade($oldversion) {
4 /// This function does anything necessary to upgrade 
5 /// older versions to match current functionality 
7     global $CFG;
9     if ($oldversion < 2004073000) {
11        modify_database("", "ALTER TABLE prefix_wiki_pages DROP COLUMN id;"); 
12        modify_database("", "ALTER TABLE ONLY prefix_wiki_pages 
13                             ADD CONSTRAINT id PRIMARY KEY (pagename, \"version\");"); 
14     }    
15     if ($oldversion < 2004073001) {
17        modify_database("", "ALTER TABLE prefix_wiki_pages DROP CONSTRAINT id;"); 
18        modify_database("", "ALTER TABLE ONLY prefix_wiki_pages 
19                             ADD CONSTRAINT id PRIMARY KEY (pagename, \"version\", wiki);"); 
20     }
21     if ($oldversion < 2004082200) {
22         table_column('wiki_pages', '', 'userid', "integer", "10", "unsigned", "0", "not null", "author");
23     }
24     if ($oldversion < 2004082303) {  // Try to update userid for old records
25         if ($pages = get_records('wiki_pages', 'userid', 0, 'pagename', 'lastmodified,author,pagename,version')) {
26             foreach ($pages as $page) {
27                 $name = explode('(', $page->author);
28                 $name = trim($name[0]);
29                 $name = explode(' ', $name);
30                 $firstname = $name[0];
31                 unset($name[0]);
32                 $lastname = trim(implode(' ', $name));
33                 if ($user = get_record('user', 'firstname', $firstname, 'lastname', $lastname)) {
34                     set_field('wiki_pages', 'userid', $user->id,                                                                                      'pagename', addslashes($page->pagename), 'version', $page->version);
35                 }
36             }
37         }
38     }
39     
40     if ($oldversion < 2004111200) {
41         execute_sql("DROP INDEX {$CFG->prefix}wiki_course_idx;",false);
42         execute_sql("DROP INDEX {$CFG->prefix}wiki_entries_wikiid_idx;",false); 
43         execute_sql("DROP INDEX {$CFG->prefix}wiki_entries_userid_idx;",false); 
44         execute_sql("DROP INDEX {$CFG->prefix}wiki_entries_groupid_idx;",false);
45         execute_sql("DROP INDEX {$CFG->prefix}wiki_entries_course_idx;",false); 
46         execute_sql("DROP INDEX {$CFG->prefix}wiki_entries_pagename_idx;",false);
48         modify_database('','CREATE INDEX prefix_wiki_course_idx ON prefix_wiki (course);');
49         modify_database('','CREATE INDEX prefix_wiki_entries_wikiid_idx ON prefix_wiki_entries (wikiid);');
50         modify_database('','CREATE INDEX prefix_wiki_entries_userid_idx ON prefix_wiki_entries (userid);');
51         modify_database('','CREATE INDEX prefix_wiki_entries_groupid_idx ON prefix_wiki_entries (groupid);');
52         modify_database('','CREATE INDEX prefix_wiki_entries_course_idx ON prefix_wiki_entries (course);');
53         modify_database('','CREATE INDEX prefix_wiki_entries_pagename_idx ON prefix_wiki_entries (pagename);');
54     }
57     if ($oldversion < 2004112400) {
58         execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP CONSTRAINT id;",false); 
59         execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP CONSTRAINT {$CFG->prefix}wiki_pages_id;",false); 
60         execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP CONSTRAINT {$CFG->prefix}wiki_pages_pagename_version_wiki_unique;",false);
61         modify_database("", "ALTER TABLE ONLY prefix_wiki_pages 
62                             ADD CONSTRAINT prefix_wiki_pages_pagename_version_wiki_unique PRIMARY KEY (pagename, \"version\", wiki);"); 
63     }
65     if ($oldversion < 2005022000) {
66         // recreating the wiki_pages table completelly (missing id, bug 2608)
67         if ($rows = count_records("wiki_pages")) {
68             // we need to use the temp stuff
69             modify_database("","CREATE TABLE prefix_wiki_pages_tmp (
70                 id SERIAL8 PRIMARY KEY, 
71                 pagename VARCHAR(160) NOT NULL,
72                 version INTEGER  NOT NULL DEFAULT 0,
73                 flags INTEGER  DEFAULT 0,
74                 content TEXT,
75                 author VARCHAR(100) DEFAULT 'ewiki',
76                 userid INTEGER  NOT NULL DEFAULT 0,
77                 created INTEGER  DEFAULT 0,
78                 lastmodified INTEGER  DEFAULT 0,
79                 refs TEXT,
80                 meta TEXT,
81                 hits INTEGER  DEFAULT 0,
82                 wiki INT8  NOT NULL);");
83             
84             execute_sql("INSERT INTO {$CFG->prefix}wiki_pages_tmp (pagename, version, flags, content,
85                                                                    author, userid, created, lastmodified,
86                                                                    refs, meta, hits, wiki) 
87                          SELECT pagename, version, flags, content,
88                                 author, userid, created, lastmodified,
89                                 refs, meta, hits, wiki
90                          FROM {$CFG->prefix}wiki_pages");
92             $insertafter = true;
93         }
95         execute_sql("DROP TABLE {$CFG->prefix}wiki_pages");
97         modify_database("","CREATE TABLE prefix_wiki_pages (
98             id SERIAL8 PRIMARY KEY, 
99             pagename VARCHAR(160) NOT NULL,
100             version INTEGER  NOT NULL DEFAULT 0,
101             flags INTEGER  DEFAULT 0,
102             content TEXT,
103             author VARCHAR(100) DEFAULT 'ewiki',
104             userid INTEGER  NOT NULL DEFAULT 0,
105             created INTEGER  DEFAULT 0,
106             lastmodified INTEGER  DEFAULT 0,
107             refs TEXT,
108             meta TEXT,
109             hits INTEGER  DEFAULT 0,
110             wiki INT8  NOT NULL);");
112         modify_database("","CREATE UNIQUE INDEX prefix_wiki_pages_pagename_version_wiki_uk 
113                             ON prefix_wiki_pages (pagename, version, wiki);");
114         
115         if (!empty($insertafter)) {
116             execute_sql("INSERT INTO {$CFG->prefix}wiki_pages (pagename, version, flags, content,
117                                                                author, userid, created, lastmodified,
118                                                                refs, meta, hits, wiki) 
119                          SELECT pagename, version, flags, content,
120                                 author, userid, created, lastmodified,
121                                 refs, meta, hits, wiki
122                          FROM {$CFG->prefix}wiki_pages_tmp");
124             execute_sql("DROP TABLE {$CFG->prefix}wiki_pages_tmp");
125         }
126     }
127     
128     if ($oldversion < 2006032900) {
129         global $db;
130         table_column("wiki_pages",'','content_base64','text');
131         table_column("wiki_pages",'','refs_base64','text');
132         $olddebug = $db->debug;
133         $db->debug = false;
134         $data = $db->GetAll("SELECT id,content,refs FROM {$CFG->prefix}wiki_pages");
135         foreach ($data as $d) {
136             $db->AutoExecute("{$CFG->prefix}wiki_pages", array('refs_base64' => base64_encode($d['refs']), 'content_base64' => base64_encode($d['content'])), 'UPDATE', 'id = '.$d['id']);
137         }
138         $db->debug = $olddebug;
139         execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP COLUMN content");
140         execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP COLUMN refs");
141         table_column("wiki_pages",'','content','bytea');
142         table_column("wiki_pages",'','refs','bytea');
143         execute_sql("UPDATE {$CFG->prefix}wiki_pages SET refs = decode(refs_base64, 'base64'), content = decode(content_base64, 'base64')");
144         execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP COLUMN content_base64");
145         execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP COLUMN refs_base64");
146     }
148     if ($oldversion < 2006042801) {
149         modify_database('', 'ALTER TABLE prefix_wiki_pages 
150             ALTER COLUMN content SET DEFAULT \'\'');
151         modify_database('', 'ALTER TABLE prefix_wiki_pages 
152             ALTER COLUMN refs SET DEFAULT \'\'');
153         modify_database('', 'ALTER TABLE prefix_wiki_pages 
154             ALTER COLUMN content DROP NOT NULL');
155         modify_database('', 'ALTER TABLE prefix_wiki_pages 
156             ALTER COLUMN refs DROP NOT NULL');
157     }
158     
159     if ($oldversion < 2006092502) {
160         modify_database("","
161 CREATE TABLE prefix_wiki_locks
163   id SERIAL PRIMARY KEY,
164   wikiid INTEGER NOT NULL,
165   pagename VARCHAR(160) NOT NULL DEFAULT '',
166   lockedby INTEGER NOT NULL DEFAULT 0,
167   lockedsince INTEGER NOT NULL DEFAULT 0,
168   lockedseen INTEGER NOT NULL DEFAULT 0
169 );"); 
170         modify_database("","CREATE INDEX prefix_wikilock_loc_ix ON prefix_wiki_locks (lockedseen);"); 
171         modify_database("","CREATE UNIQUE INDEX prefix_wikilock_wikpag_uix ON prefix_wiki_locks (wikiid, pagename);");  
172     }
173     
174     if($oldversion < 2006092602) {
175 /*
176             // This used to be a BYTEA type for no apparent reason, which caused various queries to fail. The new
177             // install.xml uses TEXT so I figure it's safe to change it in upgrade too. This one broke the links page...
178             modify_database('',"ALTER TABLE prefix_wiki_pages ALTER COLUMN refs DROP DEFAULT;");
179             modify_database('',"ALTER TABLE prefix_wiki_pages ALTER COLUMN refs TYPE TEXT USING ENCODE(refs,'escape');");
180             modify_database('',"ALTER TABLE prefix_wiki_pages ALTER COLUMN refs SET DEFAULT '';");
181                     // ...and this one broke the search page.
182             modify_database('',"ALTER TABLE prefix_wiki_pages ALTER COLUMN content DROP DEFAULT;");
183             modify_database('',"ALTER TABLE prefix_wiki_pages ALTER COLUMN content TYPE TEXT USING ENCODE(content,'escape');");
184             modify_database('',"ALTER TABLE prefix_wiki_pages ALTER COLUMN content SET DEFAULT '';");
185 */
186             // following code should be compatible with both pg 8.x and 7.4
187             table_column('wiki_pages', '', 'tempcontent', 'TEXT', '', '', '', '');
188             execute_sql("UPDATE {$CFG->prefix}wiki_pages SET tempcontent = ENCODE(content,'escape')");
189             execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP COLUMN content");
190             execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages RENAME COLUMN tempcontent TO content");
191             
192             table_column('wiki_pages', '', 'temprefs', 'TEXT', '', '', '', '');
193             execute_sql("UPDATE {$CFG->prefix}wiki_pages SET temprefs = ENCODE(refs,'escape')");
194             execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages DROP COLUMN refs");
195             execute_sql("ALTER TABLE {$CFG->prefix}wiki_pages RENAME COLUMN temprefs TO refs");
197     }
199     return true;
202 ?>