xref: /plugin/bez/action/migration.php (revision fe5d6d1ebd253c129098b67fff8cf438a54d8650)
1*fe5d6d1eSSzymon Olewniczak<?php
2*fe5d6d1eSSzymon Olewniczak/**
3*fe5d6d1eSSzymon Olewniczak * DokuWiki Plugin bez (Action Component)
4*fe5d6d1eSSzymon Olewniczak *
5*fe5d6d1eSSzymon Olewniczak */
6*fe5d6d1eSSzymon Olewniczak
7*fe5d6d1eSSzymon Olewniczak// must be run within Dokuwiki
8*fe5d6d1eSSzymon Olewniczak
9*fe5d6d1eSSzymon Olewniczakif(!defined('DOKU_INC')) die();
10*fe5d6d1eSSzymon Olewniczak
11*fe5d6d1eSSzymon Olewniczak/**
12*fe5d6d1eSSzymon Olewniczak * Class action_plugin_bez_migration
13*fe5d6d1eSSzymon Olewniczak *
14*fe5d6d1eSSzymon Olewniczak * Handle migrations that need more than just SQL
15*fe5d6d1eSSzymon Olewniczak */
16*fe5d6d1eSSzymon Olewniczakclass action_plugin_bez_migration extends DokuWiki_Action_Plugin {
17*fe5d6d1eSSzymon Olewniczak    /**
18*fe5d6d1eSSzymon Olewniczak     * @inheritDoc
19*fe5d6d1eSSzymon Olewniczak     */
20*fe5d6d1eSSzymon Olewniczak    public function register(Doku_Event_Handler $controller) {
21*fe5d6d1eSSzymon Olewniczak        $controller->register_hook('PLUGIN_SQLITE_DATABASE_UPGRADE', 'BEFORE', $this, 'handle_migrations');
22*fe5d6d1eSSzymon Olewniczak    }
23*fe5d6d1eSSzymon Olewniczak
24*fe5d6d1eSSzymon Olewniczak    /**
25*fe5d6d1eSSzymon Olewniczak     * Call our custom migrations when defined
26*fe5d6d1eSSzymon Olewniczak     *
27*fe5d6d1eSSzymon Olewniczak     * @param Doku_Event $event
28*fe5d6d1eSSzymon Olewniczak     * @param $param
29*fe5d6d1eSSzymon Olewniczak     */
30*fe5d6d1eSSzymon Olewniczak    public function handle_migrations(Doku_Event $event, $param) {
31*fe5d6d1eSSzymon Olewniczak        if ($event->data['sqlite']->getAdapter()->getDbname() !== 'b3p') {
32*fe5d6d1eSSzymon Olewniczak            return;
33*fe5d6d1eSSzymon Olewniczak        }
34*fe5d6d1eSSzymon Olewniczak        $to = $event->data['to'];
35*fe5d6d1eSSzymon Olewniczak
36*fe5d6d1eSSzymon Olewniczak        if(is_callable(array($this, "migration$to"))) {
37*fe5d6d1eSSzymon Olewniczak            $event->preventDefault();
38*fe5d6d1eSSzymon Olewniczak            $event->result = call_user_func(array($this, "migration$to"), $event->data);
39*fe5d6d1eSSzymon Olewniczak        }
40*fe5d6d1eSSzymon Olewniczak    }
41*fe5d6d1eSSzymon Olewniczak
42*fe5d6d1eSSzymon Olewniczak    /**
43*fe5d6d1eSSzymon Olewniczak     * Executes Migration 1
44*fe5d6d1eSSzymon Olewniczak     *
45*fe5d6d1eSSzymon Olewniczak     * Add a latest column to all existing multi tables
46*fe5d6d1eSSzymon Olewniczak     *
47*fe5d6d1eSSzymon Olewniczak     * @param helper_plugin_sqlite $sqlite
48*fe5d6d1eSSzymon Olewniczak     * @return bool
49*fe5d6d1eSSzymon Olewniczak     */
50*fe5d6d1eSSzymon Olewniczak    protected function migration1($data) {
51*fe5d6d1eSSzymon Olewniczak        $file = $data['file'];
52*fe5d6d1eSSzymon Olewniczak        /** @var helper_plugin_sqlite $sqlite */
53*fe5d6d1eSSzymon Olewniczak        $sqlite = $data['sqlite'];
54*fe5d6d1eSSzymon Olewniczak
55*fe5d6d1eSSzymon Olewniczak        $sql = file_get_contents($file);
56*fe5d6d1eSSzymon Olewniczak        if ($sql === false) {
57*fe5d6d1eSSzymon Olewniczak            throw new Exception('cannot open file '.$file);
58*fe5d6d1eSSzymon Olewniczak        }
59*fe5d6d1eSSzymon Olewniczak
60*fe5d6d1eSSzymon Olewniczak        $matches = array();
61*fe5d6d1eSSzymon Olewniczak        preg_match_all('/.*?(?(?=BEGIN)BEGIN.*?END)\s*;/is', $sql, $matches);
62*fe5d6d1eSSzymon Olewniczak        $queries = $matches[0];
63*fe5d6d1eSSzymon Olewniczak
64*fe5d6d1eSSzymon Olewniczak        $db = $sqlite->getAdapter()->getDb();
65*fe5d6d1eSSzymon Olewniczak
66*fe5d6d1eSSzymon Olewniczak        $db->beginTransaction();
67*fe5d6d1eSSzymon Olewniczak        foreach ($queries as $query) {
68*fe5d6d1eSSzymon Olewniczak            $res = $db->query($query);
69*fe5d6d1eSSzymon Olewniczak            if($res === false) {
70*fe5d6d1eSSzymon Olewniczak                $err = $db->errorInfo();
71*fe5d6d1eSSzymon Olewniczak                msg($err[0].' '.$err[1].' '.$err[2].':<br /><pre>'.hsc($sql).'</pre>', -1);
72*fe5d6d1eSSzymon Olewniczak                $db->rollBack();
73*fe5d6d1eSSzymon Olewniczak                return false;
74*fe5d6d1eSSzymon Olewniczak            }
75*fe5d6d1eSSzymon Olewniczak        }
76*fe5d6d1eSSzymon Olewniczak        $db->commit();
77*fe5d6d1eSSzymon Olewniczak
78*fe5d6d1eSSzymon Olewniczak        return true;
79*fe5d6d1eSSzymon Olewniczak    }
80*fe5d6d1eSSzymon Olewniczak
81*fe5d6d1eSSzymon Olewniczak}
82