Completed
Push — master ( 7f79d0...1c7523 )
by Sergei
25:19 queued 22:43
created

PDOConnection   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Test Coverage

Coverage 93.75%

Importance

Changes 0
Metric Value
wmc 13
eloc 28
dl 0
loc 96
ccs 30
cts 32
cp 0.9375
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A quote() 0 3 1
A prepare() 0 6 2
A __construct() 0 8 2
A getServerVersion() 0 3 1
A exec() 0 6 2
A requiresQueryForServerVersion() 0 3 1
A query() 0 11 2
A lastInsertId() 0 6 2
1
<?php
2
3
namespace Doctrine\DBAL\Driver;
4
5
use Doctrine\DBAL\ParameterType;
6
use PDO;
7
use function assert;
8
use function func_get_args;
9
10
/**
11
 * PDO implementation of the Connection interface.
12
 * Used by all PDO-based drivers.
13
 */
14
class PDOConnection extends PDO implements Connection, ServerInfoAwareConnection
15
{
16
    /**
17
     * @param string       $dsn
18
     * @param string|null  $user
19
     * @param string|null  $password
20
     * @param mixed[]|null $options
21
     *
22
     * @throws PDOException In case of an error.
23
     */
24 1114
    public function __construct($dsn, $user = null, $password = null, ?array $options = null)
25
    {
26
        try {
27 1114
            parent::__construct($dsn, $user, $password, $options);
28 1075
            $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, [PDOStatement::class, []]);
29 1075
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
30 71
        } catch (\PDOException $exception) {
31 71
            throw new PDOException($exception);
32
        }
33 1075
    }
34
35
    /**
36
     * {@inheritdoc}
37
     */
38 3444
    public function exec($statement)
39
    {
40
        try {
41 3444
            return parent::exec($statement);
42 2191
        } catch (\PDOException $exception) {
43 2191
            throw new PDOException($exception);
44
        }
45
    }
46
47
    /**
48
     * {@inheritdoc}
49
     */
50 425
    public function getServerVersion()
51
    {
52 425
        return PDO::getAttribute(PDO::ATTR_SERVER_VERSION);
53
    }
54
55
    /**
56
     * {@inheritdoc}
57
     */
58 2617
    public function prepare($prepareString, $driverOptions = [])
59
    {
60
        try {
61 2617
            return parent::prepare($prepareString, $driverOptions);
0 ignored issues
show
Bug Best Practice introduced by
The expression return parent::prepare($...String, $driverOptions) returns the type PDOStatement|boolean which is incompatible with the return type mandated by Doctrine\DBAL\Driver\Connection::prepare() of Doctrine\DBAL\Driver\Statement.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
62 36
        } catch (\PDOException $exception) {
63 36
            throw new PDOException($exception);
64
        }
65
    }
66
67
    /**
68
     * {@inheritdoc}
69
     */
70 3602
    public function query()
71
    {
72 3602
        $args = func_get_args();
73
74
        try {
75 3602
            $stmt = parent::query(...$args);
0 ignored issues
show
Bug introduced by
$args is expanded, but the parameter $statement of PDO::query() does not expect variable arguments. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

75
            $stmt = parent::query(/** @scrutinizer ignore-type */ ...$args);
Loading history...
76 3483
            assert($stmt instanceof \PDOStatement);
77
78 3483
            return $stmt;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $stmt returns the type PDOStatement which is incompatible with the return type mandated by Doctrine\DBAL\Driver\Connection::query() of Doctrine\DBAL\Driver\Statement.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
79 119
        } catch (\PDOException $exception) {
80 119
            throw new PDOException($exception);
81
        }
82
    }
83
84
    /**
85
     * {@inheritdoc}
86
     */
87 159
    public function quote($input, $type = ParameterType::STRING)
88
    {
89 159
        return parent::quote($input, $type);
90
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95 95
    public function lastInsertId($name = null)
96
    {
97
        try {
98 95
            return parent::lastInsertId($name);
99
        } catch (\PDOException $exception) {
100
            throw new PDOException($exception);
101
        }
102
    }
103
104
    /**
105
     * {@inheritdoc}
106
     */
107 442
    public function requiresQueryForServerVersion()
108
    {
109 442
        return false;
110
    }
111
}
112