xref: /plugin/struct/helper/db.php (revision cdd16494506329e45f6f88b0a97dcfe7eec0f612)
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