Passed
Push — master ( 5379a4...a2888f )
by Joao
04:49
created

ConnectionManagement::getDbType()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 2
1
<?php
2
3
namespace ByJG\AnyDataset;
4
5
use ByJG\AnyDataset\Exception\DatabaseException;
6
use InvalidArgumentException;
7
8
class ConnectionManagement
9
{
10
11
    protected $_dbconnectionstring;
12
13 1
    public function setDbConnectionString($value)
14
    {
15 1
        $this->_dbconnectionstring = $value;
16 1
    }
17
18
    public function getDbConnectionString()
19
    {
20
        return $this->_dbconnectionstring;
21
    }
22
23
    protected $_driver;
24
25
    public function setDriver($value)
26
    {
27
        $this->_driver = $value;
28
    }
29
30
    public function getDriver()
31
    {
32
        return $this->_driver;
33
    }
34
35
    protected $_username;
36
37
    public function setUsername($value)
38
    {
39
        $this->_username = $value;
40
    }
41
42
    public function getUsername()
43
    {
44
        return $this->_username;
45
    }
46
47
    protected $_password;
48
49
    public function setPassword($value)
50
    {
51
        $this->_password = $value;
52
    }
53
54
    public function getPassword()
55
    {
56
        return $this->_password;
57
    }
58
59
    protected $_server;
60
61
    public function setServer($value)
62
    {
63
        $this->_server = $value;
64
    }
65
66
    public function getServer()
67
    {
68
        return $this->_server;
69
    }
70
71
    protected $_port = "";
72
73
    public function setPort($value)
74
    {
75
        $this->_port = $value;
76
    }
77
78
    public function getPort()
79
    {
80
        return $this->_port;
81
    }
82
83
    protected $_database;
84
85
    public function setDatabase($value)
86
    {
87
        $this->_database = $value;
88
    }
89
90
    public function getDatabase()
91
    {
92
        return $this->_database;
93
    }
94
95
    protected $_extraParam = array();
96
97
    public function addExtraParam($key, $value)
98
    {
99
        $this->_extraParam[$key] = $value;
100
    }
101
102
    public function getExtraParam($key)
103
    {
104
        if (array_key_exists($key, $this->_extraParam)) {
105
            return $this->_extraParam[$key];
106
        } else {
107
            return "";
108
        }
109
    }
110
111
    protected $_file;
112
113
    public function setFilePath($value)
114
    {
115
        $this->_file = $value;
116
    }
117
118
    public function getFilePath()
119
    {
120
        return $this->_file;
121
    }
122
123
    /**
124
     * The connection string must be defined in the config file 'config/anydataset.php'
125
     * 
126
     * @param string $dbname
127
     * @throws DatabaseException
128
     * @throws InvalidArgumentException
129
     */
130
    public function __construct($dbname)
131
    {
132
133
        $config = [
134
            'url' => $dbname
135
        ];
136
        if (!preg_match('~^(\w+)://~', $dbname)) {
137
            $config = AnyDatasetContext::getInstance()->getConnectionString($dbname);
138
        }
139
140
        $this->setDbConnectionString($config['url']);
141
142
        $patDriver = "(?P<driver>[\w\.]+)\:\/\/";
143
        $patCredentials = "(?:((?P<username>\S+):(?P<password>\S+)|(?P<username2>\S+))@)?";
144
        $patHost = "(?P<host>[\w\-\.,_]+)(?::(?P<port>\d+))?";
145
        $patDatabase = "(\/(?P<database>[\w\-\.]+))?";
146
        $patExtra = "(?:\?(?P<extraparam>(?:[\w\-\.]+=[\w\-%\.\/]+&?)*))?";
147
        $patFile = "(?P<path>(?:\w\:)?\/(?:[\w\-\.]+\/?)+)?";
148
149
        // Try to parse the connection string.
150
        $pat = "/$patDriver($patCredentials$patHost$patDatabase|$patFile)$patExtra/i";
151
        $parts = array();
152
        if (!preg_match($pat, $this->getDbConnectionString(), $parts)) {
153
            throw new InvalidArgumentException("Connection string " . $this->getDbConnectionString() . " is invalid! Please fix it.");
154
        }
155
156
        // Set the Driver
157
        $this->setDriver($parts ['driver']);
158
159
        if (!isset($parts['path']) && !isset($parts['host'])) {
160
            throw new InvalidArgumentException("Connection string " . $this->getDbConnectionString() . " is invalid! Please fix it.");
161
        }
162
163
164
        // If a path pattern was found set it; otherwise define the database properties
165
        if (array_key_exists('path', $parts) && (!empty($parts['path']))) {
166
            $this->setFilePath($parts['path']);
167
        } else {
168
            $this->setUsername(empty($parts ['username']) ? $parts ['username2'] : $parts ['username']);
169
            $this->setPassword(isset($parts ['password']) ? $parts ['password'] : '');
170
            $this->setServer($parts ['host']);
171
            $this->setPort(isset($parts ['port']) ? $parts ['port'] : '');
172
            $this->setDatabase(isset($parts ['database']) ? $parts ['database'] : '');
173
        }
174
175
        // If extra param is defined, set it.
176
        if (array_key_exists('extraparam', $parts) && (!empty($parts['extraparam']))) {
177
            $arrAux = explode('&', $parts['extraparam']);
178
            foreach ($arrAux as $item) {
179
                $aux = explode("=", $item);
180
                $this->addExtraParam($aux[0], $aux[1]);
181
            }
182
        }
183
    }
184
}
185