register_hook('PLUGIN_SQLITE_DATABASE_UPGRADE', 'BEFORE', $this, 'handle_migrations'); } /** * Call our custom migrations when defined * * @param Doku_Event $event * @param $param */ public function handle_migrations(Doku_Event $event, $param) { if ($event->data['sqlite']->getAdapter()->getDbname() !== 'b3p') { return; } $to = $event->data['to']; if(is_callable(array($this, "migration$to"))) { $event->preventDefault(); $event->result = call_user_func(array($this, "migration$to"), $event->data); } } /** * Executes Migration 1 * * Add a latest column to all existing multi tables * * @param helper_plugin_sqlite $sqlite * @return bool */ protected function migration1($data) { $file = $data['file']; /** @var helper_plugin_sqlite $sqlite */ $sqlite = $data['sqlite']; $sql = file_get_contents($file); if ($sql === false) { throw new Exception('cannot open file '.$file); } $matches = array(); preg_match_all('/.*?(?(?=BEGIN)BEGIN.*?END)\s*;/is', $sql, $matches); $queries = $matches[0]; $db = $sqlite->getAdapter()->getDb(); $db->beginTransaction(); foreach ($queries as $query) { $res = $db->query($query); if($res === false) { $err = $db->errorInfo(); msg($err[0].' '.$err[1].' '.$err[2].':
'.hsc($sql).'
', -1); $db->rollBack(); return false; } } $db->commit(); return true; } }