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