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