aboutsummaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
authorRasmus Fuhse <fuhse@data-quest.de>2024-01-17 16:46:09 +0000
committerRasmus Fuhse <fuhse@data-quest.de>2024-01-17 16:46:09 +0000
commitce27c274bd49733630a69b4467b72d3519f9974c (patch)
treee634260969a1cb3ea06f0bc87209292a385350f0 /db
parent6722029b73e7383856fd0777ca58863c7d0faab4 (diff)
Resolve "Wiki modernisieren"
Closes #3215 Merge request studip/studip!2180
Diffstat (limited to 'db')
-rw-r--r--db/migrations/5.5.23_modernize_wiki.php316
1 files changed, 316 insertions, 0 deletions
diff --git a/db/migrations/5.5.23_modernize_wiki.php b/db/migrations/5.5.23_modernize_wiki.php
new file mode 100644
index 0000000..a6b975a
--- /dev/null
+++ b/db/migrations/5.5.23_modernize_wiki.php
@@ -0,0 +1,316 @@
+<?
+
+final class ModernizeWiki extends Migration
+{
+
+ public function description()
+ {
+ return 'The wiki is getting better and mightier.';
+ }
+
+ protected function up()
+ {
+ DBManager::get()->exec("
+ CREATE TABLE `wiki_pages` (
+ `page_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `range_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
+ `name` varchar(255) NOT NULL,
+ `content` mediumtext DEFAULT NULL,
+ `parent_id` int(11) DEFAULT NULL,
+ `read_permission` varchar(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT 'all',
+ `write_permission` varchar(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT 'all',
+ `user_id` char(32) NOT NULL,
+ `locked_since` bigint(20) DEFAULT NULL,
+ `locked_by_user_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
+ `chdate` bigint(20) NOT NULL,
+ `mkdate` bigint(20) NOT NULL,
+ PRIMARY KEY (`page_id`),
+ KEY `read_permission` (`read_permission`),
+ KEY `write_permission` (`write_permission`),
+ KEY `range_id` (`range_id`)
+ )
+ ");
+ DBManager::get()->exec("
+ CREATE TABLE `wiki_versions` (
+ `version_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `page_id` int(11) unsigned NOT NULL,
+ `name` varchar(128) NOT NULL,
+ `content` text DEFAULT NULL,
+ `user_id` char(32) NOT NULL,
+ `mkdate` bigint(20) NOT NULL,
+ PRIMARY KEY (`version_id`),
+ KEY `page_id` (`page_id`),
+ KEY `mkdate` (`mkdate`)
+ )
+ ");
+
+ DBManager::get()->exec("
+ INSERT INTO `wiki_pages` (`range_id`, `name`, `content`, `parent_id`, `read_permission`, `write_permission`, `user_id`, `chdate`, `mkdate`)
+ SELECT `wiki`.`range_id`,
+ `wiki`.`keyword`,
+ `wiki`.`body`,
+ NULL,
+ IF(`wiki_page_config`.`read_restricted` > 0, 'tutor', 'all'),
+ IF(`wiki_page_config`.`edit_restricted` > 0, 'tutor', 'all'),
+ `wiki`.`user_id`,
+ `wiki`.`chdate`,
+ IFNULL(`wiki`.`mkdate`, UNIX_TIMESTAMP())
+ FROM `wiki`
+ INNER JOIN (
+ SELECT `wiki`.`range_id`, `wiki`.`keyword`, MAX(`version`) AS `version`
+ FROM `wiki`
+ GROUP BY `wiki`.`range_id`, `wiki`.`keyword`
+ ) AS `wiki_grouped` ON (`wiki_grouped`.`range_id` = `wiki`.`range_id` AND `wiki_grouped`.`keyword` = `wiki`.`keyword` AND `wiki_grouped`.`version` = `wiki`.`version`)
+ LEFT JOIN `wiki_page_config` ON (`wiki`.`keyword` = `wiki_page_config`.`keyword` AND `wiki_page_config`.`range_id` = `wiki_grouped`.`range_id`)
+ ");
+ DBManager::get()->exec("
+ UPDATE `wiki_pages`
+ SET `parent_id` = (
+ SELECT `wp`.`page_id`
+ FROM (SELECT * FROM `wiki_pages`) AS `wp`
+ INNER JOIN `wiki` ON (`wiki`.`range_id` = `wp`.`range_id` AND `wiki`.`keyword` = `wp`.`name`)
+ WHERE `wiki`.`ancestor` = `wiki_pages`.`name`
+ AND `wp`.`range_id` = `wiki_pages`.`range_id`
+ LIMIT 1
+ )
+ ");
+ DBManager::get()->exec("
+ INSERT INTO `wiki_versions` (`page_id`, `name`, `content`, `user_id`, `mkdate`)
+ SELECT `wiki_pages`.`page_id`,
+ `wiki`.`keyword`,
+ `wiki`.`body`,
+ `wiki`.`user_id`,
+ `wiki`.`mkdate`
+ FROM `wiki`
+ LEFT JOIN (
+ SELECT `wiki`.`range_id`, `keyword`, MAX(`version`) AS `version`
+ FROM `wiki`
+ GROUP BY `wiki`.`range_id`, `wiki`.`keyword`
+ ) AS `wiki_grouped` ON (`wiki`.`range_id` = `wiki_grouped`.`range_id` AND `wiki`.`keyword` = `wiki_grouped`.`keyword`)
+ INNER JOIN `wiki_pages` ON (`wiki_pages`.`name` = `wiki`.`keyword` AND `wiki_pages`.`range_id` = `wiki`.`range_id`)
+ WHERE `wiki`.`version` != `wiki_grouped`.`version`
+ ");
+
+ //first delete all orphaned entries:
+ DBManager::get()->exec("
+ DELETE FROM `wiki_links`
+ WHERE `from_keyword` NOT IN (SELECT `name` FROM `wiki_pages` WHERE `wiki_links`.`range_id` = `wiki_pages`.`range_id`)
+ OR `to_keyword` NOT IN (SELECT `name` FROM `wiki_pages` WHERE `wiki_links`.`range_id` = `wiki_pages`.`range_id`)
+ ");
+ DBManager::get()->exec("
+ UPDATE `wiki_links`
+ SET `from_keyword` = (SELECT `page_id` FROM `wiki_pages` WHERE `wiki_pages`.`name` = `wiki_links`.`from_keyword` AND `wiki_links`.`range_id` = `wiki_pages`.`range_id` LIMIT 1),
+ `to_keyword` = (SELECT `page_id` FROM `wiki_pages` WHERE `wiki_pages`.`name` = `wiki_links`.`to_keyword` AND `wiki_links`.`range_id` = `wiki_pages`.`range_id` LIMIT 1)
+ ");
+ DBManager::get()->exec("
+ ALTER TABLE `wiki_links`
+ CHANGE `from_keyword` `from_page_id` int(11) unsigned NOT NULL,
+ CHANGE `to_keyword` `to_page_id` int(11) unsigned NOT NULL,
+ CHANGE `range_id` `range_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT ''
+ ");
+
+ $statement = DBManager::get()->prepare("
+ INSERT IGNORE INTO config (field, value, type, `range`, mkdate, chdate, description)
+ VALUES (:name, :value, :type, :range, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :description)
+ ");
+ $statement->execute([
+ 'name' => 'WIKI_STARTPAGE_ID',
+ 'description' => 'ID der Wiki-Startseite des Wikis.',
+ 'range' => 'course',
+ 'type' => 'string',
+ 'value' => ''
+ ]);
+ $statement->execute([
+ 'name' => 'WIKI_CREATE_PERMISSION',
+ 'description' => 'Status, den es braucht, um neue Wiki-Seiten anzulegen.',
+ 'range' => 'course',
+ 'type' => 'string',
+ 'value' => 'all'
+ ]);
+ $statement->execute([
+ 'name' => 'WIKI_RENAME_PERMISSION',
+ 'description' => 'Status, den es braucht, um Wiki-Seiten umzubenennen.',
+ 'range' => 'course',
+ 'type' => 'string',
+ 'value' => 'all'
+ ]);
+
+ DBManager::get()->exec("
+ INSERT INTO `config_values` (`field`, `range_id`, `value`, `mkdate`, `chdate`, `comment`)
+ SELECT 'WIKI_STARTPAGE_ID', `wiki_pages`.`range_id`, `wiki_pages`.`page_id`, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), ''
+ FROM `wiki`
+ INNER JOIN `wiki_pages` ON (`wiki_pages`.`name` = `wiki`.`keyword` AND `wiki_pages`.`range_id` = `wiki`.`range_id`)
+ WHERE `keyword` = 'WikiWikiWeb'
+ GROUP BY `wiki`.`range_id`
+ ");
+ DBManager::get()->exec("
+ CREATE TABLE `wiki_online_editing_users` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `user_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
+ `page_id` int(11) NOT NULL,
+ `editing` tinyint(1) NOT NULL DEFAULT 0,
+ `editing_request` tinyint(1) NOT NULL DEFAULT 0,
+ `chdate` int(11) NOT NULL,
+ `mkdate` int(11) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `user_id_2` (`user_id`,`page_id`),
+ KEY `user_id` (`user_id`),
+ KEY `page_id` (`page_id`),
+ KEY `chdate` (`chdate`)
+ )
+ ");
+
+ //if SuperWiki installed
+ $superwiki_enabled = (bool) DBManager::get()->fetchColumn("SELECT 1 FROM `plugins` WHERE `pluginclassname` = 'SuperWiki' AND `enabled` = 'yes'");
+ if ($superwiki_enabled && !$GLOBALS['PREVENT_MIGRATE_SUPERWIKI']) {
+ DBManager::get()->exec("
+ INSERT INTO `wiki_pages` (`range_id`, `name`, `content`, `parent_id`, `read_permission`, `write_permission`, `user_id`, `chdate`, `mkdate`)
+ SELECT `superwiki_pages`.`seminar_id`,
+ `superwiki_pages`.`name`,
+ `superwiki_pages`.`content`,
+ NULL,
+ `superwiki_pages`.`read_permission`,
+ `superwiki_pages`.`write_permission`,
+ `superwiki_pages`.`last_author`,
+ `superwiki_pages`.`chdate`,
+ `superwiki_pages`.`mkdate`
+ FROM `superwiki_pages`
+ ");
+ DBManager::get()->exec("
+ INSERT INTO `wiki_versions` (`page_id`, `name`, `content`, `user_id`, `mkdate`)
+ SELECT `wiki_pages`.`page_id`,
+ `superwiki_versions`.`name`,
+ `superwiki_versions`.`content`,
+ `superwiki_versions`.`last_author`,
+ `superwiki_versions`.`chdate`
+ FROM `superwiki_versions`
+ INNER JOIN `superwiki_pages` ON (`superwiki_pages`.`page_id` = `superwiki_versions`.`page_id`)
+ INNER JOIN `wiki_pages` ON (`wiki_pages`.`range_id` = `superwiki_pages`.`seminar_id` AND `wiki_pages`.`name` = `superwiki_pages`.`name`)
+ ");
+ }
+ DBManager::get()->exec("
+ DROP TABLE `wiki`
+ ");
+ DBManager::get()->exec("
+ DROP TABLE `wiki_page_config`
+ ");
+ DBManager::get()->exec("
+ DROP TABLE `wiki_locks`
+ ");
+ }
+
+ protected function down()
+ {
+ DBManager::get()->exec("
+ DROP TABLE `wiki_online_editing_users`
+ ");
+ DBManager::get()->exec("
+ CREATE TABLE `wiki_locks` (
+ `user_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
+ `range_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
+ `keyword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
+ `chdate` int(10) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`range_id`,`user_id`,`keyword`),
+ KEY `user_id` (`user_id`),
+ KEY `chdate` (`chdate`)
+ )
+ ");
+ DBManager::get()->exec("
+ ALTER TABLE `wiki_links`
+ CHANGE `from_page_id` `from_keyword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
+ CHANGE `to_page_id` `to_keyword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
+ CHANGE `range_id` `range_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT ''
+ ");
+ DBManager::get()->exec("
+ UPDATE `wiki_links`
+ SET `from_keyword` = (SELECT `name` FROM `wiki_pages` WHERE `wiki_pages`.`page_id` = `wiki_links`.`from_keyword` AND `wiki_links`.`range_id` = `wiki_pages`.`range_id` LIMIT 1),
+ `to_keyword` = (SELECT `name` FROM `wiki_pages` WHERE `wiki_pages`.`page_id` = `wiki_links`.`to_keyword` AND `wiki_links`.`range_id` = `wiki_pages`.`range_id` LIMIT 1)
+ ");
+
+ DBManager::get()->exec("
+ CREATE TABLE `wiki` (
+ `range_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
+ `user_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
+ `keyword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
+ `body` mediumtext NOT NULL,
+ `ancestor` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
+ `chdate` int(10) unsigned DEFAULT NULL,
+ `version` int(11) NOT NULL DEFAULT 0,
+ `mkdate` int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (`range_id`,`keyword`,`version`),
+ KEY `user_id` (`user_id`),
+ KEY `chdate` (`chdate`)
+ )
+ ");
+
+ DBManager::get()->exec("
+ INSERT INTO `wiki` (`range_id`, `user_id`, `keyword`, `body`, `ancestor`, `chdate`, `version`, `mkdate`)
+ SELECT `wiki_pages`.`range_id`, `wiki_pages`.`last_author`, `wiki_pages`.`name`, `wiki_pages`.`content`, `wp2`.`name`, `wiki_pages`.`chdate`, COUNT(`wiki_versions`.`page_id`) + 1, `wiki_pages`.`mkdate`
+ FROM `wiki_pages`
+ LEFT JOIN `wiki_pages` AS wp2 ON (`wiki_pages`.`parent_id` = `wp2`.`page_id`)
+ LEFT JOIN `wiki_versions` ON (`wiki_versions`.`page_id` = `wiki_pages`.`page_id`)
+ GROUP BY `wiki_pages`.`page_id`
+ ");
+ DBManager::get()->exec("
+ INSERT INTO `wiki` (`range_id`, `user_id`, `keyword`, `body`, `ancestor`, `chdate`, `version`, `mkdate`)
+ SELECT `wiki_pages`.`range_id`, `wiki_versions`.`user_id`, `wiki_pages`.`name`, `wiki_versions`.`content`, `wp2`.`name`, `wiki_versions`.`chdate`, 1, `wiki_pages`.`mkdate`
+ FROM `wiki_versions`
+ LEFT JOIN `wiki_pages` ON (`wiki_pages`.`page_id` = `wiki_versions`.`page_id`)
+ LEFT JOIN `wiki_pages` AS `wp2` ON (`wp2`.`page_id` = `wiki_pages`.`parent_id`)
+ ORDER BY `wiki_versions`.`mkdate`
+ ");
+
+ DBManager::get()->exec("
+ CREATE TABLE `wiki_page_config` (
+ `range_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
+ `keyword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+ `read_restricted` tinyint(3) unsigned NOT NULL DEFAULT 0,
+ `edit_restricted` tinyint(3) unsigned NOT NULL DEFAULT 0,
+ `mkdate` int(10) unsigned DEFAULT NULL,
+ `chdate` int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (`range_id`,`keyword`)
+ )
+ ");
+ DBManager::get()->exec("
+ INSERT INTO `wiki_page_config` (`range_id`, `keyword`, `read_restricted`, `edit_restricted`, `chdate`, `mkdate`)
+ SELECT `wiki_pages`.`range_id`, `wiki_pages`.`name`, IF(`wiki_pages`.`read_permission` = 'all', 0, 1), IF(`wiki_pages`.`write_permission` = 'all', 0, 1), `wiki_pages`.`chdate`, `wiki_pages`.`mkdate`
+ FROM `wiki_pages`
+ ");
+
+ DBManager::get()->exec("
+ DROP TABLE `wiki_pages`
+ ");
+ DBManager::get()->exec("
+ DROP TABLE `wiki_versions`
+ ");
+ DBManager::get()->exec("
+ DROP TABLE `wiki_settings`
+ ");
+
+ DBManager::get()->exec("
+ DELETE FROM `config_values`
+ WHERE `field` = 'WIKI_STARTPAGE_ID'
+ ");
+ DBManager::get()->exec("
+ DELETE FROM `config`
+ WHERE `field` = 'WIKI_STARTPAGE_ID'
+ ");
+ DBManager::get()->exec("
+ DELETE FROM `config_values`
+ WHERE `field` = 'WIKI_CREATE_PERMISSION'
+ ");
+ DBManager::get()->exec("
+ DELETE FROM `config`
+ WHERE `field` = 'WIKI_CREATE_PERMISSION'
+ ");
+ DBManager::get()->exec("
+ DELETE FROM `config_values`
+ WHERE `field` = 'WIKI_RENAME_PERMISSION'
+ ");
+ DBManager::get()->exec("
+ DELETE FROM `config`
+ WHERE `field` = 'WIKI_RENAME_PERMISSION'
+ ");
+ }
+
+}