blob: 147e463ce46794d4027184f5a2a4d7669c4e1aa8 [file] [log] [blame]
Andrey Andreev7f55d612012-01-26 13:44:28 +02001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
Esen Sagynov2e087942011-08-09 23:35:01 -07002/**
3 * CodeIgniter
4 *
5 * An open source application development framework for PHP 5.1.6 or newer
6 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreev7f55d612012-01-26 13:44:28 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreev7f55d612012-01-26 13:44:28 +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 *
Esen Sagynov2e087942011-08-09 23:35:01 -070019 * @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)
Esen Sagynov2e087942011-08-09 23:35:01 -070023 * @link http://codeigniter.com
24 * @since Version 2.0.2
25 * @filesource
26 */
27
Esen Sagynov2e087942011-08-09 23:35:01 -070028/**
29 * CUBRID Database Adapter Class
30 *
31 * Note: _DB is an extender class that the app controller
32 * creates dynamically based on whether the active record
33 * class is being used or not.
34 *
35 * @package CodeIgniter
36 * @subpackage Drivers
37 * @category Database
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -070038 * @author Esen Sagynov
Esen Sagynov2e087942011-08-09 23:35:01 -070039 * @link http://codeigniter.com/user_guide/database/
40 */
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -070041class CI_DB_cubrid_driver extends CI_DB {
42
Andrey Andreev7f55d612012-01-26 13:44:28 +020043 public $dbdriver = 'cubrid';
Esen Sagynov2e087942011-08-09 23:35:01 -070044
45 // The character used for escaping - no need in CUBRID
Andrey Andreev7f55d612012-01-26 13:44:28 +020046 protected $_escape_char = '';
Esen Sagynov2e087942011-08-09 23:35:01 -070047
48 // clause and character used for LIKE escape sequences - not used in CUBRID
Andrey Andreev7f55d612012-01-26 13:44:28 +020049 protected $_like_escape_str = '';
50 protected $_like_escape_chr = '';
Esen Sagynov2e087942011-08-09 23:35:01 -070051
52 /**
53 * The syntax to count rows is slightly different across different
54 * database engines, so this string appears in each driver and is
55 * used for the count_all() and count_all_results() functions.
56 */
Andrey Andreev7f55d612012-01-26 13:44:28 +020057 protected $_count_string = 'SELECT COUNT(*) AS ';
58 protected $_random_keyword = ' RAND()'; // database specific random keyword
Esen Sagynov2e087942011-08-09 23:35:01 -070059
Andrey Andreev2e430a32012-02-12 23:37:58 +020060 // CUBRID-specific properties
61 public $auto_commit = TRUE;
62
Andrey Andreevca7e5f12012-01-26 17:58:28 +020063 public function __construct($params)
Esen Sagynov2e087942011-08-09 23:35:01 -070064 {
Andrey Andreevca7e5f12012-01-26 17:58:28 +020065 parent::__construct($params);
66
Andrey Andreev2e430a32012-02-12 23:37:58 +020067 if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:[^:]*:[^:]*:(\?.+)?$/', $this->dsn, $matches))
Esen Sagynov2e087942011-08-09 23:35:01 -070068 {
Andrey Andreevcac407d2012-02-14 11:45:36 +020069 if (stripos($matches[2], 'autocommit=off') !== FALSE)
Andrey Andreev36cd5312012-02-13 01:40:55 +020070 {
71 $this->auto_commit = FALSE;
72 }
Andrey Andreev2e430a32012-02-12 23:37:58 +020073 }
74 else
75 {
76 // If no port is defined by the user, use the default value
77 $this->port == '' OR $this->port = 33000;
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -070078 }
Andrey Andreev7f55d612012-01-26 13:44:28 +020079 }
Esen Sagynov2e087942011-08-09 23:35:01 -070080
Andrey Andreev7f55d612012-01-26 13:44:28 +020081 /**
82 * Non-persistent database connection
83 *
84 * @return resource
85 */
86 public function db_connect()
87 {
Andrey Andreev2e430a32012-02-12 23:37:58 +020088 return $this->_cubrid_connect();
Esen Sagynov2e087942011-08-09 23:35:01 -070089 }
90
91 // --------------------------------------------------------------------
92
93 /**
94 * Persistent database connection
Andrey Andreev2e430a32012-02-12 23:37:58 +020095 *
Esen Sagynov2e087942011-08-09 23:35:01 -070096 * In CUBRID persistent DB connection is supported natively in CUBRID
97 * engine which can be configured in the CUBRID Broker configuration
98 * file by setting the CCI_PCONNECT parameter to ON. In that case, all
99 * connections established between the client application and the
Andrey Andreev2e430a32012-02-12 23:37:58 +0200100 * server will become persistent.
Esen Sagynov2e087942011-08-09 23:35:01 -0700101 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700102 * @return resource
103 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200104 public function db_pconnect()
Esen Sagynov2e087942011-08-09 23:35:01 -0700105 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200106 return $this->_cubrid_connect(TRUE);
107 }
108
109 // --------------------------------------------------------------------
110
111 /**
112 * CUBRID connection
113 *
114 * A CUBRID-specific method to create a connection to the database.
115 * Except for determining if a persistent connection should be used,
116 * the rest of the logic is the same for db_connect() and db_pconnect().
117 *
118 * @param bool
119 * @return resource
120 */
121 protected function _cubrid_connect($persistent = FALSE)
122 {
123 if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\?.+)?$/', $this->dsn, $matches))
124 {
Andrey Andreevfe4b4e92012-02-13 05:40:25 +0200125 $_temp = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url';
Andrey Andreev2e430a32012-02-12 23:37:58 +0200126 $conn_id = ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '')
Andrey Andreevfe4b4e92012-02-13 05:40:25 +0200127 ? $_temp($this->dsn, $this->username, $this->password)
128 : $_temp($this->dsn);
Andrey Andreev2e430a32012-02-12 23:37:58 +0200129 }
130 else
131 {
132 $_temp = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect';
133 $conn_id = ($this->username !== '')
134 ? $_temp($this->hostname, $this->port, $this->database, $this->username, $this->password)
135 : $_temp($this->hostname, $this->port, $this->database);
136 }
137
138 if ($conn_id)
139 {
140 $_temp = ($this->auto_commit) ? CUBRID_AUTOCOMMIT_TRUE : CUBRID_AUTOCOMMIT_FALSE;
141 cubrid_set_autocommit($conn_id, $_temp);
142 }
143
144 return $conn_id;
Esen Sagynov2e087942011-08-09 23:35:01 -0700145 }
146
147 // --------------------------------------------------------------------
148
149 /**
150 * Reconnect
151 *
152 * Keep / reestablish the db connection if no queries have been
153 * sent for a length of time exceeding the server's idle timeout
154 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700155 * @return void
156 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200157 public function reconnect()
Esen Sagynov2e087942011-08-09 23:35:01 -0700158 {
159 if (cubrid_ping($this->conn_id) === FALSE)
160 {
161 $this->conn_id = FALSE;
162 }
163 }
164
165 // --------------------------------------------------------------------
166
167 /**
168 * Select the database
169 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700170 * @return resource
171 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200172 public function db_select()
Esen Sagynov2e087942011-08-09 23:35:01 -0700173 {
174 // In CUBRID there is no need to select a database as the database
175 // is chosen at the connection time.
176 // So, to determine if the database is "selected", all we have to
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700177 // do is ping the server and return that value.
Esen Sagynov2e087942011-08-09 23:35:01 -0700178 return cubrid_ping($this->conn_id);
179 }
180
181 // --------------------------------------------------------------------
182
183 /**
184 * Set client character set
185 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700186 * @param string
187 * @param string
Andrey Andreev7f55d612012-01-26 13:44:28 +0200188 * @return bool
Esen Sagynov2e087942011-08-09 23:35:01 -0700189 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200190 public function db_set_charset($charset, $collation)
Esen Sagynov2e087942011-08-09 23:35:01 -0700191 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200192 // Not supported in CUBRID
Esen Sagynov2e087942011-08-09 23:35:01 -0700193 return TRUE;
194 }
195
196 // --------------------------------------------------------------------
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700197
Esen Sagynov2e087942011-08-09 23:35:01 -0700198 /**
199 * Version number query string
200 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700201 * @return string
202 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200203 protected function _version()
Esen Sagynov2e087942011-08-09 23:35:01 -0700204 {
205 return cubrid_get_server_info($this->conn_id);
206 }
207
208 // --------------------------------------------------------------------
209
210 /**
211 * Execute the query
212 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700213 * @param string an SQL query
214 * @return resource
215 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200216 protected function _execute($sql)
Esen Sagynov2e087942011-08-09 23:35:01 -0700217 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200218 return @cubrid_query($this->_prep_query($sql), $this->conn_id);
Esen Sagynov2e087942011-08-09 23:35:01 -0700219 }
220
221 // --------------------------------------------------------------------
222
223 /**
224 * Prep the query
225 *
226 * If needed, each database adapter can prep the query string
227 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700228 * @param string an SQL query
229 * @return string
230 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200231 protected function _prep_query($sql)
Esen Sagynov2e087942011-08-09 23:35:01 -0700232 {
233 return $sql;
234 }
235
236 // --------------------------------------------------------------------
237
238 /**
239 * Begin Transaction
240 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700241 * @return bool
242 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200243 public function trans_begin($test_mode = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700244 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700245 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev7f55d612012-01-26 13:44:28 +0200246 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Esen Sagynov2e087942011-08-09 23:35:01 -0700247 {
248 return TRUE;
249 }
250
251 // Reset the transaction failure flag.
252 // If the $test_mode flag is set to TRUE transactions will be rolled back
253 // even if the queries produce a successful result.
Andrey Andreev7f55d612012-01-26 13:44:28 +0200254 $this->_trans_failure = ($test_mode === TRUE);
Esen Sagynov2e087942011-08-09 23:35:01 -0700255
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700256 if (cubrid_get_autocommit($this->conn_id))
257 {
258 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE);
259 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700260
261 return TRUE;
262 }
263
264 // --------------------------------------------------------------------
265
266 /**
267 * Commit Transaction
268 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700269 * @return bool
270 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200271 public function trans_commit()
Esen Sagynov2e087942011-08-09 23:35:01 -0700272 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700273 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev7f55d612012-01-26 13:44:28 +0200274 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Esen Sagynov2e087942011-08-09 23:35:01 -0700275 {
276 return TRUE;
277 }
278
279 cubrid_commit($this->conn_id);
280
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700281 if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
282 {
283 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
284 }
285
Esen Sagynov2e087942011-08-09 23:35:01 -0700286 return TRUE;
287 }
288
289 // --------------------------------------------------------------------
290
291 /**
292 * Rollback Transaction
293 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700294 * @return bool
295 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200296 public function trans_rollback()
Esen Sagynov2e087942011-08-09 23:35:01 -0700297 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700298 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev7f55d612012-01-26 13:44:28 +0200299 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Esen Sagynov2e087942011-08-09 23:35:01 -0700300 {
301 return TRUE;
302 }
303
304 cubrid_rollback($this->conn_id);
305
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700306 if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
307 {
308 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
309 }
310
Esen Sagynov2e087942011-08-09 23:35:01 -0700311 return TRUE;
312 }
313
314 // --------------------------------------------------------------------
315
316 /**
317 * Escape String
318 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700319 * @param string
320 * @param bool whether or not the string will be used in a LIKE condition
321 * @return string
322 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200323 public function escape_str($str, $like = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700324 {
325 if (is_array($str))
326 {
327 foreach ($str as $key => $val)
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700328 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700329 $str[$key] = $this->escape_str($val, $like);
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700330 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700331
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700332 return $str;
333 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700334
Andrey Andreev7f55d612012-01-26 13:44:28 +0200335 if (function_exists('cubrid_real_escape_string') && is_resource($this->conn_id))
Esen Sagynov2e087942011-08-09 23:35:01 -0700336 {
337 $str = cubrid_real_escape_string($str, $this->conn_id);
338 }
339 else
340 {
341 $str = addslashes($str);
342 }
343
344 // escape LIKE condition wildcards
345 if ($like === TRUE)
346 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200347 return str_replace(array('%', '_'), array('\\%', '\\_'), $str);
Esen Sagynov2e087942011-08-09 23:35:01 -0700348 }
349
350 return $str;
351 }
352
353 // --------------------------------------------------------------------
354
355 /**
356 * Affected Rows
357 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200358 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700359 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200360 public function affected_rows()
Esen Sagynov2e087942011-08-09 23:35:01 -0700361 {
362 return @cubrid_affected_rows($this->conn_id);
363 }
364
365 // --------------------------------------------------------------------
366
367 /**
368 * Insert ID
369 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200370 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700371 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200372 public function insert_id()
Esen Sagynov2e087942011-08-09 23:35:01 -0700373 {
374 return @cubrid_insert_id($this->conn_id);
375 }
376
377 // --------------------------------------------------------------------
378
379 /**
380 * "Count All" query
381 *
382 * Generates a platform-specific query string that counts all records in
383 * the specified table
384 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700385 * @param string
Andrey Andreev7f55d612012-01-26 13:44:28 +0200386 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700387 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200388 public function count_all($table = '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700389 {
390 if ($table == '')
391 {
392 return 0;
393 }
Andrey Andreev7f55d612012-01-26 13:44:28 +0200394 $query = $this->query($this->_count_string.$this->_protect_identifiers('numrows').' FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE));
Esen Sagynov2e087942011-08-09 23:35:01 -0700395 if ($query->num_rows() == 0)
396 {
397 return 0;
398 }
399
Andrey Andreev7f55d612012-01-26 13:44:28 +0200400 $query = $query->row();
Greg Aker90248ab2011-08-20 14:23:14 -0500401 $this->_reset_select();
Andrey Andreev7f55d612012-01-26 13:44:28 +0200402 return (int) $query->numrows;
Esen Sagynov2e087942011-08-09 23:35:01 -0700403 }
404
405 // --------------------------------------------------------------------
406
407 /**
408 * List table query
409 *
410 * Generates a platform-specific query string so that the table names can be fetched
411 *
Andrey Andreev2e430a32012-02-12 23:37:58 +0200412 * @param bool
Esen Sagynov2e087942011-08-09 23:35:01 -0700413 * @return string
414 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200415 protected function _list_tables($prefix_limit = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700416 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200417 $sql = 'SHOW TABLES';
Esen Sagynov2e087942011-08-09 23:35:01 -0700418
Andrey Andreev7f55d612012-01-26 13:44:28 +0200419 if ($prefix_limit !== FALSE && $this->dbprefix != '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700420 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200421 return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'";
Esen Sagynov2e087942011-08-09 23:35:01 -0700422 }
423
424 return $sql;
425 }
426
427 // --------------------------------------------------------------------
428
429 /**
430 * Show column query
431 *
432 * Generates a platform-specific query string so that the column names can be fetched
433 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700434 * @param string the table name
435 * @return string
436 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200437 protected function _list_columns($table = '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700438 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200439 return 'SHOW COLUMNS FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE);
Esen Sagynov2e087942011-08-09 23:35:01 -0700440 }
441
442 // --------------------------------------------------------------------
443
444 /**
445 * Field data query
446 *
447 * Generates a platform-specific query so that the column data can be retrieved
448 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700449 * @param string the table name
Andrey Andreev7f55d612012-01-26 13:44:28 +0200450 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700451 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200452 protected function _field_data($table)
Esen Sagynov2e087942011-08-09 23:35:01 -0700453 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200454 return 'SELECT * FROM '.$table.' LIMIT 1';
Esen Sagynov2e087942011-08-09 23:35:01 -0700455 }
456
457 // --------------------------------------------------------------------
458
459 /**
460 * The error message string
461 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700462 * @return string
463 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200464 protected function _error_message()
Esen Sagynov2e087942011-08-09 23:35:01 -0700465 {
466 return cubrid_error($this->conn_id);
467 }
468
469 // --------------------------------------------------------------------
470
471 /**
472 * The error message number
473 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200474 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700475 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200476 protected function _error_number()
Esen Sagynov2e087942011-08-09 23:35:01 -0700477 {
478 return cubrid_errno($this->conn_id);
479 }
480
481 // --------------------------------------------------------------------
482
483 /**
484 * Escape the SQL Identifiers
485 *
486 * This function escapes column and table names
487 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700488 * @param string
489 * @return string
490 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200491 public function _escape_identifiers($item)
Esen Sagynov2e087942011-08-09 23:35:01 -0700492 {
493 if ($this->_escape_char == '')
494 {
495 return $item;
496 }
497
498 foreach ($this->_reserved_identifiers as $id)
499 {
500 if (strpos($item, '.'.$id) !== FALSE)
501 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200502 $item = str_replace('.', $this->_escape_char.'.', $item);
Esen Sagynov2e087942011-08-09 23:35:01 -0700503
504 // remove duplicates if the user already included the escape
Andrey Andreev7f55d612012-01-26 13:44:28 +0200505 return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
Esen Sagynov2e087942011-08-09 23:35:01 -0700506 }
507 }
508
509 if (strpos($item, '.') !== FALSE)
510 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200511 $item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
Esen Sagynov2e087942011-08-09 23:35:01 -0700512 }
513
514 // remove duplicates if the user already included the escape
Andrey Andreev7f55d612012-01-26 13:44:28 +0200515 return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
Esen Sagynov2e087942011-08-09 23:35:01 -0700516 }
517
518 // --------------------------------------------------------------------
519
520 /**
521 * From Tables
522 *
523 * This function implicitly groups FROM tables so there is no confusion
524 * about operator precedence in harmony with SQL standards
525 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200526 * @param string the table name
527 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700528 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200529 protected function _from_tables($tables)
Esen Sagynov2e087942011-08-09 23:35:01 -0700530 {
531 if ( ! is_array($tables))
532 {
533 $tables = array($tables);
534 }
535
536 return '('.implode(', ', $tables).')';
537 }
538
539 // --------------------------------------------------------------------
540
541 /**
542 * Insert statement
543 *
544 * Generates a platform-specific insert string from the supplied data
545 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700546 * @param string the table name
547 * @param array the insert keys
548 * @param array the insert values
549 * @return string
550 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200551 protected function _insert($table, $keys, $values)
Esen Sagynov2e087942011-08-09 23:35:01 -0700552 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200553 return 'INSERT INTO '.$table.' ("'.implode('", "', $keys).'") VALUES ('.implode(', ', $values).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700554 }
555
556 // --------------------------------------------------------------------
557
558
559 /**
560 * Replace statement
561 *
562 * Generates a platform-specific replace string from the supplied data
563 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700564 * @param string the table name
565 * @param array the insert keys
566 * @param array the insert values
567 * @return string
568 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200569 protected function _replace($table, $keys, $values)
Esen Sagynov2e087942011-08-09 23:35:01 -0700570 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200571 return 'REPLACE INTO '.$table.' ("'.implode('", "', $keys).'") VALUES ('.implode(', ', $values).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700572 }
573
574 // --------------------------------------------------------------------
575
576 /**
577 * Insert_batch statement
578 *
579 * Generates a platform-specific insert string from the supplied data
580 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700581 * @param string the table name
582 * @param array the insert keys
583 * @param array the insert values
584 * @return string
585 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200586 protected function _insert_batch($table, $keys, $values)
Esen Sagynov2e087942011-08-09 23:35:01 -0700587 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200588 return 'INSERT INTO '.$table.' ("'.implode('", "', $keys).'") VALUES '.implode(', ', $values);
Esen Sagynov2e087942011-08-09 23:35:01 -0700589 }
590
591 // --------------------------------------------------------------------
592
Esen Sagynov2e087942011-08-09 23:35:01 -0700593 /**
594 * Update statement
595 *
596 * Generates a platform-specific update string from the supplied data
597 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700598 * @param string the table name
599 * @param array the update data
600 * @param array the where clause
601 * @param array the orderby clause
602 * @param array the limit clause
603 * @return string
604 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200605 protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700606 {
607 foreach ($values as $key => $val)
608 {
Esen Sagynovee3e5942011-08-10 03:22:58 -0700609 $valstr[] = sprintf('"%s" = %s', $key, $val);
Esen Sagynov2e087942011-08-09 23:35:01 -0700610 }
611
Andrey Andreev7f55d612012-01-26 13:44:28 +0200612 return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
613 .(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
614 .(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
615 .( ! $limit ? '' : ' LIMIT '.$limit);
Esen Sagynov2e087942011-08-09 23:35:01 -0700616 }
617
618 // --------------------------------------------------------------------
619
620
621 /**
622 * Update_Batch statement
623 *
624 * Generates a platform-specific batch update string from the supplied data
625 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700626 * @param string the table name
627 * @param array the update data
628 * @param array the where clause
629 * @return string
630 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200631 protected function _update_batch($table, $values, $index, $where = NULL)
Esen Sagynov2e087942011-08-09 23:35:01 -0700632 {
633 $ids = array();
Esen Sagynov2e087942011-08-09 23:35:01 -0700634 foreach ($values as $key => $val)
635 {
636 $ids[] = $val[$index];
637
638 foreach (array_keys($val) as $field)
639 {
640 if ($field != $index)
641 {
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700642 $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
Esen Sagynov2e087942011-08-09 23:35:01 -0700643 }
644 }
645 }
646
Esen Sagynov2e087942011-08-09 23:35:01 -0700647 $cases = '';
Esen Sagynov2e087942011-08-09 23:35:01 -0700648 foreach ($final as $k => $v)
649 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200650 $cases .= $k." = CASE \n"
651 .implode("\n", $v)
652 .'ELSE '.$k.' END, ';
Esen Sagynov2e087942011-08-09 23:35:01 -0700653 }
654
Andrey Andreev2e430a32012-02-12 23:37:58 +0200655 return 'UPDATE '.$table.' SET '.substr($cases, 0, -2)
Andrey Andreev7f55d612012-01-26 13:44:28 +0200656 .' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '')
657 .$index.' IN ('.implode(',', $ids).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700658 }
659
660 // --------------------------------------------------------------------
661
Esen Sagynov2e087942011-08-09 23:35:01 -0700662 /**
663 * Truncate statement
664 *
665 * Generates a platform-specific truncate string from the supplied data
666 * If the database does not support the truncate() command
667 * This function maps to "DELETE FROM table"
668 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700669 * @param string the table name
670 * @return string
671 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200672 protected function _truncate($table)
Esen Sagynov2e087942011-08-09 23:35:01 -0700673 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200674 return 'TRUNCATE '.$table;
Esen Sagynov2e087942011-08-09 23:35:01 -0700675 }
676
677 // --------------------------------------------------------------------
678
679 /**
680 * Delete statement
681 *
682 * Generates a platform-specific delete string from the supplied data
683 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700684 * @param string the table name
685 * @param array the where clause
686 * @param string the limit clause
687 * @return string
688 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200689 protected function _delete($table, $where = array(), $like = array(), $limit = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700690 {
691 $conditions = '';
692
693 if (count($where) > 0 OR count($like) > 0)
694 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200695 $conditions = "\nWHERE ".implode("\n", $where)
696 .((count($where) > 0 && count($like) > 0) ? ' AND ' : '')
697 .implode("\n", $like);
Esen Sagynov2e087942011-08-09 23:35:01 -0700698 }
699
Andrey Andreev7f55d612012-01-26 13:44:28 +0200700 return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
Esen Sagynov2e087942011-08-09 23:35:01 -0700701 }
702
703 // --------------------------------------------------------------------
704
705 /**
706 * Limit string
707 *
708 * Generates a platform-specific LIMIT clause
709 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700710 * @param string the sql query string
Andrey Andreev7f55d612012-01-26 13:44:28 +0200711 * @param int the number of rows to limit the query to
712 * @param int the offset value
Esen Sagynov2e087942011-08-09 23:35:01 -0700713 * @return string
714 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200715 protected function _limit($sql, $limit, $offset)
Esen Sagynov2e087942011-08-09 23:35:01 -0700716 {
Andrey Andreevc6953f42012-01-26 14:43:16 +0200717 return $sql.'LIMIT '.($offset == 0 ? '' : $offset.', ').$limit;
Esen Sagynov2e087942011-08-09 23:35:01 -0700718 }
719
720 // --------------------------------------------------------------------
721
722 /**
723 * Close DB Connection
724 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700725 * @param resource
726 * @return void
727 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200728 protected function _close($conn_id)
Esen Sagynov2e087942011-08-09 23:35:01 -0700729 {
730 @cubrid_close($conn_id);
731 }
732
733}
734
Esen Sagynov2e087942011-08-09 23:35:01 -0700735/* End of file cubrid_driver.php */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200736/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */