1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15: namespace Cake\Database\Driver;
16:
17: use Cake\Database\Dialect\SqliteDialectTrait;
18: use Cake\Database\Driver;
19: use Cake\Database\Query;
20: use Cake\Database\Statement\PDOStatement;
21: use Cake\Database\Statement\SqliteStatement;
22: use PDO;
23:
24: 25: 26:
27: class Sqlite extends Driver
28: {
29:
30: use SqliteDialectTrait;
31:
32: 33: 34: 35: 36: 37: 38:
39: protected $_baseConfig = [
40: 'persistent' => false,
41: 'username' => null,
42: 'password' => null,
43: 'database' => ':memory:',
44: 'encoding' => 'utf8',
45: 'mask' => 0644,
46: 'flags' => [],
47: 'init' => [],
48: ];
49:
50: 51: 52: 53: 54:
55: public function connect()
56: {
57: if ($this->_connection) {
58: return true;
59: }
60: $config = $this->_config;
61: $config['flags'] += [
62: PDO::ATTR_PERSISTENT => $config['persistent'],
63: PDO::ATTR_EMULATE_PREPARES => false,
64: PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
65: ];
66:
67: $databaseExists = file_exists($config['database']);
68:
69: $dsn = "sqlite:{$config['database']}";
70: $this->_connect($dsn, $config);
71:
72: if (!$databaseExists && $config['database'] != ':memory:') {
73:
74: @chmod($config['database'], $config['mask']);
75:
76: }
77:
78: if (!empty($config['init'])) {
79: foreach ((array)$config['init'] as $command) {
80: $this->getConnection()->exec($command);
81: }
82: }
83:
84: return true;
85: }
86:
87: 88: 89: 90: 91:
92: public function enabled()
93: {
94: return in_array('sqlite', PDO::getAvailableDrivers());
95: }
96:
97: 98: 99: 100: 101: 102:
103: public function prepare($query)
104: {
105: $this->connect();
106: $isObject = $query instanceof Query;
107: $statement = $this->_connection->prepare($isObject ? $query->sql() : $query);
108: $result = new SqliteStatement(new PDOStatement($statement, $this), $this);
109: if ($isObject && $query->isBufferedResultsEnabled() === false) {
110: $result->bufferResults(false);
111: }
112:
113: return $result;
114: }
115:
116: 117: 118:
119: public function supportsDynamicConstraints()
120: {
121: return false;
122: }
123: }
124: