blob: a6815740218bd5c4b6f88dddb9994fa6312f21e5 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Andrey Andreev8ae24c52012-01-16 13:05:23 +02002/**
3 * CodeIgniter
4 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02005 * An open source application development framework for PHP
Andrey Andreev8ae24c52012-01-16 13:05:23 +02006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Andrey Andreev8ae24c52012-01-16 13:05:23 +02008 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02009 * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
Andrey Andreev8ae24c52012-01-16 13:05:23 +020010 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020011 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
Andrey Andreev8ae24c52012-01-16 13:05:23 +020017 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020018 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 *
29 * @package CodeIgniter
30 * @author EllisLab Dev Team
darwinel871754a2014-02-11 17:34:57 +010031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
Andrey Andreevfe9309d2015-01-09 17:48:58 +020032 * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020033 * @license http://opensource.org/licenses/MIT MIT License
34 * @link http://codeigniter.com
35 * @since Version 3.0.0
Andrey Andreev8ae24c52012-01-16 13:05:23 +020036 * @filesource
37 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Andrey Andreev8ae24c52012-01-16 13:05:23 +020039
40/**
41 * SQLite3 Database Adapter Class
42 *
43 * Note: _DB is an extender class that the app controller
Jamie Rumbelowffe7a0a2012-04-26 13:48:18 +010044 * creates dynamically based on whether the query builder
Andrey Andreev8ae24c52012-01-16 13:05:23 +020045 * class is being used or not.
46 *
Andrey Andreev17ceeae2012-04-05 15:38:30 +030047 * @package CodeIgniter
Andrey Andreev8ae24c52012-01-16 13:05:23 +020048 * @subpackage Drivers
49 * @category Database
Andrey Andreev17ceeae2012-04-05 15:38:30 +030050 * @author Andrey Andreev
51 * @link http://codeigniter.com/user_guide/database/
Andrey Andreev8ae24c52012-01-16 13:05:23 +020052 */
53class CI_DB_sqlite3_driver extends CI_DB {
54
Andrey Andreeva24e52e2012-11-02 03:54:12 +020055 /**
56 * Database driver
57 *
58 * @var string
59 */
Andrey Andreev8ae24c52012-01-16 13:05:23 +020060 public $dbdriver = 'sqlite3';
61
Andrey Andreeva24e52e2012-11-02 03:54:12 +020062 // --------------------------------------------------------------------
Andrey Andreev8ae24c52012-01-16 13:05:23 +020063
Andrey Andreeva24e52e2012-11-02 03:54:12 +020064 /**
65 * ORDER BY random keyword
66 *
Andrey Andreev98e46cf2012-11-13 03:01:42 +020067 * @var array
Andrey Andreeva24e52e2012-11-02 03:54:12 +020068 */
Andrey Andreev98e46cf2012-11-13 03:01:42 +020069 protected $_random_keyword = array('RANDOM()', 'RANDOM()');
Andrey Andreev8ae24c52012-01-16 13:05:23 +020070
Andrey Andreeva24e52e2012-11-02 03:54:12 +020071 // --------------------------------------------------------------------
72
Andrey Andreev8ae24c52012-01-16 13:05:23 +020073 /**
74 * Non-persistent database connection
75 *
Andrey Andreev2e171022014-02-25 15:21:41 +020076 * @param bool $persistent
77 * @return SQLite3
Andrey Andreev8ae24c52012-01-16 13:05:23 +020078 */
Andrey Andreev2e171022014-02-25 15:21:41 +020079 public function db_connect($persistent = FALSE)
Andrey Andreev8ae24c52012-01-16 13:05:23 +020080 {
Andrey Andreev2e171022014-02-25 15:21:41 +020081 if ($persistent)
82 {
83 log_message('debug', 'SQLite3 doesn\'t support persistent connections');
84 }
85
Andrey Andreev8ae24c52012-01-16 13:05:23 +020086 try
87 {
88 return ( ! $this->password)
89 ? new SQLite3($this->database)
90 : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password);
91 }
92 catch (Exception $e)
93 {
94 return FALSE;
95 }
96 }
97
98 // --------------------------------------------------------------------
99
100 /**
Andrey Andreev80e34f92012-03-03 03:25:23 +0200101 * Database version number
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200102 *
103 * @return string
104 */
Andrey Andreev80e34f92012-03-03 03:25:23 +0200105 public function version()
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200106 {
Andrey Andreev80e34f92012-03-03 03:25:23 +0200107 if (isset($this->data_cache['version']))
108 {
109 return $this->data_cache['version'];
110 }
111
Andrey Andreevfc11dcc2012-06-04 16:39:19 +0300112 $version = SQLite3::version();
Andrey Andreev80e34f92012-03-03 03:25:23 +0200113 return $this->data_cache['version'] = $version['versionString'];
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200114 }
115
116 // --------------------------------------------------------------------
117
118 /**
119 * Execute the query
120 *
Andrey Andreev5fd3ae82012-10-24 14:55:35 +0300121 * @todo Implement use of SQLite3::querySingle(), if needed
122 * @param string $sql
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200123 * @return mixed SQLite3Result object or bool
124 */
125 protected function _execute($sql)
126 {
Andrey Andreeva92c7cd2012-03-02 13:51:22 +0200127 return $this->is_write_type($sql)
128 ? $this->conn_id->exec($sql)
129 : $this->conn_id->query($sql);
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200130 }
131
132 // --------------------------------------------------------------------
133
134 /**
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200135 * Begin Transaction
136 *
Andrey Andreeva24e52e2012-11-02 03:54:12 +0200137 * @param bool $test_mode
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200138 * @return bool
139 */
140 public function trans_begin($test_mode = FALSE)
141 {
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200142 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev72d7a6e2012-01-19 16:02:32 +0200143 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200144 {
145 return TRUE;
146 }
147
148 // Reset the transaction failure flag.
149 // If the $test_mode flag is set to TRUE transactions will be rolled back
150 // even if the queries produce a successful result.
151 $this->_trans_failure = ($test_mode === TRUE);
152
153 return $this->conn_id->exec('BEGIN TRANSACTION');
154 }
155
156 // --------------------------------------------------------------------
157
158 /**
159 * Commit Transaction
160 *
161 * @return bool
162 */
163 public function trans_commit()
164 {
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200165 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev72d7a6e2012-01-19 16:02:32 +0200166 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200167 {
168 return TRUE;
169 }
170
171 return $this->conn_id->exec('END TRANSACTION');
172 }
173
174 // --------------------------------------------------------------------
175
176 /**
177 * Rollback Transaction
178 *
179 * @return bool
180 */
181 public function trans_rollback()
182 {
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200183 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev72d7a6e2012-01-19 16:02:32 +0200184 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200185 {
186 return TRUE;
187 }
188
189 return $this->conn_id->exec('ROLLBACK');
190 }
191
192 // --------------------------------------------------------------------
193
194 /**
Andrey Andreev0b6a4922013-01-10 16:53:44 +0200195 * Platform-dependant string escape
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200196 *
Andrey Andreev0b6a4922013-01-10 16:53:44 +0200197 * @param string
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200198 * @return string
199 */
Andrey Andreev0b6a4922013-01-10 16:53:44 +0200200 protected function _escape_str($str)
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200201 {
Andrey Andreev62fad282014-06-19 15:25:40 +0300202 return $this->conn_id->escapeString($str);
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200203 }
204
205 // --------------------------------------------------------------------
206
207 /**
208 * Affected Rows
209 *
210 * @return int
211 */
212 public function affected_rows()
213 {
214 return $this->conn_id->changes();
215 }
216
217 // --------------------------------------------------------------------
218
219 /**
220 * Insert ID
221 *
222 * @return int
223 */
224 public function insert_id()
225 {
226 return $this->conn_id->lastInsertRowID();
227 }
228
229 // --------------------------------------------------------------------
230
231 /**
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200232 * Show table query
233 *
234 * Generates a platform-specific query string so that the table names can be fetched
235 *
Andrey Andreeva24e52e2012-11-02 03:54:12 +0200236 * @param bool $prefix_limit
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200237 * @return string
238 */
239 protected function _list_tables($prefix_limit = FALSE)
240 {
241 return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\''
242 .(($prefix_limit !== FALSE && $this->dbprefix != '')
243 ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr)
244 : '');
245 }
246
247 // --------------------------------------------------------------------
248
249 /**
250 * Show column query
251 *
252 * Generates a platform-specific query string so that the column names can be fetched
253 *
Andrey Andreeva24e52e2012-11-02 03:54:12 +0200254 * @param string $table
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200255 * @return string
256 */
257 protected function _list_columns($table = '')
258 {
259 // Not supported
260 return FALSE;
261 }
262
263 // --------------------------------------------------------------------
264
265 /**
Andrey Andreev822e74e2012-11-16 02:33:30 +0200266 * Returns an object with field data
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200267 *
Andrey Andreeva24e52e2012-11-02 03:54:12 +0200268 * @param string $table
Andrey Andreev822e74e2012-11-16 02:33:30 +0200269 * @return array
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200270 */
Andrey Andreev822e74e2012-11-16 02:33:30 +0200271 public function field_data($table = '')
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200272 {
Andrey Andreev822e74e2012-11-16 02:33:30 +0200273 if ($table === '')
274 {
275 return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
276 }
277
278 if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE)
279 {
280 return FALSE;
281 }
282
283 $query = $query->result_array();
284 if (empty($query))
285 {
286 return FALSE;
287 }
288
289 $retval = array();
290 for ($i = 0, $c = count($query); $i < $c; $i++)
291 {
292 $retval[$i] = new stdClass();
293 $retval[$i]->name = $query[$i]['name'];
294 $retval[$i]->type = $query[$i]['type'];
295 $retval[$i]->max_length = NULL;
296 $retval[$i]->default = $query[$i]['dflt_value'];
297 $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0;
298 }
299
300 return $retval;
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200301 }
302
303 // --------------------------------------------------------------------
304
305 /**
Andrey Andreevebbfefa2012-10-05 17:46:47 +0300306 * Error
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200307 *
Andrey Andreevebbfefa2012-10-05 17:46:47 +0300308 * Returns an array containing code and message of the last
309 * database error that has occured.
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200310 *
Andrey Andreevebbfefa2012-10-05 17:46:47 +0300311 * @return array
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200312 */
Andrey Andreevebbfefa2012-10-05 17:46:47 +0300313 public function error()
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200314 {
Andrey Andreevebbfefa2012-10-05 17:46:47 +0300315 return array('code' => $this->conn_id->lastErrorCode(), 'message' => $this->conn_id->lastErrorMsg());
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200316 }
317
318 // --------------------------------------------------------------------
319
320 /**
Andrey Andreev17ceeae2012-04-05 15:38:30 +0300321 * Replace statement
322 *
323 * Generates a platform-specific replace string from the supplied data
324 *
Andrey Andreeva24e52e2012-11-02 03:54:12 +0200325 * @param string $table Table name
326 * @param array $keys INSERT keys
327 * @param array $values INSERT values
Andrey Andreev17ceeae2012-04-05 15:38:30 +0300328 * @return string
329 */
330 protected function _replace($table, $keys, $values)
331 {
332 return 'INSERT OR '.parent::_replace($table, $keys, $values);
333 }
334
335 // --------------------------------------------------------------------
336
337 /**
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200338 * Truncate statement
339 *
340 * Generates a platform-specific truncate string from the supplied data
Andrey Andreeva6fe36e2012-04-05 16:00:32 +0300341 *
Andrey Andreeva24e52e2012-11-02 03:54:12 +0200342 * If the database does not support the TRUNCATE statement,
Andrey Andreeva6fe36e2012-04-05 16:00:32 +0300343 * then this method maps to 'DELETE FROM table'
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200344 *
Andrey Andreeva24e52e2012-11-02 03:54:12 +0200345 * @param string $table
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200346 * @return string
347 */
348 protected function _truncate($table)
349 {
Andrey Andreeva6fe36e2012-04-05 16:00:32 +0300350 return 'DELETE FROM '.$table;
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200351 }
352
353 // --------------------------------------------------------------------
354
355 /**
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200356 * Close DB Connection
357 *
358 * @return void
359 */
Andrey Andreev79922c02012-05-23 12:27:17 +0300360 protected function _close()
Andrey Andreev8ae24c52012-01-16 13:05:23 +0200361 {
362 $this->conn_id->close();
363 }
364
365}
366
367/* End of file sqlite3_driver.php */
Andrey Andreevf944d3b2012-03-20 22:12:55 +0200368/* Location: ./system/database/drivers/sqlite3/sqlite3_driver.php */