Test Failed
Pull Request — master (#97)
by Gildonei
03:38
created

PDOWrapper   A

Complexity

Total Complexity 41

Size/Duplication

Total Lines 184
Duplicated Lines 0 %

Test Coverage

Coverage 71.81%

Importance

Changes 10
Bugs 1 Features 1
Metric Value
wmc 41
eloc 78
c 10
b 1
f 1
dl 0
loc 184
ccs 79
cts 110
cp 0.7181
rs 9.1199

32 Methods

Rating   Name   Duplication   Size   Complexity  
A lastInsertId() 0 2 1
A execute() 0 2 1
A fetchOne() 0 7 2
A prepareStatement() 0 2 1
A getStatement() 0 4 1
A fetchAllColumn() 0 7 2
A fetchAll() 0 7 2
A fetchColumn() 0 5 2
A __construct() 0 3 1
A connect() 0 3 1
A getAvailableDrivers() 0 2 1
A getPrimaryKeys() 0 8 2
A query() 0 2 1
A executeStatement() 0 2 1
A queryColumn() 0 2 1
A savePoint() 0 2 1
A _optPrepareAndExecute() 0 8 2
A commit() 0 2 1
A getFieldsInfos() 0 8 2
A rollbackPoint() 0 2 1
A releasePoint() 0 2 1
A beginTransaction() 0 2 1
A inTransaction() 0 2 1
A queryAll() 0 2 1
A rollBack() 0 2 1
A ping() 0 2 2
A getDSN() 0 6 2
A statementRowCount() 0 2 1
A getTablesName() 0 3 1
A bindValueFromStatement() 0 2 1
A nestable() 0 2 1
A getForeignKeys() 0 9 1

How to fix   Complexity   

Complex Class

Complex classes like PDOWrapper often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PDOWrapper, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace Ubiquity\db\providers\pdo;
4
5
use Ubiquity\db\providers\AbstractDbWrapper;
6
7
/**
8
 * Ubiquity\db\providers$PDOWrapper
9
 * This class is part of Ubiquity
10
 *
11
 * @author jcheron <[email protected]>
12
 * @version 1.0.0
13
 * @property \PDO $dbInstance
14
 *
15
 */
16
class PDOWrapper extends AbstractDbWrapper {
17
	protected static $savepointsDrivers = [ 'pgsql' => true,'mysql' => true,'sqlite' => true ];
18
	private static $quotes = [ 'mysql' => '`','sqlite' => '"','pgsql' => '' ];
19
	protected $transactionLevel = 0;
20
	protected $dbType;
21
22 80
	public function __construct($dbType = 'mysql') {
23 80
		$this->quote = self::$quotes [$dbType] ?? '';
24 80
		$this->dbType = $dbType;
25 80
	}
26
27
	public function fetchAllColumn($statement, array $values = null, string $column = null) {
28
		$result = false;
29
		if ($statement->execute ( $values )) {
30
			$result = $statement->fetchAll ( \PDO::FETCH_COLUMN, $column );
31
		}
32
		$statement->closeCursor ();
33
		return $result;
34
	}
35
36 10
	public function lastInsertId() {
37 10
		return $this->dbInstance->lastInsertId ();
38
	}
39
40 23
	public function fetchAll($statement, array $values = null, $mode = null) {
41 23
		$result = false;
42 23
		if ($statement->execute ( $values )) {
43 23
			$result = $statement->fetchAll ( $mode );
44
		}
45 23
		$statement->closeCursor ();
46 23
		return $result;
47
	}
48
49
	public function fetchOne($statement, array $values = null, $mode = null) {
50
		$result = false;
51
		if ($statement->execute ( $values )) {
52
			$result = $statement->fetch ( $mode );
53
		}
54
		$statement->closeCursor ();
55
		return $result;
56
	}
57
58 2
	public static function getAvailableDrivers() {
59 2
		return \PDO::getAvailableDrivers ();
60
	}
61
62 7
	public function prepareStatement(string $sql) {
63 7
		return $this->dbInstance->prepare ( $sql );
64
	}
65
66
	public function fetchColumn($statement, array $values = null, int $columnNumber = null) {
67
		if ($statement->execute ( $values )) {
68
			return $statement->fetchColumn ( $columnNumber );
69
		}
70
		return false;
71
	}
72
73 68
	public function getStatement($sql) {
74 68
		$st = $this->dbInstance->prepare ( $sql );
75 68
		$st->setFetchMode ( \PDO::FETCH_ASSOC );
76 68
		return $st;
77
	}
78
79
	public function execute($sql) {
80
		return $this->dbInstance->exec ( $sql );
81
	}
82
83 75
	public function connect(string $dbType, $dbName, $serverName, string $port, string $user, string $password, array $options) {
84 75
		$options [\PDO::ATTR_ERRMODE] = \PDO::ERRMODE_EXCEPTION;
85 75
		$this->dbInstance = new \PDO ( $this->getDSN ( $serverName, $port, $dbName, $dbType ), $user, $password, $options );
86 75
	}
87
88 75
	public function getDSN(string $serverName, string $port, string $dbName, string $dbType = 'mysql') {
89 75
		$charsetString = [ 'mysql' => 'charset=UTF8','pgsql' => 'options=\'--client_encoding=UTF8\'','sqlite' => '' ] [$dbType] ?? 'charset=UTF8';
90 75
		if ($dbType === 'sqlite') {
91
			return "sqlite:{$dbName}";
92
		}
93 75
		return $dbType . ":dbname={$dbName};host={$serverName};{$charsetString};port=" . $port;
94
	}
95
96
	public function bindValueFromStatement($statement, $parameter, $value) {
97
		return $statement->bindValue ( ":" . $parameter, $value );
98
	}
99
100
	public function query(string $sql) {
101
		return $this->dbInstance->query ( $sql );
102
	}
103
104
	public function queryAll(string $sql, int $fetchStyle = null) {
105
		return $this->dbInstance->query ( $sql )->fetchAll ( $fetchStyle );
106
	}
107
108 7
	public function queryColumn(string $sql, int $columnNumber = null) {
109 7
		return $this->dbInstance->query ( $sql )->fetchColumn ( $columnNumber );
110
	}
111
112
	public function executeStatement($statement, array $values = null) {
113
		return $statement->execute ( $values );
114
	}
115
116 3
	public function getTablesName() {
117 3
		$query = $this->dbInstance->query ( 'SHOW TABLES' );
118 3
		return $query->fetchAll ( \PDO::FETCH_COLUMN );
119
	}
120
121
	public function statementRowCount($statement) {
122
		return $statement->rowCount ();
123
	}
124
125
	public function inTransaction() {
126
		return $this->dbInstance->inTransaction ();
127
	}
128
129 4
	public function commit() {
130 4
		return $this->dbInstance->commit ();
131
	}
132
133 3
	public function rollBack() {
134 3
		return $this->dbInstance->rollBack ();
135
	}
136
137 8
	public function beginTransaction() {
138 8
		return $this->dbInstance->beginTransaction ();
139
	}
140
141 4
	public function savePoint($level) {
142 4
		$this->dbInstance->exec ( 'SAVEPOINT LEVEL' . $level );
143 4
	}
144
145 2
	public function releasePoint($level) {
146 2
		$this->dbInstance->exec ( 'RELEASE SAVEPOINT LEVEL' . $level );
147 2
	}
148
149 2
	public function rollbackPoint($level) {
150 2
		$this->dbInstance->exec ( 'ROLLBACK TO SAVEPOINT LEVEL' . $level );
151 2
	}
152
153 4
	public function nestable() {
154 4
		return isset ( self::$savepointsDrivers [$this->dbType] );
155
	}
156
157 4
	public function ping() {
158 4
		return ($this->dbInstance != null) && (1 === \intval ( $this->queryColumn ( 'SELECT 1', 0 ) ));
159
	}
160
161 1
	public function getPrimaryKeys($tableName) {
162 1
		$fieldkeys = array ();
163 1
		$recordset = $this->dbInstance->query ( "SHOW KEYS FROM `{$tableName}` WHERE Key_name = 'PRIMARY'" );
164 1
		$keys = $recordset->fetchAll ( \PDO::FETCH_ASSOC );
165 1
		foreach ( $keys as $key ) {
166 1
			$fieldkeys [] = $key ['Column_name'];
167
		}
168 1
		return $fieldkeys;
169
	}
170
171 1
	public function getForeignKeys($tableName, $pkName, $dbName = null) {
172 1
		$recordset = $this->dbInstance->query ( "SELECT *
173
												FROM
174
												 information_schema.KEY_COLUMN_USAGE
175
												WHERE
176 1
												 REFERENCED_TABLE_NAME = '" . $tableName . "'
177 1
												 AND REFERENCED_COLUMN_NAME = '" . $pkName . "'
178 1
												 AND TABLE_SCHEMA = '" . $dbName . "';" );
179 1
		return $recordset->fetchAll ( \PDO::FETCH_ASSOC );
180
	}
181
182 1
	public function getFieldsInfos($tableName) {
183 1
		$fieldsInfos = array ();
184 1
		$recordset = $this->dbInstance->query ( "SHOW COLUMNS FROM `{$tableName}`" );
185 1
		$fields = $recordset->fetchAll ( \PDO::FETCH_ASSOC );
186 1
		foreach ( $fields as $field ) {
187 1
			$fieldsInfos [$field ['Field']] = [ "Type" => $field ['Type'],"Nullable" => $field ["Null"] ];
188
		}
189 1
		return $fieldsInfos;
190
	}
191
192 60
	public function _optPrepareAndExecute($sql, array $values = null) {
193 60
		$statement = $this->_getStatement ( $sql );
194 60
		$result = false;
195 60
		if ($statement->execute ( $values )) {
196 60
			$result = $statement->fetchAll ( \PDO::FETCH_ASSOC );
197
		}
198 60
		$statement->closeCursor ();
199 60
		return $result;
200
	}
201
}
202