Failed Conditions
Pull Request — master (#3429)
by Gabriel
12:54
created

PDOConnection::prepare()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 6
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
crap 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 1083
    public function __construct($dsn, $user = null, $password = null, ?array $options = null)
25
    {
26
        try {
27 1083
            parent::__construct($dsn, (string) $user, (string) $password, (array) $options);
28 1041
            $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, [PDOStatement::class, []]);
29 1041
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
30 69
        } catch (\PDOException $exception) {
31 69
            throw new PDOException($exception);
32
        }
33 1041
    }
34
35
    /**
36
     * {@inheritdoc}
37
     */
38 3002
    public function exec($statement)
39
    {
40
        try {
41 3002
            return parent::exec($statement);
42 1816
        } catch (\PDOException $exception) {
43 1816
            throw new PDOException($exception);
44
        }
45
    }
46
47
    /**
48
     * {@inheritdoc}
49
     */
50 360
    public function getServerVersion()
51
    {
52 360
        return PDO::getAttribute(PDO::ATTR_SERVER_VERSION);
53
    }
54
55
    /**
56
     * {@inheritdoc}
57
     */
58 2388
    public function prepare($prepareString, $driverOptions = [])
59
    {
60
        try {
61 2388
            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 44
        } catch (\PDOException $exception) {
63 44
            throw new PDOException($exception);
64
        }
65
    }
66
67
    /**
68
     * {@inheritdoc}
69
     */
70 3160
    public function query()
71
    {
72 3160
        $args = func_get_args();
73 1489
74
        try {
75 1671
            $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 3098
            assert($stmt instanceof \PDOStatement);
77
78 1609
            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 62
        } catch (\PDOException $exception) {
80 1551
            throw new PDOException($exception);
81
        }
82
    }
83
84 1489
    /**
85
     * {@inheritdoc}
86
     */
87 95
    public function quote($input, $type = ParameterType::STRING)
88 1489
    {
89 149
        return parent::quote($input, $type);
90 54
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95 14
    public function lastInsertId($name = null)
96
    {
97 87
        try {
98 14
            if ($name === null) {
99 101
                return parent::lastInsertId();
100
            }
101
102
            return parent::lastInsertId($name);
103
        } catch (\PDOException $exception) {
104
            throw new PDOException($exception);
105 14
        }
106
    }
107
108 14
    /**
109
     * {@inheritdoc}
110
     */
111 188
    public function requiresQueryForServerVersion()
112
    {
113 188
        return false;
114
    }
115
}
116