187106851SAnna Dabrowska<?php 287106851SAnna Dabrowska 387106851SAnna Dabrowskaclass action_plugin_structpublish_migration extends DokuWiki_Action_Plugin 487106851SAnna Dabrowska{ 5*bcee0e72SAnna Dabrowska const MIN_DB_STRUCT = 19; 6*bcee0e72SAnna Dabrowska 787106851SAnna Dabrowska /** 887106851SAnna Dabrowska * @inheritDoc 987106851SAnna Dabrowska */ 1087106851SAnna Dabrowska public function register(Doku_Event_Handler $controller) 1187106851SAnna Dabrowska { 1287106851SAnna Dabrowska $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleMigrations'); 1387106851SAnna Dabrowska } 1487106851SAnna Dabrowska 1587106851SAnna Dabrowska /** 1687106851SAnna Dabrowska * Call our custom migrations when defined 1787106851SAnna Dabrowska * 1887106851SAnna Dabrowska * @param Doku_Event $event 1987106851SAnna Dabrowska * @return bool 2087106851SAnna Dabrowska */ 2187106851SAnna Dabrowska public function handleMigrations(Doku_Event $event) 2287106851SAnna Dabrowska { 2387106851SAnna Dabrowska /** @var \helper_plugin_struct_db $helper */ 2487106851SAnna Dabrowska $helper = plugin_load('helper', 'struct_db'); 25*bcee0e72SAnna Dabrowska 26*bcee0e72SAnna Dabrowska // abort if struct is not installed 27*bcee0e72SAnna Dabrowska if (!$helper) { 28*bcee0e72SAnna Dabrowska throw new Exception('Plugin struct is required!'); 29*bcee0e72SAnna Dabrowska } 30*bcee0e72SAnna Dabrowska 3187106851SAnna Dabrowska $sqlite = $helper->getDB(); 3287106851SAnna Dabrowska 3387106851SAnna Dabrowska $ok = true; 3487106851SAnna Dabrowska 3587106851SAnna Dabrowska list($dbVersionStruct, $dbVersionStructpublish) = $this->getDbVersions($sqlite); 36*bcee0e72SAnna Dabrowska 37*bcee0e72SAnna Dabrowska // check if struct has required version 38*bcee0e72SAnna Dabrowska if ($dbVersionStruct < self::MIN_DB_STRUCT) { 39*bcee0e72SAnna Dabrowska throw new Exception('Plugins struct is outdated. Minimum required database version is ' . self::MIN_DB_STRUCT); 40*bcee0e72SAnna Dabrowska } 41*bcee0e72SAnna Dabrowska 42*bcee0e72SAnna Dabrowska // check whether we are already up-to-date 43*bcee0e72SAnna Dabrowska $latestVersion = $this->getLatestVersion(); 44*bcee0e72SAnna Dabrowska if (isset($dbVersionStructpublish) && (int)$dbVersionStructpublish >= $latestVersion) { 4587106851SAnna Dabrowska return $ok; 4687106851SAnna Dabrowska } 4787106851SAnna Dabrowska 48*bcee0e72SAnna Dabrowska // check whether we have any pending migrations 49*bcee0e72SAnna Dabrowska $pending = range($dbVersionStructpublish ?: 1, $latestVersion); 5087106851SAnna Dabrowska if (empty($pending)) { 5187106851SAnna Dabrowska return $ok; 5287106851SAnna Dabrowska } 5387106851SAnna Dabrowska 5487106851SAnna Dabrowska // execute the migrations 5587106851SAnna Dabrowska foreach ($pending as $version) { 5687106851SAnna Dabrowska $call = 'migration' . $version; 5787106851SAnna Dabrowska $ok = $ok && $this->$call($sqlite); 5887106851SAnna Dabrowska } 5987106851SAnna Dabrowska 6087106851SAnna Dabrowska return $ok; 6187106851SAnna Dabrowska } 6287106851SAnna Dabrowska 6387106851SAnna Dabrowska /** 6487106851SAnna Dabrowska * @param $sqlite 6587106851SAnna Dabrowska * @return array 6687106851SAnna Dabrowska */ 6787106851SAnna Dabrowska protected function getDbVersions($sqlite) 6887106851SAnna Dabrowska { 6987106851SAnna Dabrowska $dbVersionStruct = null; 7087106851SAnna Dabrowska $dbVersionStructpublish = null; 7187106851SAnna Dabrowska 7287106851SAnna Dabrowska $sql = 'SELECT opt, val FROM opts WHERE opt=? OR opt=?'; 7387106851SAnna Dabrowska $res = $sqlite->query($sql, 'dbversion', 'dbversion_structpublish'); 7487106851SAnna Dabrowska $vals = $sqlite->res2arr($res); 7587106851SAnna Dabrowska 7687106851SAnna Dabrowska foreach ($vals as $val) { 7787106851SAnna Dabrowska if ($val['opt'] === 'dbversion') { 7887106851SAnna Dabrowska $dbVersionStruct = $val['val']; 7987106851SAnna Dabrowska } 8087106851SAnna Dabrowska if ($val['opt'] === 'dbversion_structpublish') { 8187106851SAnna Dabrowska $dbVersionStructpublish = $val['val']; 8287106851SAnna Dabrowska } 8387106851SAnna Dabrowska } 8487106851SAnna Dabrowska return [$dbVersionStruct, $dbVersionStructpublish]; 8587106851SAnna Dabrowska } 8687106851SAnna Dabrowska 8787106851SAnna Dabrowska /** 88*bcee0e72SAnna Dabrowska * @return int 89*bcee0e72SAnna Dabrowska */ 90*bcee0e72SAnna Dabrowska protected function getLatestVersion() 91*bcee0e72SAnna Dabrowska { 92*bcee0e72SAnna Dabrowska return (int)trim(file_get_contents(DOKU_PLUGIN . 'structpublish/db/latest.version', false)); 93*bcee0e72SAnna Dabrowska } 94*bcee0e72SAnna Dabrowska 95*bcee0e72SAnna Dabrowska /** 96*bcee0e72SAnna Dabrowska * Database setup 9787106851SAnna Dabrowska * 9887106851SAnna Dabrowska * @param helper_plugin_sqlite $sqlite 9987106851SAnna Dabrowska * @return bool 10087106851SAnna Dabrowska */ 101*bcee0e72SAnna Dabrowska protected function migration1($sqlite) 10287106851SAnna Dabrowska { 103*bcee0e72SAnna Dabrowska $sql = io_readFile(DOKU_PLUGIN . 'structpublish/db/update0001.sql', false); 10487106851SAnna Dabrowska 10587106851SAnna Dabrowska $sql = $sqlite->SQLstring2array($sql); 10687106851SAnna Dabrowska array_unshift($sql, 'BEGIN TRANSACTION'); 107*bcee0e72SAnna Dabrowska array_push($sql, "INSERT OR REPLACE INTO opts (val,opt) VALUES (1,'dbversion_structpublish')"); 10887106851SAnna Dabrowska array_push($sql, "COMMIT TRANSACTION"); 109677c897aSAnna Dabrowska $ok = $sqlite->doTransaction($sql); 110677c897aSAnna Dabrowska 111677c897aSAnna Dabrowska if ($ok) { 112*bcee0e72SAnna Dabrowska $file = DOKU_PLUGIN . 'structpublish/db/json/structpublish0001.struct.json'; 113677c897aSAnna Dabrowska $schemaJson = file_get_contents($file); 114677c897aSAnna Dabrowska $importer = new \dokuwiki\plugin\struct\meta\SchemaImporter('structpublish', $schemaJson); 115677c897aSAnna Dabrowska $ok = (bool)$importer->build(); 116677c897aSAnna Dabrowska } 117677c897aSAnna Dabrowska 118677c897aSAnna Dabrowska return $ok; 11987106851SAnna Dabrowska } 12087106851SAnna Dabrowska} 121