Completed
Push — master ( d64c7f...d0ede0 )
by Nicolas
11s
created

src/Gaufrette/Adapter/DoctrineDbal.php (2 issues)

Check that method contracts are obeyed on inherited return types

Bug Compatibility Major

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Gaufrette\Adapter;
4
5
use Gaufrette\Adapter;
6
use Gaufrette\Util;
7
use Doctrine\DBAL\Connection;
8
9
/**
10
 * Doctrine DBAL adapter.
11
 *
12
 * @author Markus Bachmann <[email protected]>
13
 * @author Antoine Hérault <[email protected]>
14
 * @author Leszek Prabucki <[email protected]>
15
 */
16
class DoctrineDbal implements Adapter,
17
                              ChecksumCalculator,
18
                              ListKeysAware
19
{
20
    protected $connection;
21
    protected $table;
22
    protected $columns = array(
23
        'key' => 'key',
24
        'content' => 'content',
25
        'mtime' => 'mtime',
26
        'checksum' => 'checksum',
27
    );
28
29
    /**
30
     * @param Connection $connection The DBAL connection
31
     * @param string     $table      The files table
32
     * @param array      $columns    The column names
33
     */
34
    public function __construct(Connection $connection, $table, array $columns = array())
35
    {
36
        $this->connection = $connection;
37
        $this->table = $table;
38
        $this->columns = array_replace($this->columns, $columns);
39
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44 View Code Duplication
    public function keys()
45
    {
46
        $keys = array();
47
        $stmt = $this->connection->executeQuery(sprintf(
48
            'SELECT %s FROM %s',
49
            $this->getQuotedColumn('key'),
50
            $this->getQuotedTable()
51
        ));
52
53
        return $stmt->fetchAll(\PDO::FETCH_COLUMN);
54
    }
55
56
    /**
57
     * {@inheritdoc}
58
     */
59
    public function rename($sourceKey, $targetKey)
60
    {
61
        return (boolean) $this->connection->update(
62
            $this->table,
63
            array($this->getQuotedColumn('key') => $targetKey),
64
            array($this->getQuotedColumn('key') => $sourceKey)
65
        );
66
    }
67
68
    /**
69
     * {@inheritdoc}
70
     */
71
    public function mtime($key)
72
    {
73
        return $this->getColumnValue($key, 'mtime');
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->getColumnValue($key, 'mtime'); of type string|boolean adds the type string to the return on line 73 which is incompatible with the return type declared by the interface Gaufrette\Adapter::mtime of type integer|boolean.
Loading history...
74
    }
75
76
    /**
77
     * {@inheritdoc}
78
     */
79
    public function checksum($key)
80
    {
81
        return $this->getColumnValue($key, 'checksum');
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->getColumnValue($key, 'checksum'); of type string|boolean adds the type boolean to the return on line 81 which is incompatible with the return type declared by the interface Gaufrette\Adapter\ChecksumCalculator::checksum of type string.
Loading history...
82
    }
83
84
    /**
85
     * {@inheritdoc}
86
     */
87
    public function exists($key)
88
    {
89
        return (boolean) $this->connection->fetchColumn(
90
            sprintf(
91
                'SELECT COUNT(%s) FROM %s WHERE %s = :key',
92
                $this->getQuotedColumn('key'),
93
                $this->getQuotedTable(),
94
                $this->getQuotedColumn('key')
95
            ),
96
            array('key' => $key)
97
        );
98
    }
99
100
    /**
101
     * {@inheritdoc}
102
     */
103
    public function read($key)
104
    {
105
        return $this->getColumnValue($key, 'content');
106
    }
107
108
    /**
109
     * {@inheritdoc}
110
     */
111
    public function delete($key)
112
    {
113
        return (boolean) $this->connection->delete(
114
            $this->table,
115
            array($this->getQuotedColumn('key') => $key)
116
        );
117
    }
118
119
    /**
120
     * {@inheritdoc}
121
     */
122
    public function write($key, $content)
123
    {
124
        $values = array(
125
            $this->getQuotedColumn('content') => $content,
126
            $this->getQuotedColumn('mtime') => time(),
127
            $this->getQuotedColumn('checksum') => Util\Checksum::fromContent($content),
128
        );
129
130
        if ($this->exists($key)) {
131
            $this->connection->update(
132
                $this->table,
133
                $values,
134
                array($this->getQuotedColumn('key') => $key)
135
            );
136
        } else {
137
            $values[$this->getQuotedColumn('key')] = $key;
138
            $this->connection->insert($this->table, $values);
139
        }
140
141
        return Util\Size::fromContent($content);
142
    }
143
144
    /**
145
     * {@inheritdoc}
146
     */
147
    public function isDirectory($key)
148
    {
149
        return false;
150
    }
151
152 View Code Duplication
    private function getColumnValue($key, $column)
153
    {
154
        $value = $this->connection->fetchColumn(
155
            sprintf(
156
                'SELECT %s FROM %s WHERE %s = :key',
157
                $this->getQuotedColumn($column),
158
                $this->getQuotedTable(),
159
                $this->getQuotedColumn('key')
160
            ),
161
            array('key' => $key)
162
        );
163
164
        return $value;
165
    }
166
167
    /**
168
     * {@inheritdoc}
169
     */
170
    public function listKeys($prefix = '')
171
    {
172
        $prefix = trim($prefix);
173
174
        $keys = $this->connection->fetchAll(
175
            sprintf(
176
                'SELECT %s AS _key FROM %s WHERE %s LIKE :pattern',
177
                $this->getQuotedColumn('key'),
178
                $this->getQuotedTable(),
179
                $this->getQuotedColumn('key')
180
            ),
181
            array('pattern' => sprintf('%s%%', $prefix))
182
        );
183
184
        return array(
185
            'dirs' => array(),
186
            'keys' => array_map(function ($value) {
187
                    return $value['_key'];
188
                },
189
                $keys),
190
        );
191
    }
192
193
    private function getQuotedTable()
194
    {
195
        return $this->connection->quoteIdentifier($this->table);
196
    }
197
198
    private function getQuotedColumn($column)
199
    {
200
        return $this->connection->quoteIdentifier($this->columns[$column]);
201
    }
202
}
203