xref: /plugin/sqlite/Functions.php (revision 762252ad3ba74bfc388548601f0a94f1f5dbb90a)
18da7d805SAndreas Gohr<?php
2a7a40fb2SAnna Dabrowska
38da7d805SAndreas Gohr/**
48da7d805SAndreas Gohr * @noinspection PhpUndefinedMethodInspection
58da7d805SAndreas Gohr * @noinspection PhpComposerExtensionStubsInspection
68da7d805SAndreas Gohr */
78da7d805SAndreas Gohr
88da7d805SAndreas Gohrnamespace dokuwiki\plugin\sqlite;
98da7d805SAndreas Gohr
108da7d805SAndreas Gohr/**
118da7d805SAndreas Gohr * SQLite registered functions
128da7d805SAndreas Gohr */
138da7d805SAndreas Gohrclass Functions
148da7d805SAndreas Gohr{
158da7d805SAndreas Gohr    /**
168da7d805SAndreas Gohr     * Register all standard functions
178da7d805SAndreas Gohr     *
188da7d805SAndreas Gohr     * @param \PDO $pdo
198da7d805SAndreas Gohr     */
208da7d805SAndreas Gohr    public static function register($pdo)
218da7d805SAndreas Gohr    {
22ded78afbSAndreas Gohr        $pdo->sqliteCreateAggregate(
23ded78afbSAndreas Gohr            'GROUP_CONCAT_DISTINCT',
24c76618fbSAnna Dabrowska            [Functions::class, 'groupConcatStep'],
25c76618fbSAnna Dabrowska            [Functions::class, 'groupConcatFinalize']
26ded78afbSAndreas Gohr        );
27ded78afbSAndreas Gohr
288da7d805SAndreas Gohr        $pdo->sqliteCreateFunction('GETACCESSLEVEL', [Functions::class, 'getAccessLevel'], 1);
29ba0d12e7SAndreas Gohr        $pdo->sqliteCreateFunction('PAGEISHIDDEN', [Functions::class, 'pageIsHidden'], 1);
308da7d805SAndreas Gohr        $pdo->sqliteCreateFunction('PAGEEXISTS', [Functions::class, 'pageExists'], 1);
318da7d805SAndreas Gohr        $pdo->sqliteCreateFunction('REGEXP', [Functions::class, 'regExp'], 2);
328da7d805SAndreas Gohr        $pdo->sqliteCreateFunction('CLEANID', 'cleanID', 1);
338da7d805SAndreas Gohr        $pdo->sqliteCreateFunction('RESOLVEPAGE', [Functions::class, 'resolvePage'], 1);
348da7d805SAndreas Gohr    }
358da7d805SAndreas Gohr
368da7d805SAndreas Gohr    /**
37ded78afbSAndreas Gohr     * Aggregation function for SQLite via PDO
38ded78afbSAndreas Gohr     *
39ded78afbSAndreas Gohr     * @link http://devzone.zend.com/article/863-SQLite-Lean-Mean-DB-Machine
40ded78afbSAndreas Gohr     *
41ded78afbSAndreas Gohr     * @param null|array &$context (reference) argument where processed data can be stored
42ded78afbSAndreas Gohr     * @param int $rownumber current row number
43ded78afbSAndreas Gohr     * @param string $string column value
44ded78afbSAndreas Gohr     * @param string $separator separator added between values
45ded78afbSAndreas Gohr     */
46c76618fbSAnna Dabrowska    public static function groupConcatStep(&$context, $rownumber, $string, $separator = ',')
47ded78afbSAndreas Gohr    {
48ded78afbSAndreas Gohr        if (is_null($context)) {
49ded78afbSAndreas Gohr            $context = [
50ded78afbSAndreas Gohr                'sep' => $separator,
51ded78afbSAndreas Gohr                'data' => []
52ded78afbSAndreas Gohr            ];
53ded78afbSAndreas Gohr        }
54ded78afbSAndreas Gohr
55ded78afbSAndreas Gohr        $context['data'][] = $string;
56ded78afbSAndreas Gohr        return $context;
57ded78afbSAndreas Gohr    }
58ded78afbSAndreas Gohr
59ded78afbSAndreas Gohr    /**
60ded78afbSAndreas Gohr     * Aggregation function for SQLite via PDO
61ded78afbSAndreas Gohr     *
62ded78afbSAndreas Gohr     * @link http://devzone.zend.com/article/863-SQLite-Lean-Mean-DB-Machine
63ded78afbSAndreas Gohr     *
64ded78afbSAndreas Gohr     * @param null|array &$context (reference) data as collected in step callback
65ded78afbSAndreas Gohr     * @param int $rownumber number of rows over which the aggregate was performed.
66ded78afbSAndreas Gohr     * @return null|string
67ded78afbSAndreas Gohr     */
68c76618fbSAnna Dabrowska    public static function groupConcatFinalize(&$context, $rownumber)
69ded78afbSAndreas Gohr    {
70ded78afbSAndreas Gohr        if (!is_array($context)) {
71ded78afbSAndreas Gohr            return null;
72ded78afbSAndreas Gohr        }
73ded78afbSAndreas Gohr        $context['data'] = array_unique($context['data']);
74ded78afbSAndreas Gohr        if (empty($context['data'][0])) {
75ded78afbSAndreas Gohr            return null;
76ded78afbSAndreas Gohr        }
77a7a40fb2SAnna Dabrowska        return implode($context['sep'], $context['data']);
78ded78afbSAndreas Gohr    }
79ded78afbSAndreas Gohr
80ded78afbSAndreas Gohr
81ded78afbSAndreas Gohr    /**
828da7d805SAndreas Gohr     * Callback checks the permissions for the current user
838da7d805SAndreas Gohr     *
848da7d805SAndreas Gohr     * This function is registered as a SQL function named GETACCESSLEVEL
858da7d805SAndreas Gohr     *
868da7d805SAndreas Gohr     * @param string $pageid page ID (needs to be resolved and cleaned)
878da7d805SAndreas Gohr     * @return int permission level
888da7d805SAndreas Gohr     */
898da7d805SAndreas Gohr    public static function getAccessLevel($pageid)
908da7d805SAndreas Gohr    {
91da6f67b7SAndreas Gohr        global $auth;
92da6f67b7SAndreas Gohr        if (!$auth) return AUTH_DELETE;
93da6f67b7SAndreas Gohr
948da7d805SAndreas Gohr        static $aclcache = [];
958da7d805SAndreas Gohr
968da7d805SAndreas Gohr        if (isset($aclcache[$pageid])) {
978da7d805SAndreas Gohr            return $aclcache[$pageid];
988da7d805SAndreas Gohr        }
998da7d805SAndreas Gohr
1008da7d805SAndreas Gohr        $acl = auth_quickaclcheck($pageid);
1018da7d805SAndreas Gohr        $aclcache[$pageid] = $acl;
1028da7d805SAndreas Gohr        return $acl;
1038da7d805SAndreas Gohr    }
1048da7d805SAndreas Gohr
1058da7d805SAndreas Gohr    /**
106ba0d12e7SAndreas Gohr     * Check if a page is hidden
107ba0d12e7SAndreas Gohr     *
108ba0d12e7SAndreas Gohr     * @param string $pageid
109*762252adSAndreas Gohr     * @return int 1 if the page is hidden
110ba0d12e7SAndreas Gohr     */
111ba0d12e7SAndreas Gohr    public static function pageIsHidden($pageid)
112ba0d12e7SAndreas Gohr    {
113ba0d12e7SAndreas Gohr        static $hiddenCache = [];
114ba0d12e7SAndreas Gohr        if (isset($hiddenCache[$pageid])) {
115ba0d12e7SAndreas Gohr            return $hiddenCache[$pageid];
116ba0d12e7SAndreas Gohr        }
117ba0d12e7SAndreas Gohr
118ba0d12e7SAndreas Gohr
119*762252adSAndreas Gohr        $ishidden = (int) isHiddenPage($pageid);
120ba0d12e7SAndreas Gohr        $hiddenCache[$pageid] = $ishidden;
121ba0d12e7SAndreas Gohr        return $ishidden;
122ba0d12e7SAndreas Gohr    }
123ba0d12e7SAndreas Gohr
124ba0d12e7SAndreas Gohr    /**
1258da7d805SAndreas Gohr     * Wrapper around page_exists() with static caching
1268da7d805SAndreas Gohr     *
1278da7d805SAndreas Gohr     * This function is registered as a SQL function named PAGEEXISTS
1288da7d805SAndreas Gohr     *
1298da7d805SAndreas Gohr     * @param string $pageid
1308da7d805SAndreas Gohr     * @return int 0|1
1318da7d805SAndreas Gohr     */
1328da7d805SAndreas Gohr    public static function pageExists($pageid)
1338da7d805SAndreas Gohr    {
1348da7d805SAndreas Gohr        static $cache = [];
1358da7d805SAndreas Gohr        if (!isset($cache[$pageid])) {
1368da7d805SAndreas Gohr            $cache[$pageid] = page_exists($pageid);
1378da7d805SAndreas Gohr        }
1388da7d805SAndreas Gohr        return (int)$cache[$pageid];
1398da7d805SAndreas Gohr    }
1408da7d805SAndreas Gohr
1418da7d805SAndreas Gohr    /**
1428da7d805SAndreas Gohr     * Match a regular expression against a value
1438da7d805SAndreas Gohr     *
1448da7d805SAndreas Gohr     * This function is registered as a SQL function named REGEXP
1458da7d805SAndreas Gohr     *
1468da7d805SAndreas Gohr     * @param string $regexp
1478da7d805SAndreas Gohr     * @param string $value
1488da7d805SAndreas Gohr     * @return bool
1498da7d805SAndreas Gohr     */
1508da7d805SAndreas Gohr    public static function regExp($regexp, $value)
1518da7d805SAndreas Gohr    {
1528da7d805SAndreas Gohr        $regexp = addcslashes($regexp, '/');
1538da7d805SAndreas Gohr        return (bool)preg_match('/' . $regexp . '/u', $value);
1548da7d805SAndreas Gohr    }
1558da7d805SAndreas Gohr
1568da7d805SAndreas Gohr    /**
1578da7d805SAndreas Gohr     * Resolves a page ID (relative namespaces, plurals etc)
1588da7d805SAndreas Gohr     *
1598da7d805SAndreas Gohr     * This function is registered as a SQL function named RESOLVEPAGE
1608da7d805SAndreas Gohr     *
1618da7d805SAndreas Gohr     * @param string $page The page ID to resolve
1628da7d805SAndreas Gohr     * @param string $context The page ID (not namespace!) to resolve the page with
1638da7d805SAndreas Gohr     * @return null|string
1648da7d805SAndreas Gohr     */
1658da7d805SAndreas Gohr    public static function resolvePage($page, $context)
1668da7d805SAndreas Gohr    {
1678da7d805SAndreas Gohr        if (is_null($page)) return null;
1688da7d805SAndreas Gohr        if (is_null($context)) return cleanID($page);
1698da7d805SAndreas Gohr
1708da7d805SAndreas Gohr        $ns = getNS($context);
1718da7d805SAndreas Gohr        resolve_pageid($ns, $page, $exists);
1728da7d805SAndreas Gohr        return $page;
1738da7d805SAndreas Gohr    }
1748da7d805SAndreas Gohr}
175