1549a0837SAndreas Gohr<?php 2d6d97f60SAnna Dabrowska 3549a0837SAndreas Gohr/** 4549a0837SAndreas Gohr * DokuWiki Plugin struct (Helper Component) 5549a0837SAndreas Gohr * 6549a0837SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7549a0837SAndreas Gohr * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 8549a0837SAndreas Gohr */ 9549a0837SAndreas Gohr 107234bfb1Ssplitbrainuse dokuwiki\Extension\Plugin; 1191c655b4SAndreas Gohruse dokuwiki\ErrorHandler; 1291c655b4SAndreas Gohruse dokuwiki\plugin\sqlite\SQLiteDB; 137cbcfbdbSAndreas Gohruse dokuwiki\plugin\struct\meta\StructException; 147cbcfbdbSAndreas Gohr 157234bfb1Ssplitbrainclass helper_plugin_struct_db extends Plugin 16d6d97f60SAnna Dabrowska{ 1791c655b4SAndreas Gohr /** @var SQLiteDB */ 18083afc55SAndreas Gohr protected $sqlite; 19083afc55SAndreas Gohr 200fe33e72SAndreas Gohr /** 217d0142f5SAndreas Gohr * Initialize the database 227d0142f5SAndreas Gohr * 237d0142f5SAndreas Gohr * @throws Exception 247d0142f5SAndreas Gohr */ 257d0142f5SAndreas Gohr protected function init() 267d0142f5SAndreas Gohr { 277d0142f5SAndreas Gohr $this->sqlite = new SQLiteDB('struct', DOKU_PLUGIN . 'struct/db/'); 287d0142f5SAndreas Gohr 297d0142f5SAndreas Gohr // register our JSON function with variable parameters 307d0142f5SAndreas Gohr $this->sqlite->getPdo()->sqliteCreateFunction('STRUCT_JSON', [$this, 'STRUCT_JSON'], -1); 317d0142f5SAndreas Gohr 32*cdd16494SAnna Dabrowska // register our JSON decode function with variable parameters 33*cdd16494SAnna Dabrowska $this->sqlite->getPdo()->sqliteCreateFunction('STRUCT_LOOKUP', [$this, 'STRUCT_LOOKUP'], -1); 34*cdd16494SAnna Dabrowska 357d0142f5SAndreas Gohr // this function is meant to be overwritten by plugins 367d0142f5SAndreas Gohr $this->sqlite->getPdo()->sqliteCreateFunction('IS_PUBLISHER', [$this, 'IS_PUBLISHER'], -1); 377d0142f5SAndreas Gohr } 387d0142f5SAndreas Gohr 397d0142f5SAndreas Gohr /** 40cfefffa4SAndreas Gohr * @param bool $throw throw an Exception when sqlite not available or fails to load 4191c655b4SAndreas Gohr * @return SQLiteDB|null 42cfefffa4SAndreas Gohr * @throws Exception 430fe33e72SAndreas Gohr */ 4491c655b4SAndreas Gohr public function getDB($throw = true) 45d6d97f60SAnna Dabrowska { 467234bfb1Ssplitbrain if (!$this->sqlite instanceof SQLiteDB) { 47cfefffa4SAndreas Gohr if (!class_exists(SQLiteDB::class)) { 48cfefffa4SAndreas Gohr if ($throw || defined('DOKU_UNITTEST')) throw new StructException('no sqlite'); 49cfefffa4SAndreas Gohr return null; 50cfefffa4SAndreas Gohr } 51cfefffa4SAndreas Gohr 5279b29326SAnna Dabrowska try { 537d0142f5SAndreas Gohr $this->init(); 5491c655b4SAndreas Gohr } catch (\Exception $exception) { 5591c655b4SAndreas Gohr ErrorHandler::logException($exception); 56cfefffa4SAndreas Gohr if ($throw) throw $exception; 5791c655b4SAndreas Gohr return null; 58083afc55SAndreas Gohr } 59083afc55SAndreas Gohr } 60083afc55SAndreas Gohr return $this->sqlite; 61549a0837SAndreas Gohr } 62549a0837SAndreas Gohr 630fe33e72SAndreas Gohr /** 640fe33e72SAndreas Gohr * Completely remove the database and reinitialize it 650fe33e72SAndreas Gohr * 660fe33e72SAndreas Gohr * You do not want to call this except for testing! 670fe33e72SAndreas Gohr */ 68d6d97f60SAnna Dabrowska public function resetDB() 69d6d97f60SAnna Dabrowska { 700fe33e72SAndreas Gohr if (!$this->sqlite) return; 7179b29326SAnna Dabrowska $file = $this->sqlite->getDbFile(); 720fe33e72SAndreas Gohr if (!$file) return; 730fe33e72SAndreas Gohr unlink($file); 740fe33e72SAndreas Gohr clearstatcache(true, $file); 7591c655b4SAndreas Gohr $this->sqlite = null; 760fe33e72SAndreas Gohr } 778fefbb59SAndreas Gohr 788fefbb59SAndreas Gohr /** 798fefbb59SAndreas Gohr * Encodes all given arguments into a JSON encoded array 808fefbb59SAndreas Gohr * 818fefbb59SAndreas Gohr * @param string ... 828fefbb59SAndreas Gohr * @return string 838fefbb59SAndreas Gohr */ 847234bfb1Ssplitbrain public function STRUCT_JSON(...$args) // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps 85d6d97f60SAnna Dabrowska { 865e29103aSannda return json_encode($args, JSON_THROW_ON_ERROR); 878fefbb59SAndreas Gohr } 88bb8d98c4SAnna Dabrowska 89bb8d98c4SAnna Dabrowska /** 90*cdd16494SAnna Dabrowska * Decodes a struct JSON structure and returns the requested value 91*cdd16494SAnna Dabrowska * 92*cdd16494SAnna Dabrowska * @param ...$args 93*cdd16494SAnna Dabrowska * @return mixed|null 94*cdd16494SAnna Dabrowska */ 95*cdd16494SAnna Dabrowska public function STRUCT_LOOKUP(...$args) // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps 96*cdd16494SAnna Dabrowska { 97*cdd16494SAnna Dabrowska $json = $args[0]; 98*cdd16494SAnna Dabrowska $field = $args[1]; 99*cdd16494SAnna Dabrowska 100*cdd16494SAnna Dabrowska try { 101*cdd16494SAnna Dabrowska $vals = json_decode($json, true, 512, JSON_THROW_ON_ERROR); 102*cdd16494SAnna Dabrowska } catch (\JsonException $exception) { 103*cdd16494SAnna Dabrowska return null; 104*cdd16494SAnna Dabrowska } 105*cdd16494SAnna Dabrowska return $vals[$field]; 106*cdd16494SAnna Dabrowska } 107*cdd16494SAnna Dabrowska 108*cdd16494SAnna Dabrowska /** 109bb8d98c4SAnna Dabrowska * This dummy implementation can be overwritten by a plugin 110bb8d98c4SAnna Dabrowska * 11100624072SAnna Dabrowska * @return int 112bb8d98c4SAnna Dabrowska */ 113bb8d98c4SAnna Dabrowska public function IS_PUBLISHER() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps 114bb8d98c4SAnna Dabrowska { 11500624072SAnna Dabrowska return 1; 116bb8d98c4SAnna Dabrowska } 117549a0837SAndreas Gohr} 118549a0837SAndreas Gohr 119549a0837SAndreas Gohr// vim:ts=4:sw=4:et: 120