blob: 2e61a235dcd9c1411c72fcb10be21f9a9d17cf55 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreev1ff49e02012-01-27 11:30:41 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreev1ff49e02012-01-27 11:30:41 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
18 *
Derek Allard2067d1a2008-11-13 22:59:24 +000019 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
Greg Aker0defe5d2012-01-01 18:46:41 -060021 * @copyright Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Allard2067d1a2008-11-13 22:59:24 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000028
Derek Allard2067d1a2008-11-13 22:59:24 +000029/**
Andrey Andreev1ff49e02012-01-27 11:30:41 +020030 * MySQLi Database Adapter Class
Derek Allard2067d1a2008-11-13 22:59:24 +000031 *
32 * Note: _DB is an extender class that the app controller
Jamie Rumbelow7efad202012-02-19 12:37:00 +000033 * creates dynamically based on whether the query builder
Derek Allard2067d1a2008-11-13 22:59:24 +000034 * class is being used or not.
35 *
36 * @package CodeIgniter
37 * @subpackage Drivers
38 * @category Database
Derek Jonesf4a4bd82011-10-20 12:18:42 -050039 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000040 * @link http://codeigniter.com/user_guide/database/
41 */
42class CI_DB_mysqli_driver extends CI_DB {
43
Andrey Andreev1ff49e02012-01-27 11:30:41 +020044 public $dbdriver = 'mysqli';
Andrey Andreev2f8bf9b2012-10-12 20:37:52 +030045 public $compress = FALSE;
Barry Mienydd671972010-10-04 16:33:58 +020046
Derek Allard2067d1a2008-11-13 22:59:24 +000047 // The character used for escaping
Andrey Andreev1ff49e02012-01-27 11:30:41 +020048 protected $_escape_char = '`';
Derek Allard2067d1a2008-11-13 22:59:24 +000049
Andrey Andreev1ff49e02012-01-27 11:30:41 +020050 protected $_random_keyword = ' RAND()'; // database specific random keyword
Derek Allard2067d1a2008-11-13 22:59:24 +000051
52 /**
53 * Whether to use the MySQL "delete hack" which allows the number
54 * of affected rows to be shown. Uses a preg_replace when enabled,
55 * adding a bit more processing to all queries.
Barry Mienydd671972010-10-04 16:33:58 +020056 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +020057 public $delete_hack = TRUE;
Derek Allard2067d1a2008-11-13 22:59:24 +000058
59 /**
60 * Non-persistent database connection
61 *
Andrey Andreev2f8bf9b2012-10-12 20:37:52 +030062 * @param bool
Andrey Andreev1ff49e02012-01-27 11:30:41 +020063 * @return object
Andrey Andreev2f8bf9b2012-10-12 20:37:52 +030064 * @todo SSL support
Barry Mienydd671972010-10-04 16:33:58 +020065 */
Andrey Andreev2f8bf9b2012-10-12 20:37:52 +030066 public function db_connect($persistent = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +000067 {
Andrey Andreev2f8bf9b2012-10-12 20:37:52 +030068 // Persistent connection support was added in PHP 5.3.0
69 $hostname = ($persistent === TRUE && is_php('5.3'))
70 ? 'p:'.$this->hostname : $this->hostname;
71 $port = empty($this->port) ? NULL : $this->port;
72 $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;
Andrey Andreev37c85d72012-10-13 17:08:45 +030073 $mysqli = mysqli_init();
Michiel Vugteveenc27721f2012-08-20 18:34:24 +020074
Andrey Andreev2f8bf9b2012-10-12 20:37:52 +030075 return @$mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, NULL, $client_flags)
76 ? $mysqli : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +000077 }
78
79 // --------------------------------------------------------------------
80
81 /**
82 * Persistent database connection
83 *
Andrey Andreev1ff49e02012-01-27 11:30:41 +020084 * @return object
Barry Mienydd671972010-10-04 16:33:58 +020085 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +020086 public function db_pconnect()
Derek Allard2067d1a2008-11-13 22:59:24 +000087 {
Andrey Andreev2f8bf9b2012-10-12 20:37:52 +030088 return $this->db_connect(TRUE);
Derek Allard2067d1a2008-11-13 22:59:24 +000089 }
Barry Mienydd671972010-10-04 16:33:58 +020090
Derek Allard2067d1a2008-11-13 22:59:24 +000091 // --------------------------------------------------------------------
92
93 /**
Derek Jones87cbafc2009-02-27 16:29:59 +000094 * Reconnect
95 *
96 * Keep / reestablish the db connection if no queries have been
97 * sent for a length of time exceeding the server's idle timeout
98 *
Derek Jones87cbafc2009-02-27 16:29:59 +000099 * @return void
100 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200101 public function reconnect()
Derek Jones87cbafc2009-02-27 16:29:59 +0000102 {
Andrey Andreev992f1752012-03-19 16:58:43 +0200103 if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE)
Derek Jones87cbafc2009-02-27 16:29:59 +0000104 {
105 $this->conn_id = FALSE;
106 }
107 }
108
109 // --------------------------------------------------------------------
110
111 /**
Derek Allard2067d1a2008-11-13 22:59:24 +0000112 * Select the database
113 *
Andrey Andreev11454e02012-02-22 16:05:47 +0200114 * @param string database name
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200115 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +0200116 */
Andrey Andreev11454e02012-02-22 16:05:47 +0200117 public function db_select($database = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000118 {
Andrey Andreev024ba2d2012-02-24 11:40:36 +0200119 if ($database === '')
120 {
121 $database = $this->database;
122 }
123
Andrey Andreev992f1752012-03-19 16:58:43 +0200124 if (@$this->conn_id->select_db($database))
Andrey Andreev024ba2d2012-02-24 11:40:36 +0200125 {
126 $this->database = $database;
127 return TRUE;
128 }
129
130 return FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000131 }
132
133 // --------------------------------------------------------------------
134
135 /**
136 * Set client character set
137 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000138 * @param string
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200139 * @return bool
Derek Allard2067d1a2008-11-13 22:59:24 +0000140 */
Andrey Andreev95bd1d12012-03-12 16:22:28 +0200141 protected function _db_set_charset($charset)
Derek Allard2067d1a2008-11-13 22:59:24 +0000142 {
Andrey Andreev992f1752012-03-19 16:58:43 +0200143 return @$this->conn_id->set_charset($charset);
Derek Allard2067d1a2008-11-13 22:59:24 +0000144 }
145
146 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200147
Derek Allard2067d1a2008-11-13 22:59:24 +0000148 /**
Andrey Andreev08856b82012-03-03 03:19:28 +0200149 * Database version number
Derek Allard2067d1a2008-11-13 22:59:24 +0000150 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000151 * @return string
152 */
Andrey Andreev08856b82012-03-03 03:19:28 +0200153 public function version()
Derek Allard2067d1a2008-11-13 22:59:24 +0000154 {
Andrey Andreev08856b82012-03-03 03:19:28 +0200155 return isset($this->data_cache['version'])
156 ? $this->data_cache['version']
Andrey Andreev992f1752012-03-19 16:58:43 +0200157 : $this->data_cache['version'] = $this->conn_id->server_info;
Derek Allard2067d1a2008-11-13 22:59:24 +0000158 }
159
160 // --------------------------------------------------------------------
161
162 /**
163 * Execute the query
164 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000165 * @param string an SQL query
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200166 * @return mixed
Barry Mienydd671972010-10-04 16:33:58 +0200167 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200168 protected function _execute($sql)
Derek Allard2067d1a2008-11-13 22:59:24 +0000169 {
Andrey Andreev992f1752012-03-19 16:58:43 +0200170 return @$this->conn_id->query($this->_prep_query($sql));
Derek Allard2067d1a2008-11-13 22:59:24 +0000171 }
Barry Mienydd671972010-10-04 16:33:58 +0200172
Derek Allard2067d1a2008-11-13 22:59:24 +0000173 // --------------------------------------------------------------------
174
175 /**
176 * Prep the query
177 *
178 * If needed, each database adapter can prep the query string
179 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000180 * @param string an SQL query
181 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200182 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200183 protected function _prep_query($sql)
Derek Allard2067d1a2008-11-13 22:59:24 +0000184 {
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200185 // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack
186 // modifies the query so that it a proper number of affected rows is returned.
187 if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
Derek Allard2067d1a2008-11-13 22:59:24 +0000188 {
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200189 return preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', 'DELETE FROM \\1 WHERE 1=1', $sql);
Derek Allard2067d1a2008-11-13 22:59:24 +0000190 }
Barry Mienydd671972010-10-04 16:33:58 +0200191
Derek Allard2067d1a2008-11-13 22:59:24 +0000192 return $sql;
193 }
194
195 // --------------------------------------------------------------------
196
197 /**
198 * Begin Transaction
199 *
Andrey Andreev5fd3ae82012-10-24 14:55:35 +0300200 * @param bool $test_mode = FALSE
Barry Mienydd671972010-10-04 16:33:58 +0200201 * @return bool
202 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200203 public function trans_begin($test_mode = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000204 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000205 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200206 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000207 {
208 return TRUE;
209 }
210
211 // Reset the transaction failure flag.
212 // If the $test_mode flag is set to TRUE transactions will be rolled back
213 // even if the queries produce a successful result.
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200214 $this->_trans_failure = ($test_mode === TRUE);
Derek Allard2067d1a2008-11-13 22:59:24 +0000215
216 $this->simple_query('SET AUTOCOMMIT=0');
217 $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
218 return TRUE;
219 }
220
221 // --------------------------------------------------------------------
222
223 /**
224 * Commit Transaction
225 *
Barry Mienydd671972010-10-04 16:33:58 +0200226 * @return bool
227 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200228 public function trans_commit()
Derek Allard2067d1a2008-11-13 22:59:24 +0000229 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000230 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200231 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000232 {
233 return TRUE;
234 }
235
236 $this->simple_query('COMMIT');
237 $this->simple_query('SET AUTOCOMMIT=1');
238 return TRUE;
239 }
240
241 // --------------------------------------------------------------------
242
243 /**
244 * Rollback Transaction
245 *
Barry Mienydd671972010-10-04 16:33:58 +0200246 * @return bool
247 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200248 public function trans_rollback()
Derek Allard2067d1a2008-11-13 22:59:24 +0000249 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000250 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200251 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000252 {
253 return TRUE;
254 }
255
256 $this->simple_query('ROLLBACK');
257 $this->simple_query('SET AUTOCOMMIT=1');
258 return TRUE;
259 }
260
261 // --------------------------------------------------------------------
262
263 /**
264 * Escape String
265 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000266 * @param string
Derek Jonese4ed5832009-02-20 21:44:59 +0000267 * @param bool whether or not the string will be used in a LIKE condition
Derek Allard2067d1a2008-11-13 22:59:24 +0000268 * @return string
269 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200270 public function escape_str($str, $like = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000271 {
Derek Jonese4ed5832009-02-20 21:44:59 +0000272 if (is_array($str))
273 {
Pascal Krietec3a4a8d2011-02-14 13:40:08 -0500274 foreach ($str as $key => $val)
Barry Mienydd671972010-10-04 16:33:58 +0200275 {
Derek Jonese4ed5832009-02-20 21:44:59 +0000276 $str[$key] = $this->escape_str($val, $like);
Barry Mienydd671972010-10-04 16:33:58 +0200277 }
278
279 return $str;
280 }
Derek Jonese4ed5832009-02-20 21:44:59 +0000281
Andrey Andreev992f1752012-03-19 16:58:43 +0200282 $str = is_object($this->conn_id) ? $this->conn_id->real_escape_string($str) : addslashes($str);
Barry Mienydd671972010-10-04 16:33:58 +0200283
Derek Jonese4ed5832009-02-20 21:44:59 +0000284 // escape LIKE condition wildcards
285 if ($like === TRUE)
286 {
Andrey Andreev21cb2d32012-05-25 01:01:06 +0300287 return str_replace(array($this->_like_escape_chr, '%', '_'),
288 array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'),
289 $str);
Derek Jonese4ed5832009-02-20 21:44:59 +0000290 }
Barry Mienydd671972010-10-04 16:33:58 +0200291
Derek Jonese4ed5832009-02-20 21:44:59 +0000292 return $str;
Derek Allard2067d1a2008-11-13 22:59:24 +0000293 }
Barry Mienydd671972010-10-04 16:33:58 +0200294
Derek Allard2067d1a2008-11-13 22:59:24 +0000295 // --------------------------------------------------------------------
296
297 /**
298 * Affected Rows
299 *
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200300 * @return int
Derek Allard2067d1a2008-11-13 22:59:24 +0000301 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200302 public function affected_rows()
Derek Allard2067d1a2008-11-13 22:59:24 +0000303 {
Andrey Andreev992f1752012-03-19 16:58:43 +0200304 return $this->conn_id->affected_rows;
Derek Allard2067d1a2008-11-13 22:59:24 +0000305 }
Barry Mienydd671972010-10-04 16:33:58 +0200306
Derek Allard2067d1a2008-11-13 22:59:24 +0000307 // --------------------------------------------------------------------
308
309 /**
310 * Insert ID
311 *
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200312 * @return int
Derek Allard2067d1a2008-11-13 22:59:24 +0000313 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200314 public function insert_id()
Derek Allard2067d1a2008-11-13 22:59:24 +0000315 {
Andrey Andreev992f1752012-03-19 16:58:43 +0200316 return $this->conn_id->insert_id;
Derek Allard2067d1a2008-11-13 22:59:24 +0000317 }
318
319 // --------------------------------------------------------------------
320
321 /**
Derek Allard2067d1a2008-11-13 22:59:24 +0000322 * List table query
323 *
324 * Generates a platform-specific query string so that the table names can be fetched
325 *
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200326 * @param bool
Derek Allard2067d1a2008-11-13 22:59:24 +0000327 * @return string
328 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200329 protected function _list_tables($prefix_limit = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000330 {
Andrey Andreev473130a2012-06-24 02:51:18 +0300331 $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database);
Barry Mienydd671972010-10-04 16:33:58 +0200332
Alex Bilbie48a2baf2012-06-02 11:09:54 +0100333 if ($prefix_limit !== FALSE && $this->dbprefix !== '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000334 {
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200335 return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'";
Derek Allard2067d1a2008-11-13 22:59:24 +0000336 }
Barry Mienydd671972010-10-04 16:33:58 +0200337
Derek Allard2067d1a2008-11-13 22:59:24 +0000338 return $sql;
339 }
340
341 // --------------------------------------------------------------------
342
343 /**
344 * Show column query
345 *
346 * Generates a platform-specific query string so that the column names can be fetched
347 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000348 * @param string the table name
349 * @return string
350 */
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200351 protected function _list_columns($table = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000352 {
Andrey Andreev032e7ea2012-03-06 19:48:35 +0200353 return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);
Derek Allard2067d1a2008-11-13 22:59:24 +0000354 }
355
356 // --------------------------------------------------------------------
357
358 /**
Andrey Andreev3722e502012-03-03 15:04:38 +0200359 * Returns an object with field data
Derek Allard2067d1a2008-11-13 22:59:24 +0000360 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000361 * @param string the table name
Andrey Andreev3722e502012-03-03 15:04:38 +0200362 * @return object
Derek Allard2067d1a2008-11-13 22:59:24 +0000363 */
Andrey Andreev3722e502012-03-03 15:04:38 +0200364 public function field_data($table = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000365 {
Alex Bilbie48a2baf2012-06-02 11:09:54 +0100366 if ($table === '')
Andrey Andreev3722e502012-03-03 15:04:38 +0200367 {
368 return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
369 }
370
Andrey Andreev032e7ea2012-03-06 19:48:35 +0200371 $query = $this->query('DESCRIBE '.$this->protect_identifiers($table, TRUE, NULL, FALSE));
Andrey Andreev3722e502012-03-03 15:04:38 +0200372 $query = $query->result_object();
373
374 $retval = array();
375 for ($i = 0, $c = count($query); $i < $c; $i++)
376 {
377 preg_match('/([a-z]+)(\(\d+\))?/', $query[$i]->Type, $matches);
378
379 $retval[$i] = new stdClass();
380 $retval[$i]->name = $query[$i]->Field;
381 $retval[$i]->type = empty($matches[1]) ? NULL : $matches[1];
382 $retval[$i]->default = $query[$i]->Default;
383 $retval[$i]->max_length = empty($matches[2]) ? NULL : preg_replace('/[^\d]/', '', $matches[2]);
384 $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI');
385 }
386
387 return $retval;
Derek Allard2067d1a2008-11-13 22:59:24 +0000388 }
389
390 // --------------------------------------------------------------------
391
392 /**
Andrey Andreev4be5de12012-03-02 15:45:41 +0200393 * Error
Derek Allard2067d1a2008-11-13 22:59:24 +0000394 *
Andrey Andreev4be5de12012-03-02 15:45:41 +0200395 * Returns an array containing code and message of the last
396 * database error that has occured.
Derek Allard2067d1a2008-11-13 22:59:24 +0000397 *
Andrey Andreev4be5de12012-03-02 15:45:41 +0200398 * @return array
Derek Allard2067d1a2008-11-13 22:59:24 +0000399 */
Andrey Andreev4be5de12012-03-02 15:45:41 +0200400 public function error()
Derek Allard2067d1a2008-11-13 22:59:24 +0000401 {
Andrey Andreevdbad54e2012-10-05 21:53:32 +0300402 if ( ! empty($this->conn_id->connect_errno))
403 {
404 return array(
405 'code' => $this->conn_id->connect_errno,
406 'message' => is_php('5.2.9') ? $this->conn_id->connect_error : mysqli_connect_error()
407 );
408 }
409
Andrey Andreev992f1752012-03-19 16:58:43 +0200410 return array('code' => $this->conn_id->errno, 'message' => $this->conn_id->error);
Derek Allard2067d1a2008-11-13 22:59:24 +0000411 }
Barry Mienydd671972010-10-04 16:33:58 +0200412
Derek Allard2067d1a2008-11-13 22:59:24 +0000413 // --------------------------------------------------------------------
414
415 /**
Pascal Kriete43ded232011-01-07 15:05:40 -0500416 * Update_Batch statement
417 *
418 * Generates a platform-specific batch update string from the supplied data
419 *
Pascal Kriete43ded232011-01-07 15:05:40 -0500420 * @param string the table name
421 * @param array the update data
Andrey Andreevb0478652012-07-18 15:34:46 +0300422 * @param string the where key
Pascal Kriete43ded232011-01-07 15:05:40 -0500423 * @return string
424 */
Andrey Andreevb0478652012-07-18 15:34:46 +0300425 protected function _update_batch($table, $values, $index)
Pascal Kriete43ded232011-01-07 15:05:40 -0500426 {
427 $ids = array();
Pascal Krietec3a4a8d2011-02-14 13:40:08 -0500428 foreach ($values as $key => $val)
Pascal Kriete43ded232011-01-07 15:05:40 -0500429 {
430 $ids[] = $val[$index];
431
Pascal Krietec3a4a8d2011-02-14 13:40:08 -0500432 foreach (array_keys($val) as $field)
Pascal Kriete43ded232011-01-07 15:05:40 -0500433 {
Alex Bilbie48a2baf2012-06-02 11:09:54 +0100434 if ($field !== $index)
Pascal Kriete43ded232011-01-07 15:05:40 -0500435 {
Derek Jones37f4b9c2011-07-01 17:56:50 -0500436 $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
Pascal Kriete43ded232011-01-07 15:05:40 -0500437 }
438 }
439 }
440
Pascal Kriete43ded232011-01-07 15:05:40 -0500441 $cases = '';
Pascal Krietec3a4a8d2011-02-14 13:40:08 -0500442 foreach ($final as $k => $v)
Pascal Kriete43ded232011-01-07 15:05:40 -0500443 {
Andrey Andreev1ff49e02012-01-27 11:30:41 +0200444 $cases .= $k.' = CASE '."\n"
445 .implode("\n", $v)."\n"
446 .'ELSE '.$k.' END, ';
Pascal Kriete43ded232011-01-07 15:05:40 -0500447 }
448
Andrey Andreevb0478652012-07-18 15:34:46 +0300449 $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE);
Pascal Kriete43ded232011-01-07 15:05:40 -0500450
Andrey Andreevd40459d2012-07-18 16:46:39 +0300451 return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
Pascal Kriete43ded232011-01-07 15:05:40 -0500452 }
Barry Mienydd671972010-10-04 16:33:58 +0200453
Derek Allard2067d1a2008-11-13 22:59:24 +0000454 // --------------------------------------------------------------------
455
456 /**
Andrey Andreev7eaa14f2012-10-09 11:34:01 +0300457 * FROM tables
458 *
459 * Groups tables in FROM clauses if needed, so there is no confusion
460 * about operator precedence.
461 *
462 * @return string
463 */
464 protected function _from_tables()
465 {
Andrey Andreevfce9abe2012-10-09 11:37:00 +0300466 if ( ! empty($this->qb_join) && count($this->qb_from) > 1)
Andrey Andreev7eaa14f2012-10-09 11:34:01 +0300467 {
468 return '('.implode(', ', $this->qb_from).')';
469 }
470
471 return implode(', ', $this->qb_from);
472 }
473
474 // --------------------------------------------------------------------
475
476 /**
Derek Allard2067d1a2008-11-13 22:59:24 +0000477 * Close DB Connection
478 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000479 * @return void
480 */
Andrey Andreev79922c02012-05-23 12:27:17 +0300481 protected function _close()
Derek Allard2067d1a2008-11-13 22:59:24 +0000482 {
Andrey Andreev992f1752012-03-19 16:58:43 +0200483 $this->conn_id->close();
Derek Allard2067d1a2008-11-13 22:59:24 +0000484 }
485
Derek Allard2067d1a2008-11-13 22:59:24 +0000486}
487
Derek Allard2067d1a2008-11-13 22:59:24 +0000488/* End of file mysqli_driver.php */
Andrey Andreev79922c02012-05-23 12:27:17 +0300489/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */