| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Db; |
|
|
| use Zend_Db_Table; |
| use Piwik\Piwik; |
|
|
| class Adapter |
| { |
| |
| |
| |
| |
| |
| |
| |
| |
| public static function factory( |
| $adapterName, |
| #[\SensitiveParameter] |
| &$dbInfos, |
| $connect = true |
| ) { |
| if ($connect) { |
| if (isset($dbInfos['port']) && is_string($dbInfos['port']) && $dbInfos['port'][0] === '/') { |
| $dbInfos['unix_socket'] = $dbInfos['port']; |
| unset($dbInfos['host']); |
| unset($dbInfos['port']); |
| } |
|
|
| |
| unset($dbInfos['tables_prefix']); |
| unset($dbInfos['adapter']); |
| unset($dbInfos['schema']); |
| } |
|
|
| $className = self::getAdapterClassName($adapterName); |
|
|
| |
| $infos = array(); |
| foreach ($dbInfos as $key => $val) { |
| $infos[$key] = $val; |
| } |
|
|
| $adapter = new $className($infos); |
|
|
| if ($connect) { |
| try { |
| $adapter->getConnection(); |
|
|
| Zend_Db_Table::setDefaultAdapter($adapter); |
| |
| $adapter->resetConfig(); |
| } catch (\Exception $e) { |
| |
| $msg = self::overriddenExceptionMessage($e->getMessage()); |
| if ('' !== $msg) { |
| throw new \Exception($msg); |
| } |
|
|
| throw $e; |
| } |
| } |
|
|
| return $adapter; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| private static function getAdapterClassName($adapterName) |
| { |
| $className = 'Piwik\Db\Adapter\\' . str_replace(' ', '\\', ucwords(str_replace(array('_', '\\'), ' ', strtolower($adapterName)))); |
| if (!class_exists($className)) { |
| throw new \Exception(sprintf("Adapter '%s' is not valid. Maybe check that your Matomo configuration files in config/*.ini.php are readable by the webserver.", $adapterName)); |
| } |
| return $className; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public static function getDefaultPortForAdapter($adapterName) |
| { |
| $className = self::getAdapterClassName($adapterName); |
| return call_user_func(array($className, 'getDefaultPort')); |
| } |
|
|
| |
| |
| |
| |
| |
| public static function getAdapters() |
| { |
| static $adapterNames = array( |
| |
| 'Pdo\Mysql', |
| 'Mysqli', |
|
|
| |
| ); |
|
|
| $adapters = array(); |
|
|
| foreach ($adapterNames as $adapterName) { |
| $className = '\Piwik\Db\Adapter\\' . $adapterName; |
| if (call_user_func(array($className, 'isEnabled'))) { |
| $adapters[] = strtoupper($adapterName); |
| } |
| } |
|
|
| return $adapters; |
| } |
|
|
| |
| |
| |
| |
| |
| public static function isRecommendedAdapter($adapterName) |
| { |
| return strtolower($adapterName) === 'pdo/mysql'; |
| } |
|
|
| |
| |
| |
| |
| |
| public static function overriddenExceptionMessage($message) |
| { |
| $safeMessageMap = array( |
| |
| '[2006]' => Piwik::translate('General_ExceptionDatabaseUnavailable'), |
| 'MySQL server has gone away' => Piwik::translate('General_ExceptionDatabaseUnavailable'), |
| '[1698]' => Piwik::translate('General_ExceptionDatabaseAccess'), |
| 'Access denied' => Piwik::translate('General_ExceptionDatabaseAccess'), |
| ); |
|
|
| foreach ($safeMessageMap as $search_term => $safeMessage) { |
| if (strpos($message, $search_term) !== false) { |
| return $safeMessage; |
| } |
| } |
|
|
| return ''; |
| } |
| } |
|
|