1fd3d44fc370733eb66ce623eddefed8b2ebd8e5
[moodle.git] / mod / wiki / db / upgradelib.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * @package   mod-wiki
20  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
21  */
23 function wiki_add_wiki_fields() {
24     global $DB;
26     upgrade_set_timeout();
27     $dbman = $DB->get_manager();
28     /// Define table wiki to be created
29     $table = new xmldb_table('wiki');
31     // Adding fields to wiki table
32     $wikitable = new xmldb_table('wiki');
34     // in MOODLE_20_SABLE branch, summary field is renamed as intro
35     // so we renamed it back to summary to keep upgrade going as moodle 1.9
36     $field = new xmldb_field('intro', XMLDB_TYPE_TEXT, 'medium', null, null, null, null, null);
37     if ($dbman->field_exists($wikitable, $field)) {
38         $dbman->rename_field($wikitable, $field, 'summary');
39     }
40     $dbman->add_field($wikitable, $field);
42     $field = new xmldb_field('introformat', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', null);
43     if (!$dbman->field_exists($wikitable, $field)) {
44         $dbman->add_field($wikitable, $field);
45     }
47     $field = new xmldb_field('firstpagetitle', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, 'First Page', null);
48     $dbman->add_field($wikitable, $field);
50     $field = new xmldb_field('wikimode', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, 'collaborative', null);
51     $dbman->add_field($wikitable, $field);
53     $field = new xmldb_field('defaultformat', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, 'creole', null);
54     $dbman->add_field($wikitable, $field);
56     $field = new xmldb_field('forceformat', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '1', null);
57     $dbman->add_field($wikitable, $field);
59     $field = new xmldb_field('scaleid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', null);
60     $dbman->add_field($wikitable, $field);
62     $field = new xmldb_field('editbegin', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', null);
63     $dbman->add_field($wikitable, $field);
65     $field = new xmldb_field('editend', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '0', null);
66     $dbman->add_field($wikitable, $field);
68 }
70 /**
71  * Install wiki 2.0 tables
72  */
73 function wiki_upgrade_install_20_tables() {
74     global $DB;
75     upgrade_set_timeout();
76     $dbman = $DB->get_manager();
78     /// Define table wiki_subwikis to be created
79     $table = new xmldb_table('wiki_subwikis');
81     /// Adding fields to table wiki_subwikis
82     $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
83     $table->add_field('wikiid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
84     $table->add_field('groupid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
85     $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
87     /// Adding keys to table wiki_subwikis
88     $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
89     $table->add_key('wikiidgroupiduserid', XMLDB_KEY_UNIQUE, array('wikiid', 'groupid', 'userid'));
90     $table->add_key('wikifk', XMLDB_KEY_FOREIGN, array('wikiid'), 'wiki', array('id'));
92     /// Conditionally launch create table for wiki_subwikis
93     if (!$dbman->table_exists($table)) {
94         $dbman->create_table($table);
95     }
97     /// Define table wiki_pages to be created
98     $table = new xmldb_table('wiki_pages');
100     /// Adding fields to table wiki_pages
101     $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
102     $table->add_field('subwikiid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
103     $table->add_field('title', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, 'title');
104     $table->add_field('cachedcontent', XMLDB_TYPE_TEXT, 'medium', null, XMLDB_NOTNULL, null, null);
105     $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
106     $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
107     $table->add_field('timerendered', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
108     $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
109     $table->add_field('pageviews', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
110     $table->add_field('readonly', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
112     /// Adding keys to table wiki_pages
113     $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
114     $table->add_key('subwikititleuser', XMLDB_KEY_UNIQUE, array('subwikiid', 'title', 'userid'));
115     $table->add_key('subwikifk', XMLDB_KEY_FOREIGN, array('subwikiid'), 'wiki_subwiki', array('id'));
117     /// Conditionally launch create table for wiki_pages
118     if (!$dbman->table_exists($table)) {
119         $dbman->create_table($table);
120     }
122     /// Define table wiki_versions to be created
123     $table = new xmldb_table('wiki_versions');
125     /// Adding fields to table wiki_versions
126     $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
127     $table->add_field('pageid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
128     $table->add_field('content', XMLDB_TYPE_TEXT, 'medium', null, XMLDB_NOTNULL, null, null);
129     $table->add_field('contentformat', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, 'creole');
130     $table->add_field('version', XMLDB_TYPE_INTEGER, '5', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
131     $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
132     $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
134     /// Adding keys to table wiki_versions
135     $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
136     $table->add_key('pagefk', XMLDB_KEY_FOREIGN, array('pageid'), 'wiki_pages', array('id'));
138     /// Conditionally launch create table for wiki_versions
139     if (!$dbman->table_exists($table)) {
140         $dbman->create_table($table);
141     }
143     /// Define table wiki_synonyms to be created
144     $table = new xmldb_table('wiki_synonyms');
146     /// Adding fields to table wiki_synonyms
147     $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
148     $table->add_field('subwikiid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
149     $table->add_field('pageid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
150     $table->add_field('pagesynonym', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, 'Pagesynonym');
152     /// Adding keys to table wiki_synonyms
153     $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
154     $table->add_key('pageidsyn', XMLDB_KEY_UNIQUE, array('pageid', 'pagesynonym'));
156     /// Conditionally launch create table for wiki_synonyms
157     if (!$dbman->table_exists($table)) {
158         $dbman->create_table($table);
159     }
161     /// Define table wiki_links to be created
162     $table = new xmldb_table('wiki_links');
164     /// Adding fields to table wiki_links
165     $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
166     $table->add_field('subwikiid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
167     $table->add_field('frompageid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
168     $table->add_field('topageid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
169     $table->add_field('tomissingpage', XMLDB_TYPE_CHAR, '255', null, null, null, null);
171     /// Adding keys to table wiki_links
172     $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
173     $table->add_key('frompageidfk', XMLDB_KEY_FOREIGN, array('frompageid'), 'wiki_pages', array('id'));
174     $table->add_key('subwikifk', XMLDB_KEY_FOREIGN, array('subwikiid'), 'wiki_subwiki', array('id'));
176     /// Conditionally launch create table for wiki_links
177     if (!$dbman->table_exists($table)) {
178         $dbman->create_table($table);
179     }
181     /// Define table wiki_locks to be created
182     $table = new xmldb_table('wiki_locks');
184     /// Adding fields to table wiki_locks
185     $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
186     $table->add_field('pageid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
187     $table->add_field('sectionname', XMLDB_TYPE_CHAR, '255', null, null, null, null);
188     $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
189     $table->add_field('lockedat', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
191     /// Adding keys to table wiki_locks
192     $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
194     /// Conditionally launch create table for wiki_locks
195     if (!$dbman->table_exists($table)) {
196         $dbman->create_table($table);
197     }
200 /**
201  * Migrating wiki pages history
202  */
203 function wiki_upgrade_migrate_versions() {
204     global $DB, $CFG, $OUTPUT;
205     require_once($CFG->dirroot . '/mod/wiki/db/migration/lib.php');
206     // need to move the binary data in db
207     $fs = get_file_storage();
208     // select all wiki pages history
209     $sql = "SELECT po.id AS oldpage_id, po.pagename AS oldpage_pagename, po.version, po.flags,
210                    po.content, po.author, po.userid AS oldpage_userid, po.created, po.lastmodified, po.refs, po.meta, po.hits, po.wiki,
211                    p.id AS newpage_id, p.subwikiid, p.title, p.cachedcontent, p.timecreated, p.timemodified AS newpage_timemodified,
212                    p.timerendered, p.userid AS newpage_userid, p.pageviews, p.readonly, e.id AS entry_id, e.wikiid, e.course AS entrycourse,
213                    e.groupid, e.userid AS entry_userid, e.pagename AS entry_pagename, e.timemodified AS entry_timemodified,
214                    w.id AS wiki_id, w.course AS wiki_course, w.name, w.summary AS summary, w.pagename AS wiki_pagename, w.wtype,
215                    w.ewikiprinttitle, w.htmlmode, w.ewikiacceptbinary, w.disablecamelcase, w.setpageflags, w.strippages, w.removepages,
216                    w.revertchanges, w.initialcontent, w.timemodified AS wiki_timemodified,
217                    cm.id AS cmid
218               FROM {wiki_pages_old} po
219               LEFT OUTER JOIN {wiki_entries_old} e ON e.id = po.wiki
220               LEFT OUTER JOIN {wiki} w ON w.id = e.wikiid
221               LEFT OUTER JOIN {wiki_subwikis} s ON e.groupid = s.groupid AND e.wikiid = s.wikiid AND e.userid = s.userid
222               LEFT OUTER JOIN {wiki_pages} p ON po.pagename = p.title AND p.subwikiid = s.id
223               JOIN {modules} m ON m.name = 'wiki'
224               JOIN {course_modules} cm ON (cm.module = m.id AND cm.instance = w.id)";
226     $pagesinfo = $DB->get_recordset_sql($sql, array());
228     foreach ($pagesinfo as $pageinfo) {
229         upgrade_set_timeout();
231         $mimetype = ewiki_mime_magic($pageinfo->content);
232         if (!empty($mimetype)) {
233             // if mimetype is not empty, means this is a file stored in db
234             $context = get_context_instance(CONTEXT_MODULE, $pageinfo->cmid);
235             // clean up file name
236             $filename = clean_param($pageinfo->oldpage_pagename, PARAM_FILE);
237             $filerecord = array('contextid' => $context->id,
238                                 'component' => 'mod_wiki',
239                                 'filearea'  => 'attachments',
240                                 'itemid'    => $pageinfo->subwikiid,
241                                 'filepath'  => '/',
242                                 'filename'  => $filename,
243                                 'userid'    => $pageinfo->oldpage_userid);
244             if (!$fs->file_exists($context->id, 'mod_wiki', 'attachments', $pageinfo->subwikiid, '/', $pageinfo->pagename)) {
245                 $storedfile = $fs->create_file_from_string($filerecord, $pageinfo->content);
246             }
248             // replace page content to a link point to the file
249             $pageinfo->content = "<a href='@@PLUGINFILE@@/$filename'>$pageinfo->oldpage_pagename</a>";
250         }
252         $oldpage = new StdClass();
253         $oldpage->id = $pageinfo->oldpage_id;
254         $oldpage->pagename = $pageinfo->oldpage_pagename;
255         $oldpage->version = $pageinfo->version;
256         $oldpage->flags = $pageinfo->flags;
257         $oldpage->content = $pageinfo->content;
258         $oldpage->author = $pageinfo->author;
259         $oldpage->userid = $pageinfo->oldpage_userid;
260         $oldpage->created = $pageinfo->created;
261         $oldpage->lastmodified = $pageinfo->lastmodified;
262         $oldpage->refs = $pageinfo->refs;
263         $oldpage->meta = $pageinfo->meta;
264         $oldpage->hits = $pageinfo->hits;
265         $oldpage->wiki = $pageinfo->wiki;
267         $page = new StdClass();
268         $page->id = $pageinfo->newpage_id;
269         $page->subwikiid = $pageinfo->subwikiid;
270         $page->title = $pageinfo->title;
271         $page->cachedcontent = $pageinfo->cachedcontent;
272         $page->timecreated = $pageinfo->timecreated;
273         $page->timemodified = $pageinfo->newpage_timemodified;
274         $page->timerendered = $pageinfo->timerendered;
275         $page->userid = $pageinfo->newpage_userid;
276         $page->pageviews = $pageinfo->pageviews;
277         $page->readonly = $pageinfo->readonly;
279         $entry = new StdClass();
280         $entry->id = $pageinfo->entry_id;
281         $entry->wikiid = $pageinfo->wikiid;
282         $entry->course = $pageinfo->entrycourse;
283         $entry->groupid = $pageinfo->groupid;
284         $entry->userid = $pageinfo->entry_userid;
285         $entry->pagename = $pageinfo->entry_pagename;
286         $entry->timemodified = $pageinfo->entry_timemodified;
288         $wiki = new StdClass();
289         $wiki->id = $pageinfo->wiki_id;
290         $wiki->course = $pageinfo->wiki_course;
291         $wiki->name = $pageinfo->name;
292         $wiki->summary = $pageinfo->summary;
293         $wiki->pagename = $pageinfo->wiki_pagename;
294         $wiki->wtype = $pageinfo->wtype;
295         $wiki->ewikiprinttitle = $pageinfo->ewikiprinttitle;
296         $wiki->htmlmode = $pageinfo->htmlmode;
297         $wiki->ewikiacceptbinary = $pageinfo->ewikiacceptbinary;
298         $wiki->disablecamelcase = $pageinfo->disablecamelcase;
299         $wiki->setpageflags = $pageinfo->setpageflags;
300         $wiki->strippages = $pageinfo->strippages;
301         $wiki->removepages = $pageinfo->removepages;
302         $wiki->revertchanges = $pageinfo->revertchanges;
303         $wiki->initialcontent = $pageinfo->initialcontent;
304         $wiki->timemodified = $pageinfo->wiki_timemodified;
306         $version = new StdClass();
307         $version->pageid = $page->id;
308         // convert wiki content to html format
309         $version->content = wiki_ewiki_2_html($entry, $oldpage, $wiki);
310         $version->contentformat = 'html';
311         $version->version = $oldpage->version;
312         $version->timecreated = $oldpage->lastmodified;
313         $version->userid = $oldpage->userid;
314         if ($version->version == 1) {
315             // The oldest version of page in moodle 2.0 is 0 which has empty content
316             // so we need to insert an extra record
317             try {
318                 $content = $version->content;
319                 $version->version = 0;
320                 $version->content = '';
321                 $DB->insert_record('wiki_versions', $version);
322                 $version->version = 1;
323                 $version->content = $content;
324                 $DB->insert_record('wiki_versions', $version);
325             } catch (dml_exception $e) {
326                 debugging($e->getMessage());
327             }
328         } else {
329             try {
330                 $DB->insert_record('wiki_versions', $version);
331             } catch (dml_exception $e) {
332                 debugging($e->getMessage());
333             }
334         }
335     }
337     $pagesinfo->close();