xref: /plugin/bez/action/migration.php (revision d3caa25d79ee01994243705115940dbc866adef7)
1fe5d6d1eSSzymon Olewniczak<?php
2fe5d6d1eSSzymon Olewniczak/**
3fe5d6d1eSSzymon Olewniczak * DokuWiki Plugin bez (Action Component)
4fe5d6d1eSSzymon Olewniczak *
5fe5d6d1eSSzymon Olewniczak */
6fe5d6d1eSSzymon Olewniczak
7fe5d6d1eSSzymon Olewniczak// must be run within Dokuwiki
8fe5d6d1eSSzymon Olewniczak
9fe5d6d1eSSzymon Olewniczakif(!defined('DOKU_INC')) die();
10fe5d6d1eSSzymon Olewniczak
11fe5d6d1eSSzymon Olewniczak/**
12fe5d6d1eSSzymon Olewniczak * Class action_plugin_bez_migration
13fe5d6d1eSSzymon Olewniczak *
14fe5d6d1eSSzymon Olewniczak * Handle migrations that need more than just SQL
15fe5d6d1eSSzymon Olewniczak */
16fe5d6d1eSSzymon Olewniczakclass action_plugin_bez_migration extends DokuWiki_Action_Plugin {
17fe5d6d1eSSzymon Olewniczak    /**
18fe5d6d1eSSzymon Olewniczak     * @inheritDoc
19fe5d6d1eSSzymon Olewniczak     */
20fe5d6d1eSSzymon Olewniczak    public function register(Doku_Event_Handler $controller) {
21fe5d6d1eSSzymon Olewniczak        $controller->register_hook('PLUGIN_SQLITE_DATABASE_UPGRADE', 'BEFORE', $this, 'handle_migrations');
22*d3caa25dSSzymon Olewniczak//        $controller->register_hook('PLUGIN_SQLITE_DATABASE_UPGRADE', 'AFTER', $this, 'handle_migrations_after');
23fe5d6d1eSSzymon Olewniczak    }
24fe5d6d1eSSzymon Olewniczak
25fe5d6d1eSSzymon Olewniczak    /**
26fe5d6d1eSSzymon Olewniczak     * Call our custom migrations when defined
27fe5d6d1eSSzymon Olewniczak     *
28fe5d6d1eSSzymon Olewniczak     * @param Doku_Event $event
29fe5d6d1eSSzymon Olewniczak     * @param $param
30fe5d6d1eSSzymon Olewniczak     */
31fe5d6d1eSSzymon Olewniczak    public function handle_migrations(Doku_Event $event, $param) {
32*d3caa25dSSzymon Olewniczak        if ($event->data['sqlite']->getAdapter()->getDbName() !== 'b3p') {
33fe5d6d1eSSzymon Olewniczak            return;
34fe5d6d1eSSzymon Olewniczak        }
35fe5d6d1eSSzymon Olewniczak        $to = $event->data['to'];
36fe5d6d1eSSzymon Olewniczak
37fe5d6d1eSSzymon Olewniczak        if(is_callable(array($this, "migration$to"))) {
38fe5d6d1eSSzymon Olewniczak            $event->preventDefault();
39fe5d6d1eSSzymon Olewniczak            $event->result = call_user_func(array($this, "migration$to"), $event->data);
40fe5d6d1eSSzymon Olewniczak        }
41fe5d6d1eSSzymon Olewniczak    }
42fe5d6d1eSSzymon Olewniczak
43*d3caa25dSSzymon Olewniczak    /**
44*d3caa25dSSzymon Olewniczak     * Call our custom migrations when defined
45*d3caa25dSSzymon Olewniczak     *
46*d3caa25dSSzymon Olewniczak     * @param Doku_Event $event
47*d3caa25dSSzymon Olewniczak     * @param $param
48*d3caa25dSSzymon Olewniczak     */
49*d3caa25dSSzymon Olewniczak    public function handle_migrations_after(Doku_Event $event, $param) {
50*d3caa25dSSzymon Olewniczak        if ($event->data['sqlite']->getAdapter()->getDbName() !== 'b3p') {
51*d3caa25dSSzymon Olewniczak            return;
52*d3caa25dSSzymon Olewniczak        }
53*d3caa25dSSzymon Olewniczak        $to = $event->data['to'];
54*d3caa25dSSzymon Olewniczak
55*d3caa25dSSzymon Olewniczak        if(is_callable(array($this, "migration$to"))) {
56*d3caa25dSSzymon Olewniczak            $event->result = call_user_func(array($this, "migration$to"), $event->data);
57*d3caa25dSSzymon Olewniczak        }
58*d3caa25dSSzymon Olewniczak    }
59*d3caa25dSSzymon Olewniczak
605a4034efSSzymon Olewniczak    protected function migration12($data) {
615a4034efSSzymon Olewniczak        global $INFO;
625a4034efSSzymon Olewniczak
635a4034efSSzymon Olewniczak        $file = $data['file'];
645a4034efSSzymon Olewniczak        /** @var helper_plugin_sqlite $sqlite */
655a4034efSSzymon Olewniczak        $sqlite = $data['sqlite'];
665a4034efSSzymon Olewniczak
675a4034efSSzymon Olewniczak        $sql = file_get_contents($file);
685a4034efSSzymon Olewniczak        if($sql === false) {
695a4034efSSzymon Olewniczak            throw new Exception('cannot open file ' . $file);
705a4034efSSzymon Olewniczak        }
715a4034efSSzymon Olewniczak
725a4034efSSzymon Olewniczak        $matches = array();
735a4034efSSzymon Olewniczak        preg_match_all('/.*?(?(?=BEGIN)BEGIN.*?END)\s*;/is', $sql, $matches);
745a4034efSSzymon Olewniczak        $queries = $matches[0];
755a4034efSSzymon Olewniczak
76*d3caa25dSSzymon Olewniczak        $db = $sqlite->getAdapter()->getPdo();
775a4034efSSzymon Olewniczak
78*d3caa25dSSzymon Olewniczak//        $db->beginTransaction();   // translation already started
795a4034efSSzymon Olewniczak        foreach($queries as $query) {
805a4034efSSzymon Olewniczak            $res = $db->query($query);
815a4034efSSzymon Olewniczak            if($res === false) {
825a4034efSSzymon Olewniczak                $err = $db->errorInfo();
835a4034efSSzymon Olewniczak                msg($err[0] . ' ' . $err[1] . ' ' . $err[2] . ':<br /><pre>' . hsc($query) . '</pre>', -1);
845a4034efSSzymon Olewniczak                $db->rollBack();
855a4034efSSzymon Olewniczak                return false;
865a4034efSSzymon Olewniczak            }
875a4034efSSzymon Olewniczak        }
88*d3caa25dSSzymon Olewniczak//        $db->commit();  // commit will be done inside SQLiteDB
895a4034efSSzymon Olewniczak
905a4034efSSzymon Olewniczak        return true;
915a4034efSSzymon Olewniczak    }
925a4034efSSzymon Olewniczak
936f380773SSzymon Olewniczak    protected function migration3($data) {
946f380773SSzymon Olewniczak        global $INFO;
956f380773SSzymon Olewniczak
966f380773SSzymon Olewniczak        $file = $data['file'];
976f380773SSzymon Olewniczak        /** @var helper_plugin_sqlite $sqlite */
986f380773SSzymon Olewniczak        $sqlite = $data['sqlite'];
996f380773SSzymon Olewniczak
1006f380773SSzymon Olewniczak        $sql = file_get_contents($file);
1016f380773SSzymon Olewniczak        if($sql === false) {
1026f380773SSzymon Olewniczak            throw new Exception('cannot open file ' . $file);
1036f380773SSzymon Olewniczak        }
1046f380773SSzymon Olewniczak
1056f380773SSzymon Olewniczak        $matches = array();
1066f380773SSzymon Olewniczak        preg_match_all('/.*?(?(?=BEGIN)BEGIN.*?END)\s*;/is', $sql, $matches);
1076f380773SSzymon Olewniczak        $queries = $matches[0];
1086f380773SSzymon Olewniczak
109*d3caa25dSSzymon Olewniczak        $db = $sqlite->getAdapter()->getPdo();
1106f380773SSzymon Olewniczak
111*d3caa25dSSzymon Olewniczak//        $db->beginTransaction();  // translation already started
1126f380773SSzymon Olewniczak        foreach($queries as $query) {
1136f380773SSzymon Olewniczak            $res = $db->query($query);
1146f380773SSzymon Olewniczak            if($res === false) {
1156f380773SSzymon Olewniczak                $err = $db->errorInfo();
1166f380773SSzymon Olewniczak                msg($err[0] . ' ' . $err[1] . ' ' . $err[2] . ':<br /><pre>' . hsc($query) . '</pre>', -1);
1176f380773SSzymon Olewniczak                $db->rollBack();
1186f380773SSzymon Olewniczak                return false;
1196f380773SSzymon Olewniczak            }
1206f380773SSzymon Olewniczak        }
121*d3caa25dSSzymon Olewniczak//        $db->commit();  // commit will be done inside SQLiteDB
1226f380773SSzymon Olewniczak
1236f380773SSzymon Olewniczak        return true;
1246f380773SSzymon Olewniczak    }
1256f380773SSzymon Olewniczak
126fe5d6d1eSSzymon Olewniczak    /**
127fe5d6d1eSSzymon Olewniczak     * Executes Migration 1
128fe5d6d1eSSzymon Olewniczak     *
129fe5d6d1eSSzymon Olewniczak     * Add a latest column to all existing multi tables
130fe5d6d1eSSzymon Olewniczak     *
131fe5d6d1eSSzymon Olewniczak     * @param helper_plugin_sqlite $sqlite
132fe5d6d1eSSzymon Olewniczak     * @return bool
133fe5d6d1eSSzymon Olewniczak     */
134fe5d6d1eSSzymon Olewniczak    protected function migration1($data) {
1358529a37eSSzymon Olewniczak        global $INFO;
1368529a37eSSzymon Olewniczak
137fe5d6d1eSSzymon Olewniczak        $file = $data['file'];
138fe5d6d1eSSzymon Olewniczak        /** @var helper_plugin_sqlite $sqlite */
139fe5d6d1eSSzymon Olewniczak        $sqlite = $data['sqlite'];
140fe5d6d1eSSzymon Olewniczak
141fe5d6d1eSSzymon Olewniczak        $sql = file_get_contents($file);
142fe5d6d1eSSzymon Olewniczak        if ($sql === false) {
143fe5d6d1eSSzymon Olewniczak            throw new Exception('cannot open file '.$file);
144fe5d6d1eSSzymon Olewniczak        }
145fe5d6d1eSSzymon Olewniczak
146fe5d6d1eSSzymon Olewniczak        $matches = array();
147fe5d6d1eSSzymon Olewniczak        preg_match_all('/.*?(?(?=BEGIN)BEGIN.*?END)\s*;/is', $sql, $matches);
148fe5d6d1eSSzymon Olewniczak        $queries = $matches[0];
149fe5d6d1eSSzymon Olewniczak
150*d3caa25dSSzymon Olewniczak        $db = $sqlite->getAdapter()->getPdo();
151fe5d6d1eSSzymon Olewniczak
152*d3caa25dSSzymon Olewniczak//        $db->beginTransaction(); // translation already started
153fe5d6d1eSSzymon Olewniczak        foreach ($queries as $query) {
154fe5d6d1eSSzymon Olewniczak            $res = $db->query($query);
155fe5d6d1eSSzymon Olewniczak            if($res === false) {
156fe5d6d1eSSzymon Olewniczak                $err = $db->errorInfo();
1576df1cdc6SSzymon Olewniczak                msg($err[0].' '.$err[1].' '.$err[2].':<br /><pre>'.hsc($query).'</pre>', -1);
158fe5d6d1eSSzymon Olewniczak                $db->rollBack();
159fe5d6d1eSSzymon Olewniczak                return false;
160fe5d6d1eSSzymon Olewniczak            }
161fe5d6d1eSSzymon Olewniczak        }
1628529a37eSSzymon Olewniczak
1636df1cdc6SSzymon Olewniczak        $bez_file = DOKU_INC . 'data/meta/bez.sqlite3';
1646df1cdc6SSzymon Olewniczak        if (!file_exists($bez_file)) {
165*d3caa25dSSzymon Olewniczak//        $db->commit();  // commit will be done inside SQLiteDB
1666df1cdc6SSzymon Olewniczak            return true;
1676df1cdc6SSzymon Olewniczak        }
1686df1cdc6SSzymon Olewniczak
1698529a37eSSzymon Olewniczak        //import from bez
1706df1cdc6SSzymon Olewniczak        $bez = new \PDO('sqlite:' . $bez_file);
1718529a37eSSzymon Olewniczak
1728529a37eSSzymon Olewniczak        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
1738529a37eSSzymon Olewniczak
1748529a37eSSzymon Olewniczak        $stmt = $bez->query('SELECT * FROM issuetypes');
1758529a37eSSzymon Olewniczak        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
1768529a37eSSzymon Olewniczak            $sqlite->storeEntry('label', array('id' => $row['id'],
1778529a37eSSzymon Olewniczak                                                            'name' => $row['pl'],
1788529a37eSSzymon Olewniczak                                                            'added_by' => $INFO['client'],
1798529a37eSSzymon Olewniczak                                                            'added_date' => date('c')));
1808529a37eSSzymon Olewniczak        }
1818529a37eSSzymon Olewniczak
1828529a37eSSzymon Olewniczak        $stmt = $bez->query('SELECT * FROM tasktypes');
1838529a37eSSzymon Olewniczak        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
1848529a37eSSzymon Olewniczak            $sqlite->storeEntry('task_program', array('id' => $row['id'],
1858529a37eSSzymon Olewniczak                                                             'name' => $row['pl'],
1868529a37eSSzymon Olewniczak                                                             'added_by' => $INFO['client'],
1878529a37eSSzymon Olewniczak                                                             'added_date' => date('c')));
1888529a37eSSzymon Olewniczak        }
1898529a37eSSzymon Olewniczak
1908529a37eSSzymon Olewniczak        $stmt = $bez->query('SELECT *, (SELECT COUNT(*) FROM tasks
1918529a37eSSzymon Olewniczak								WHERE tasks.cause = commcauses.id) AS task_count FROM commcauses');
1928529a37eSSzymon Olewniczak        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
1938529a37eSSzymon Olewniczak            if ($row['type'] == '0') {
1948529a37eSSzymon Olewniczak                $type = 'comment';
1958529a37eSSzymon Olewniczak            } elseif ($row['type'] == '1') {
1968529a37eSSzymon Olewniczak                $type = 'cause_real';
1978529a37eSSzymon Olewniczak            } elseif ($row['type'] == '2') {
1988529a37eSSzymon Olewniczak                $type = 'cause_potential';
1998529a37eSSzymon Olewniczak            }
2008529a37eSSzymon Olewniczak            $sqlite->storeEntry('thread_comment',
2018529a37eSSzymon Olewniczak                                       array('id' => $row['id'],
2028529a37eSSzymon Olewniczak                                             'thread_id' => $row['issue'],
2038529a37eSSzymon Olewniczak                                             'type' => $type,
2048529a37eSSzymon Olewniczak                                             'author' => $row['reporter'],
2058529a37eSSzymon Olewniczak                                             'create_date' => date('c', strtotime($row['datetime'])),
2068529a37eSSzymon Olewniczak                                             'last_modification_date' => date('c', strtotime($row['datetime'])),
2078529a37eSSzymon Olewniczak                                             'content' => $row['content'],
2088529a37eSSzymon Olewniczak                                             'content_html' => $row['content_cache'],
2098529a37eSSzymon Olewniczak                                             'task_count' => $row['task_count']));
2108529a37eSSzymon Olewniczak        }
2118529a37eSSzymon Olewniczak
2128529a37eSSzymon Olewniczak        $stmt = $bez->query('SELECT tasks.*, commcauses.type AS cause_type
2138529a37eSSzymon Olewniczak                                          FROM tasks
2148529a37eSSzymon Olewniczak                                          LEFT JOIN commcauses ON tasks.cause = commcauses.id');
2158529a37eSSzymon Olewniczak        //thread_id => array('user_id' => 'user_id')
2168529a37eSSzymon Olewniczak        $task_assignee = array();
2178529a37eSSzymon Olewniczak        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
2188529a37eSSzymon Olewniczak            if ($row['close_date'] != '') {
2198529a37eSSzymon Olewniczak                $last_mod = date('c', (int) $row['close_date']);
2208529a37eSSzymon Olewniczak            } else {
2218529a37eSSzymon Olewniczak                $last_mod = date('c', (int) $row['date']);
2228529a37eSSzymon Olewniczak            }
2238529a37eSSzymon Olewniczak
2248529a37eSSzymon Olewniczak            $data =  array('id' => $row['id'],
2258529a37eSSzymon Olewniczak                           'original_poster' => $row['reporter'],
2268529a37eSSzymon Olewniczak                           'assignee' => $row['executor'],
2278529a37eSSzymon Olewniczak                           'create_date' => date('c', (int) $row['date']),
2288529a37eSSzymon Olewniczak                           'last_activity_date' => $last_mod,
2298529a37eSSzymon Olewniczak                           'last_modification_date' => $last_mod,
2308529a37eSSzymon Olewniczak                           'plan_date' => $row['plan_date'],
2318529a37eSSzymon Olewniczak                           'all_day_event' => $row['all_day_event'],
2328529a37eSSzymon Olewniczak                           'start_time' => $row['start_time'],
2338529a37eSSzymon Olewniczak                           'finish_time' => $row['finish_time'],
2348529a37eSSzymon Olewniczak                           'content' => $row['task'],
2358529a37eSSzymon Olewniczak                           'content_html' => $row['task_cache'],
2368529a37eSSzymon Olewniczak                           'thread_id' => $row['issue'],
2378529a37eSSzymon Olewniczak                           'thread_comment_id' => $row['cause'],
2388529a37eSSzymon Olewniczak                           'task_program_id' => $row['tasktype']
2398529a37eSSzymon Olewniczak            );
2408529a37eSSzymon Olewniczak
2418529a37eSSzymon Olewniczak            if ($data['thread_id'] != '') {
2428529a37eSSzymon Olewniczak                if (!is_array($task_assignee[$data['thread_id']])) {
2438529a37eSSzymon Olewniczak                    $task_assignee[$data['thread_id']] = array();
2448529a37eSSzymon Olewniczak                }
2458529a37eSSzymon Olewniczak                $task_assignee[$data['thread_id']][$row['executor']] = $row['executor'];
2468529a37eSSzymon Olewniczak            }
2478529a37eSSzymon Olewniczak
2488529a37eSSzymon Olewniczak            if ($row['cost'] != '0') {
2498529a37eSSzymon Olewniczak                $data['cost'] = $row['cost'];
2508529a37eSSzymon Olewniczak            }
2518529a37eSSzymon Olewniczak
2528529a37eSSzymon Olewniczak            if ($row['issue'] == '') {
2538529a37eSSzymon Olewniczak                $data['type'] = 'program';
2548529a37eSSzymon Olewniczak            } elseif ($row['cause'] == '') {
2558529a37eSSzymon Olewniczak                $data['type'] = 'correction';
2568529a37eSSzymon Olewniczak            } elseif ($row['cause_type'] == '1') {
2578529a37eSSzymon Olewniczak                $data['type'] = 'corrective';
2588529a37eSSzymon Olewniczak            } else {
2598529a37eSSzymon Olewniczak                $data['type'] = 'preventive';
2608529a37eSSzymon Olewniczak            }
2618529a37eSSzymon Olewniczak
2628529a37eSSzymon Olewniczak            if ($row['state'] == '0') {
2638529a37eSSzymon Olewniczak                $data['state'] = 'opened';
2648529a37eSSzymon Olewniczak            } elseif ($row['state'] == '1' || $row['state'] == '2') {
2658529a37eSSzymon Olewniczak                $data['state'] = 'done';
2668529a37eSSzymon Olewniczak                $data['closed_by'] = $row['executor'];
2678529a37eSSzymon Olewniczak                $data['close_date'] = date('c', (int) $row['close_date']);
2688529a37eSSzymon Olewniczak
2698529a37eSSzymon Olewniczak                if ($row['reason'] != '') {
2708529a37eSSzymon Olewniczak                    $sqlite->storeEntry('task_comment',
2718529a37eSSzymon Olewniczak                                               array('task_id' => $row['id'],
2728529a37eSSzymon Olewniczak                                                     'author' => $row['executor'],
2738529a37eSSzymon Olewniczak                                                     'create_date' => $data['close_date'],
2748529a37eSSzymon Olewniczak                                                     'last_modification_date' => $data['close_date'],
2758529a37eSSzymon Olewniczak                                                     'content' => $row['reason'],
2768529a37eSSzymon Olewniczak                                                     'content_html' => $row['reason_cache']));
2778529a37eSSzymon Olewniczak                }
2788529a37eSSzymon Olewniczak            }
2798529a37eSSzymon Olewniczak
2808529a37eSSzymon Olewniczak            //user_id => array()
2818529a37eSSzymon Olewniczak            $participants = array();
2828529a37eSSzymon Olewniczak            $subscribents = explode(',', $row['subscribents']);
2838529a37eSSzymon Olewniczak            foreach ($subscribents as $user_id) {
2848529a37eSSzymon Olewniczak                $participants[$user_id] = array('user_id' => $user_id, 'subscribent' => '1');
2858529a37eSSzymon Olewniczak            }
2868529a37eSSzymon Olewniczak
2878529a37eSSzymon Olewniczak            $op = $data['original_poster'];
2888529a37eSSzymon Olewniczak            if (!isset($participants[$op])) {
2898529a37eSSzymon Olewniczak                $participants[$op] = array('user_id' => $op, 'original_poster' => '1');
2908529a37eSSzymon Olewniczak            } else {
2918529a37eSSzymon Olewniczak                $participants[$op]['original_poster'] = '1';
2928529a37eSSzymon Olewniczak            }
2938529a37eSSzymon Olewniczak
2948529a37eSSzymon Olewniczak            $as = $data['assignee'];
2958529a37eSSzymon Olewniczak            if (!isset($participants[$as])) {
2968529a37eSSzymon Olewniczak                $participants[$as] = array('user_id' => $as, 'assignee' => '1');
2978529a37eSSzymon Olewniczak            } else {
2988529a37eSSzymon Olewniczak                $participants[$as]['assignee'] = '1';
2998529a37eSSzymon Olewniczak            }
3008529a37eSSzymon Olewniczak
3018529a37eSSzymon Olewniczak            foreach($participants as $part) {
3028529a37eSSzymon Olewniczak                $part['task_id'] = $row['id'];
3038529a37eSSzymon Olewniczak                $part['added_by'] = $INFO['client'];
3048529a37eSSzymon Olewniczak                $part['added_date'] = date('c');
3058529a37eSSzymon Olewniczak
3068529a37eSSzymon Olewniczak                $res = $sqlite->storeEntry('task_participant', $part);
3078529a37eSSzymon Olewniczak                if ($res === false) {
3088529a37eSSzymon Olewniczak                    throw new Exception($db->errorInfo());
3098529a37eSSzymon Olewniczak                }
3108529a37eSSzymon Olewniczak            }
3118529a37eSSzymon Olewniczak
3128529a37eSSzymon Olewniczak            $sqlite->storeEntry('task', $data);
3138529a37eSSzymon Olewniczak        }
3148529a37eSSzymon Olewniczak
3158529a37eSSzymon Olewniczak
3168529a37eSSzymon Olewniczak
3178529a37eSSzymon Olewniczak        $stmt = $bez->query('SELECT *,
3188529a37eSSzymon Olewniczak                                (SELECT COUNT(*) FROM tasks
3198529a37eSSzymon Olewniczak								WHERE tasks.issue = issues.id) AS task_count,
3208529a37eSSzymon Olewniczak								(SELECT COUNT(*) FROM tasks
3218529a37eSSzymon Olewniczak								WHERE tasks.issue = issues.id AND tasks.state != 0) AS task_closed_count,
3228529a37eSSzymon Olewniczak								(SELECT SUM(cost) FROM tasks
3238529a37eSSzymon Olewniczak								WHERE tasks.issue = issues.id) AS task_sum_cost
3248529a37eSSzymon Olewniczak								FROM issues');
3258529a37eSSzymon Olewniczak
3268529a37eSSzymon Olewniczak        while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
3278529a37eSSzymon Olewniczak
3288529a37eSSzymon Olewniczak            $data =  array('id' => $row['id'],
3298529a37eSSzymon Olewniczak                           'original_poster' => $row['reporter'],
3308529a37eSSzymon Olewniczak                           'coordinator' => $row['coordinator'],
3318529a37eSSzymon Olewniczak                           'create_date' => date('c', (int) $row['date']),
3328529a37eSSzymon Olewniczak                           'last_activity_date' => date('c', strtotime($row['last_activity'])),
3338529a37eSSzymon Olewniczak                           'last_modification_date' => date('c', (int) $row['last_mod']),
3348529a37eSSzymon Olewniczak                           'title' => $row['title'],
3358529a37eSSzymon Olewniczak                           'content' => $row['description'],
3368529a37eSSzymon Olewniczak                           'content_html' => $row['description_cache'],
3378529a37eSSzymon Olewniczak                           'task_count' => $row['task_count'],
3388529a37eSSzymon Olewniczak                           'task_count_closed' => $row['task_closed_count']
3398529a37eSSzymon Olewniczak            );
3408529a37eSSzymon Olewniczak
3418529a37eSSzymon Olewniczak            if ($row['task_sum_cost'] != '0') {
3428529a37eSSzymon Olewniczak                $data['task_sum_cost'] = $row['task_sum_cost'];
3438529a37eSSzymon Olewniczak            }
3448529a37eSSzymon Olewniczak
3458529a37eSSzymon Olewniczak            if ($row['coordinator'] == '') {
3468529a37eSSzymon Olewniczak                $data['state'] = 'proposal';
3478529a37eSSzymon Olewniczak            } elseif ($row['state'] == '1') {
3488529a37eSSzymon Olewniczak                $data['closed_by'] = $row['coordinator'];
3498529a37eSSzymon Olewniczak                $data['state'] = 'closed';
3508529a37eSSzymon Olewniczak                $data['close_date'] = $data['last_modification_date'];
3518529a37eSSzymon Olewniczak
3528529a37eSSzymon Olewniczak                $sqlite->storeEntry('thread_comment',
3538529a37eSSzymon Olewniczak                                           array('thread_id' => $row['id'],
3548529a37eSSzymon Olewniczak                                                 'type' => 'comment',
3558529a37eSSzymon Olewniczak                                                 'author' => $row['coordinator'],
3568529a37eSSzymon Olewniczak                                                 'create_date' => $data['close_date'],
3578529a37eSSzymon Olewniczak                                                 'last_modification_date' => $data['close_date'],
3588529a37eSSzymon Olewniczak                                                 'content' => $row['opinion'],
3598529a37eSSzymon Olewniczak                                                 'content_html' => $row['opinion_cache']));
3608529a37eSSzymon Olewniczak
3618529a37eSSzymon Olewniczak
3628529a37eSSzymon Olewniczak            } elseif ($row['state'] == '2') {
3638529a37eSSzymon Olewniczak                $data['closed_by'] = $row['coordinator'];
3648529a37eSSzymon Olewniczak                $data['state'] = 'rejected';
3658529a37eSSzymon Olewniczak                $data['close_date'] = $data['last_modification_date'];
3668529a37eSSzymon Olewniczak
3678529a37eSSzymon Olewniczak                if ($row['opinion'] != '') {
3688529a37eSSzymon Olewniczak                    $res = $sqlite->storeEntry('thread_comment',
3698529a37eSSzymon Olewniczak                                               array('thread_id' => $row['id'],
3708529a37eSSzymon Olewniczak                                                     'type' => 'comment',
3718529a37eSSzymon Olewniczak                                                     'author' => $row['coordinator'],
3728529a37eSSzymon Olewniczak                                                     'create_date' => $data['close_date'],
3738529a37eSSzymon Olewniczak                                                     'last_modification_date' => $data['close_date'],
3748529a37eSSzymon Olewniczak                                                     'content' => $row['opinion'],
3758529a37eSSzymon Olewniczak                                                     'content_html' => $row['opinion_cache']));
3768529a37eSSzymon Olewniczak                    if ($res === false) {
3778529a37eSSzymon Olewniczak                        throw new Exception($db->errorInfo());
3788529a37eSSzymon Olewniczak                    }
3798529a37eSSzymon Olewniczak                }
3808529a37eSSzymon Olewniczak            } else {
3818529a37eSSzymon Olewniczak                $data['state'] = 'opened';
3828529a37eSSzymon Olewniczak            }
3838529a37eSSzymon Olewniczak
3848529a37eSSzymon Olewniczak            $sqlite->storeEntry('thread', $data);
3858529a37eSSzymon Olewniczak
3868529a37eSSzymon Olewniczak            $sqlite->storeEntry('thread_label',
3878529a37eSSzymon Olewniczak                                       array('thread_id' => $row['id'],
3888529a37eSSzymon Olewniczak                                             'label_id' => $row['type']));
3898529a37eSSzymon Olewniczak
3908529a37eSSzymon Olewniczak            //participants
3918529a37eSSzymon Olewniczak            //user_id => array()
3928529a37eSSzymon Olewniczak            $participants = array();
3938529a37eSSzymon Olewniczak            $org_participants = array_filter(explode(',', $row['participants']));
3948529a37eSSzymon Olewniczak            foreach ($org_participants as $user_id) {
3958529a37eSSzymon Olewniczak                $participants[$user_id] = array('user_id' => $user_id);
3968529a37eSSzymon Olewniczak            }
3978529a37eSSzymon Olewniczak
3988529a37eSSzymon Olewniczak            $subscribents = array_filter(explode(',', $row['subscribents']));
3998529a37eSSzymon Olewniczak            foreach ($subscribents as $user_id) {
4008529a37eSSzymon Olewniczak                if (!isset($participants[$user_id])) {
4018529a37eSSzymon Olewniczak                    $participants[$user_id] = array('user_id' => $user_id);
4028529a37eSSzymon Olewniczak                }
4038529a37eSSzymon Olewniczak                $participants[$user_id]['subscribent'] = '1';
4048529a37eSSzymon Olewniczak            }
4058529a37eSSzymon Olewniczak
406f4ba43dcSSzymon Olewniczak            $stmt_i = $bez->query('SELECT reporter FROM commcauses WHERE issue=' . $row['id']);
407f4ba43dcSSzymon Olewniczak            while ($commcause = $stmt_i->fetch(\PDO::FETCH_ASSOC)) {
408f4ba43dcSSzymon Olewniczak                $user_id = $commcause['reporter'];
409f4ba43dcSSzymon Olewniczak                if (!isset($participants[$user_id])) {
410f4ba43dcSSzymon Olewniczak                    $participants[$user_id] = array('user_id' => $user_id);
411f4ba43dcSSzymon Olewniczak                }
412f4ba43dcSSzymon Olewniczak                $participants[$user_id]['commentator'] = '1';
413f4ba43dcSSzymon Olewniczak            }
414f4ba43dcSSzymon Olewniczak
4158529a37eSSzymon Olewniczak            if (is_array($task_assignee[$row['id']])) foreach ($task_assignee[$row['id']] as $user_id) {
4168529a37eSSzymon Olewniczak                if (!isset($participants[$user_id])) {
4178529a37eSSzymon Olewniczak                    $participants[$user_id] = array('user_id' => $user_id);
4188529a37eSSzymon Olewniczak                }
4198529a37eSSzymon Olewniczak                $participants[$user_id]['task_assignee'] = '1';
4208529a37eSSzymon Olewniczak            }
4218529a37eSSzymon Olewniczak
4228529a37eSSzymon Olewniczak            $op = $data['original_poster'];
4238529a37eSSzymon Olewniczak            if (!isset($participants[$op])) {
4248529a37eSSzymon Olewniczak                $participants[$op] = array('user_id' => $op, 'original_poster' => '1');
4258529a37eSSzymon Olewniczak            } else {
4268529a37eSSzymon Olewniczak                $participants[$op]['original_poster'] = '1';
4278529a37eSSzymon Olewniczak            }
4288529a37eSSzymon Olewniczak
4298529a37eSSzymon Olewniczak            $cor = $data['coordinator'];
4308529a37eSSzymon Olewniczak            if (!isset($participants[$cor])) {
4318529a37eSSzymon Olewniczak                $participants[$cor] = array('user_id' => $cor, 'coordinator' => '1');
4328529a37eSSzymon Olewniczak            } else {
4338529a37eSSzymon Olewniczak                $participants[$cor]['coordinator'] = '1';
4348529a37eSSzymon Olewniczak            }
4358529a37eSSzymon Olewniczak
4368529a37eSSzymon Olewniczak            foreach($participants as $part) {
4378529a37eSSzymon Olewniczak                $part['thread_id'] = $row['id'];
4388529a37eSSzymon Olewniczak                $part['added_by'] = $INFO['client'];
4398529a37eSSzymon Olewniczak                $part['added_date'] = date('c');
4408529a37eSSzymon Olewniczak
4418529a37eSSzymon Olewniczak                $sqlite->storeEntry('thread_participant', $part);
4428529a37eSSzymon Olewniczak            }
4438529a37eSSzymon Olewniczak
4448529a37eSSzymon Olewniczak        }
4458529a37eSSzymon Olewniczak
446*d3caa25dSSzymon Olewniczak//        $db->commit();  // commit will be done inside SQLiteDB
447fe5d6d1eSSzymon Olewniczak
448fe5d6d1eSSzymon Olewniczak        return true;
449fe5d6d1eSSzymon Olewniczak    }
450fe5d6d1eSSzymon Olewniczak
4511f0a4a30SSzymon Olewniczak    protected function migration8($data) {
4521f0a4a30SSzymon Olewniczak        /** @var helper_plugin_sqlite $sqlite */
4531f0a4a30SSzymon Olewniczak        $sqlite = $data['sqlite'];
4541f0a4a30SSzymon Olewniczak
455*d3caa25dSSzymon Olewniczak        $db = $sqlite->getAdapter()->getPdo();
456*d3caa25dSSzymon Olewniczak        $db->commit(); // stop current transatction
4571f0a4a30SSzymon Olewniczak        $db->query('PRAGMA journal_mode=WAL');
458*d3caa25dSSzymon Olewniczak        $db->beginTransaction(); // recreate transaction
4591f0a4a30SSzymon Olewniczak        return true;
4601f0a4a30SSzymon Olewniczak    }
4611f0a4a30SSzymon Olewniczak
462fe5d6d1eSSzymon Olewniczak}
463