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