1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Db;
use Zend_Db_Table;
/**
*/
class Adapter
{
/**
* Create adapter
*
* @param string $adapterName database adapter name
* @param array $dbInfos database connection info
* @param bool $connect
* @return AdapterInterface
*/
public static function factory($adapterName, & $dbInfos, $connect = true)
{
if ($connect) {
if ($dbInfos['port'][0] == '/') {
$dbInfos['unix_socket'] = $dbInfos['port'];
unset($dbInfos['host']);
unset($dbInfos['port']);
}
// not used by Zend Framework
unset($dbInfos['tables_prefix']);
unset($dbInfos['adapter']);
unset($dbInfos['schema']);
}
$className = self::getAdapterClassName($adapterName);
$adapter = new $className($dbInfos);
if ($connect) {
$adapter->getConnection();
Zend_Db_Table::setDefaultAdapter($adapter);
// we don't want the connection information to appear in the logs
$adapter->resetConfig();
}
return $adapter;
}
/**
* Get adapter class name
*
* @param string $adapterName
* @return string
* @throws \Exception
*/
private static function getAdapterClassName($adapterName)
{
$className = 'Piwik\Db\Adapter\\' . str_replace(' ', '\\', ucwords(str_replace(array('_', '\\'), ' ', strtolower($adapterName))));
if (!class_exists($className)) {
throw new \Exception("Adapter $adapterName is not valid.");
}
return $className;
}
/**
* Get default port for named adapter
*
* @param string $adapterName
* @return int
*/
public static function getDefaultPortForAdapter($adapterName)
{
$className = self::getAdapterClassName($adapterName);
return call_user_func(array($className, 'getDefaultPort'));
}
/**
* Get list of adapters
*
* @return array
*/
public static function getAdapters()
{
static $adapterNames = array(
// currently supported by Piwik
'Pdo\Mysql',
'Mysqli',
// other adapters supported by Zend_Db
// 'Pdo_Pgsql',
// 'Pdo_Mssql',
// 'Sqlsrv',
// 'Pdo_Ibm',
// 'Db2',
// 'Pdo_Oci',
// 'Oracle',
);
$adapters = array();
foreach ($adapterNames as $adapterName) {
$className = '\Piwik\Db\Adapter\\' . $adapterName;
if (call_user_func(array($className, 'isEnabled'))) {
$adapters[strtoupper($adapterName)] = call_user_func(array($className, 'getDefaultPort'));
}
}
return $adapters;
}
}
|