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