-
Notifications
You must be signed in to change notification settings - Fork 3.4k
/
Driver.php
354 lines (320 loc) · 9.36 KB
/
Driver.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Database;
use InvalidArgumentException;
use PDO;
/**
* Represents a database diver containing all specificities for
* a database engine including its SQL dialect
*
*/
abstract class Driver
{
/**
* Configuration data.
*
* @var array
*/
protected $_config;
/**
* Base configuration that is merged into the user
* supplied configuration data.
*
* @var array
*/
protected $_baseConfig = [];
/**
* Indicates whether or not the driver is doing automatic identifier quoting
* for all queries
*
* @var bool
*/
protected $_autoQuoting = false;
/**
* Constructor
*
* @param array $config The configuration for the driver.
* @throws InvalidArgumentException
*/
public function __construct($config = [])
{
if (empty($config['username']) && !empty($config['login'])) {
throw new InvalidArgumentException(
'Please pass "username" instead of "login" for connecting to the database'
);
}
$config += $this->_baseConfig;
$this->_config = $config;
if (!empty($config['quoteIdentifiers'])) {
$this->autoQuoting(true);
}
}
/**
* Establishes a connection to the database server
*
* @return bool true con success
*/
abstract public function connect();
/**
* Disconnects from database server
*
* @return void
*/
abstract public function disconnect();
/**
* Returns correct connection resource or object that is internally used
* If first argument is passed,
*
* @param null|\PDO $connection The connection object
* @return void
*/
abstract public function connection($connection = null);
/**
* Returns whether php is able to use this driver for connecting to database
*
* @return bool true if it is valid to use this driver
*/
abstract public function enabled();
/**
* Prepares a sql statement to be executed
*
* @param string|\Cake\Database\Query $query The query to convert into a statement.
* @return \Cake\Database\StatementInterface
*/
abstract public function prepare($query);
/**
* Starts a transaction
*
* @return bool true on success, false otherwise
*/
abstract public function beginTransaction();
/**
* Commits a transaction
*
* @return bool true on success, false otherwise
*/
abstract public function commitTransaction();
/**
* Rollsback a transaction
*
* @return bool true on success, false otherwise
*/
abstract public function rollbackTransaction();
/**
* Get the SQL for releasing a save point.
*
* @param string $name The table name
* @return string
*/
abstract public function releaseSavePointSQL($name);
/**
* Get the SQL for creating a save point.
*
* @param string $name The table name
* @return string
*/
abstract public function savePointSQL($name);
/**
* Get the SQL for rollingback a save point.
*
* @param string $name The table name
* @return string
*/
abstract public function rollbackSavePointSQL($name);
/**
* Get the SQL for disabling foreign keys
*
* @return string
*/
abstract public function disableForeignKeySQL();
/**
* Get the SQL for enabling foreign keys
*
* @return string
*/
abstract public function enableForeignKeySQL();
/**
* Returns whether the driver supports adding or dropping constraints
* to already created tables.
*
* @return bool true if driver supports dynamic constraints
*/
abstract public function supportsDynamicConstraints();
/**
* Returns whether this driver supports save points for nested transactions
*
* @return bool true if save points are supported, false otherwise
*/
public function supportsSavePoints()
{
return true;
}
/**
* Returns a value in a safe representation to be used in a query string
*
* @param mixed $value The value to quote.
* @param string $type Type to be used for determining kind of quoting to perform
* @return string
*/
abstract public function quote($value, $type);
/**
* Checks if the driver supports quoting
*
* @return bool
*/
public function supportsQuoting()
{
return true;
}
/**
* Returns a callable function that will be used to transform a passed Query object.
* This function, in turn, will return an instance of a Query object that has been
* transformed to accommodate any specificities of the SQL dialect in use.
*
* @param string $type the type of query to be transformed
* (select, insert, update, delete)
* @return callable
*/
abstract public function queryTranslator($type);
/**
* Get the schema dialect.
*
* Used by Cake\Database\Schema package to reflect schema and
* generate schema.
*
* If all the tables that use this Driver specify their
* own schemas, then this may return null.
*
* @return \Cake\Database\Schema\BaseSchema
*/
abstract public function schemaDialect();
/**
* Quotes a database identifier (a column name, table name, etc..) to
* be used safely in queries without the risk of using reserved words
*
* @param string $identifier The identifier expression to quote.
* @return string
*/
abstract public function quoteIdentifier($identifier);
/**
* Escapes values for use in schema definitions.
*
* @param mixed $value The value to escape.
* @return string String for use in schema definitions.
*/
public function schemaValue($value)
{
if ($value === null) {
return 'NULL';
}
if ($value === false) {
return 'FALSE';
}
if ($value === true) {
return 'TRUE';
}
if (is_float($value)) {
return str_replace(',', '.', strval($value));
}
if ((is_int($value) || $value === '0') || (
is_numeric($value) && strpos($value, ',') === false &&
$value[0] !== '0' && strpos($value, 'e') === false)
) {
return $value;
}
return $this->_connection->quote($value, PDO::PARAM_STR);
}
/**
* Returns last id generated for a table or sequence in database
*
* @param string $table table name or sequence to get last insert value from
* @param string $column the name of the column representing the primary key
* @return string|int
*/
public function lastInsertId($table = null, $column = null)
{
return $this->_connection->lastInsertId($table, $column);
}
/**
* Check whether or not the driver is connected.
*
* @return bool
*/
public function isConnected()
{
return $this->_connection !== null;
}
/**
* Returns whether or not this driver should automatically quote identifiers
* in queries
*
* If called with a boolean argument, it will toggle the auto quoting setting
* to the passed value
*
* @param bool $enable whether to enable auto quoting
* @return bool
*/
public function autoQuoting($enable = null)
{
if ($enable === null) {
return $this->_autoQuoting;
}
return $this->_autoQuoting = (bool)$enable;
}
/**
* Transforms the passed query to this Driver's dialect and returns an instance
* of the transformed query and the full compiled SQL string
*
* @param \Cake\Database\Query $query The query to compile.
* @param \Cake\Database\ValueBinder $generator The value binder to use.
* @return array containing 2 entries. The first entity is the transformed query
* and the second one the compiled SQL
*/
public function compileQuery(Query $query, ValueBinder $generator)
{
$processor = $this->newCompiler();
$translator = $this->queryTranslator($query->type());
$query = $translator($query);
return [$query, $processor->compile($query, $generator)];
}
/**
* Returns an instance of a QueryCompiler
*
* @return \Cake\Database\QueryCompiler
*/
public function newCompiler()
{
return new QueryCompiler;
}
/**
* Destructor
*/
public function __destruct()
{
$this->_connection = null;
}
/**
* Returns an array that can be used to describe the internal state of this
* object.
*
* @return array
*/
public function __debugInfo()
{
return [
'connected' => $this->isConnected()
];
}
}