1<?php 2/** 3 * DokuWiki Plugin extendpage (Admin Component) 4 * 5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6 * @author Frieder Schrempf <dev@fris.de> 7 */ 8 9use dokuwiki\plugin\extendpage\meta\ExtendPageException; 10 11class helper_plugin_extendpage_db extends DokuWiki_Plugin 12{ 13 /** @var helper_plugin_sqlite */ 14 protected $sqlite; 15 16 /** 17 * helper_plugin_extendpage_db constructor. 18 */ 19 public function __construct() 20 { 21 $this->init(); 22 } 23 24 /** 25 * Initialize the database 26 * 27 * @throws Exception 28 */ 29 protected function init() 30 { 31 /** @var helper_plugin_sqlite $sqlite */ 32 $this->sqlite = plugin_load('helper', 'sqlite'); 33 if (!$this->sqlite) { 34 if (defined('DOKU_UNITTEST')) throw new \Exception('Couldn\'t load sqlite.'); 35 return; 36 } 37 38 if ($this->sqlite->getAdapter() === null) { 39 if (defined('DOKU_UNITTEST')) throw new \Exception('Couldn\'t load PDO sqlite.'); 40 $this->sqlite = null; 41 return; 42 } 43 44 if ($this->sqlite->getAdapter()->getName() != DOKU_EXT_PDO) { 45 if (defined('DOKU_UNITTEST')) throw new \Exception('Couldn\'t load PDO sqlite.'); 46 $this->sqlite = null; 47 return; 48 } 49 $this->sqlite->getAdapter()->setUseNativeAlter(true); 50 51 // initialize the database connection 52 if (!$this->sqlite->init('extendpage', DOKU_PLUGIN . 'extendpage/db/')) { 53 if (defined('DOKU_UNITTEST')) throw new \Exception('Couldn\'t init sqlite.'); 54 $this->sqlite = null; 55 return; 56 } 57 } 58 59 /** 60 * @param bool $throw throw an Exception when sqlite not available? 61 * @return helper_plugin_sqlite|null 62 */ 63 public function getDB($throw = true) 64 { 65 global $conf; 66 $len = strlen($conf['metadir']); 67 if ($this->sqlite && $conf['metadir'] != substr($this->sqlite->getAdapter()->getDbFile(), 0, $len)) { 68 $this->init(); 69 } 70 if (!$this->sqlite && $throw) { 71 throw new ExtendPageException('no sqlite'); 72 } 73 return $this->sqlite; 74 } 75 76 /** 77 * Completely remove the database and reinitialize it 78 * 79 * You do not want to call this except for testing! 80 */ 81 public function resetDB() 82 { 83 if (!$this->sqlite) return; 84 $file = $this->sqlite->getAdapter()->getDbFile(); 85 if (!$file) return; 86 unlink($file); 87 clearstatcache(true, $file); 88 $this->init(); 89 } 90}