xref: /plugin/structpublish/action/migration.php (revision bcee0e7291f5711195e679503d4d3a3c36e03575)
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