blob: a0d874a8cfbd46718b4aaf84be7f5dbe465825a5 [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 Andreev36cd5312012-02-13 01:40:55 +020069 if (preg_match('/autocommit=off/', $matches[2], $matches))
70 {
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 {
125 $conn_id = ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '')
126 ? cubrid_connect_with_url($this->dsn, $this->username, $this->password)
127 : cubrid_connect_with_url($this->dsn);
128 }
129 else
130 {
131 $_temp = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect';
132 $conn_id = ($this->username !== '')
133 ? $_temp($this->hostname, $this->port, $this->database, $this->username, $this->password)
134 : $_temp($this->hostname, $this->port, $this->database);
135 }
136
137 if ($conn_id)
138 {
139 $_temp = ($this->auto_commit) ? CUBRID_AUTOCOMMIT_TRUE : CUBRID_AUTOCOMMIT_FALSE;
140 cubrid_set_autocommit($conn_id, $_temp);
141 }
142
143 return $conn_id;
Esen Sagynov2e087942011-08-09 23:35:01 -0700144 }
145
146 // --------------------------------------------------------------------
147
148 /**
149 * Reconnect
150 *
151 * Keep / reestablish the db connection if no queries have been
152 * sent for a length of time exceeding the server's idle timeout
153 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700154 * @return void
155 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200156 public function reconnect()
Esen Sagynov2e087942011-08-09 23:35:01 -0700157 {
158 if (cubrid_ping($this->conn_id) === FALSE)
159 {
160 $this->conn_id = FALSE;
161 }
162 }
163
164 // --------------------------------------------------------------------
165
166 /**
167 * Select the database
168 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700169 * @return resource
170 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200171 public function db_select()
Esen Sagynov2e087942011-08-09 23:35:01 -0700172 {
173 // In CUBRID there is no need to select a database as the database
174 // is chosen at the connection time.
175 // So, to determine if the database is "selected", all we have to
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700176 // do is ping the server and return that value.
Esen Sagynov2e087942011-08-09 23:35:01 -0700177 return cubrid_ping($this->conn_id);
178 }
179
180 // --------------------------------------------------------------------
181
182 /**
183 * Set client character set
184 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700185 * @param string
186 * @param string
Andrey Andreev7f55d612012-01-26 13:44:28 +0200187 * @return bool
Esen Sagynov2e087942011-08-09 23:35:01 -0700188 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200189 public function db_set_charset($charset, $collation)
Esen Sagynov2e087942011-08-09 23:35:01 -0700190 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200191 // Not supported in CUBRID
Esen Sagynov2e087942011-08-09 23:35:01 -0700192 return TRUE;
193 }
194
195 // --------------------------------------------------------------------
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700196
Esen Sagynov2e087942011-08-09 23:35:01 -0700197 /**
198 * Version number query string
199 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700200 * @return string
201 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200202 protected function _version()
Esen Sagynov2e087942011-08-09 23:35:01 -0700203 {
204 return cubrid_get_server_info($this->conn_id);
205 }
206
207 // --------------------------------------------------------------------
208
209 /**
210 * Execute the query
211 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700212 * @param string an SQL query
213 * @return resource
214 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200215 protected function _execute($sql)
Esen Sagynov2e087942011-08-09 23:35:01 -0700216 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200217 return @cubrid_query($this->_prep_query($sql), $this->conn_id);
Esen Sagynov2e087942011-08-09 23:35:01 -0700218 }
219
220 // --------------------------------------------------------------------
221
222 /**
223 * Prep the query
224 *
225 * If needed, each database adapter can prep the query string
226 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700227 * @param string an SQL query
228 * @return string
229 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200230 protected function _prep_query($sql)
Esen Sagynov2e087942011-08-09 23:35:01 -0700231 {
232 return $sql;
233 }
234
235 // --------------------------------------------------------------------
236
237 /**
238 * Begin Transaction
239 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700240 * @return bool
241 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200242 public function trans_begin($test_mode = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700243 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700244 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev7f55d612012-01-26 13:44:28 +0200245 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Esen Sagynov2e087942011-08-09 23:35:01 -0700246 {
247 return TRUE;
248 }
249
250 // Reset the transaction failure flag.
251 // If the $test_mode flag is set to TRUE transactions will be rolled back
252 // even if the queries produce a successful result.
Andrey Andreev7f55d612012-01-26 13:44:28 +0200253 $this->_trans_failure = ($test_mode === TRUE);
Esen Sagynov2e087942011-08-09 23:35:01 -0700254
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700255 if (cubrid_get_autocommit($this->conn_id))
256 {
257 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE);
258 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700259
260 return TRUE;
261 }
262
263 // --------------------------------------------------------------------
264
265 /**
266 * Commit Transaction
267 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700268 * @return bool
269 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200270 public function trans_commit()
Esen Sagynov2e087942011-08-09 23:35:01 -0700271 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700272 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev7f55d612012-01-26 13:44:28 +0200273 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Esen Sagynov2e087942011-08-09 23:35:01 -0700274 {
275 return TRUE;
276 }
277
278 cubrid_commit($this->conn_id);
279
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700280 if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
281 {
282 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
283 }
284
Esen Sagynov2e087942011-08-09 23:35:01 -0700285 return TRUE;
286 }
287
288 // --------------------------------------------------------------------
289
290 /**
291 * Rollback Transaction
292 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700293 * @return bool
294 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200295 public function trans_rollback()
Esen Sagynov2e087942011-08-09 23:35:01 -0700296 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700297 // When transactions are nested we only begin/commit/rollback the outermost ones
Andrey Andreev7f55d612012-01-26 13:44:28 +0200298 if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
Esen Sagynov2e087942011-08-09 23:35:01 -0700299 {
300 return TRUE;
301 }
302
303 cubrid_rollback($this->conn_id);
304
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700305 if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
306 {
307 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
308 }
309
Esen Sagynov2e087942011-08-09 23:35:01 -0700310 return TRUE;
311 }
312
313 // --------------------------------------------------------------------
314
315 /**
316 * Escape String
317 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700318 * @param string
319 * @param bool whether or not the string will be used in a LIKE condition
320 * @return string
321 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200322 public function escape_str($str, $like = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700323 {
324 if (is_array($str))
325 {
326 foreach ($str as $key => $val)
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700327 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700328 $str[$key] = $this->escape_str($val, $like);
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700329 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700330
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700331 return $str;
332 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700333
Andrey Andreev7f55d612012-01-26 13:44:28 +0200334 if (function_exists('cubrid_real_escape_string') && is_resource($this->conn_id))
Esen Sagynov2e087942011-08-09 23:35:01 -0700335 {
336 $str = cubrid_real_escape_string($str, $this->conn_id);
337 }
338 else
339 {
340 $str = addslashes($str);
341 }
342
343 // escape LIKE condition wildcards
344 if ($like === TRUE)
345 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200346 return str_replace(array('%', '_'), array('\\%', '\\_'), $str);
Esen Sagynov2e087942011-08-09 23:35:01 -0700347 }
348
349 return $str;
350 }
351
352 // --------------------------------------------------------------------
353
354 /**
355 * Affected Rows
356 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200357 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700358 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200359 public function affected_rows()
Esen Sagynov2e087942011-08-09 23:35:01 -0700360 {
361 return @cubrid_affected_rows($this->conn_id);
362 }
363
364 // --------------------------------------------------------------------
365
366 /**
367 * Insert ID
368 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200369 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700370 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200371 public function insert_id()
Esen Sagynov2e087942011-08-09 23:35:01 -0700372 {
373 return @cubrid_insert_id($this->conn_id);
374 }
375
376 // --------------------------------------------------------------------
377
378 /**
379 * "Count All" query
380 *
381 * Generates a platform-specific query string that counts all records in
382 * the specified table
383 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700384 * @param string
Andrey Andreev7f55d612012-01-26 13:44:28 +0200385 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700386 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200387 public function count_all($table = '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700388 {
389 if ($table == '')
390 {
391 return 0;
392 }
Andrey Andreev7f55d612012-01-26 13:44:28 +0200393 $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 -0700394 if ($query->num_rows() == 0)
395 {
396 return 0;
397 }
398
Andrey Andreev7f55d612012-01-26 13:44:28 +0200399 $query = $query->row();
Greg Aker90248ab2011-08-20 14:23:14 -0500400 $this->_reset_select();
Andrey Andreev7f55d612012-01-26 13:44:28 +0200401 return (int) $query->numrows;
Esen Sagynov2e087942011-08-09 23:35:01 -0700402 }
403
404 // --------------------------------------------------------------------
405
406 /**
407 * List table query
408 *
409 * Generates a platform-specific query string so that the table names can be fetched
410 *
Andrey Andreev2e430a32012-02-12 23:37:58 +0200411 * @param bool
Esen Sagynov2e087942011-08-09 23:35:01 -0700412 * @return string
413 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200414 protected function _list_tables($prefix_limit = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700415 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200416 $sql = 'SHOW TABLES';
Esen Sagynov2e087942011-08-09 23:35:01 -0700417
Andrey Andreev7f55d612012-01-26 13:44:28 +0200418 if ($prefix_limit !== FALSE && $this->dbprefix != '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700419 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200420 return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'";
Esen Sagynov2e087942011-08-09 23:35:01 -0700421 }
422
423 return $sql;
424 }
425
426 // --------------------------------------------------------------------
427
428 /**
429 * Show column query
430 *
431 * Generates a platform-specific query string so that the column names can be fetched
432 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700433 * @param string the table name
434 * @return string
435 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200436 protected function _list_columns($table = '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700437 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200438 return 'SHOW COLUMNS FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE);
Esen Sagynov2e087942011-08-09 23:35:01 -0700439 }
440
441 // --------------------------------------------------------------------
442
443 /**
444 * Field data query
445 *
446 * Generates a platform-specific query so that the column data can be retrieved
447 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700448 * @param string the table name
Andrey Andreev7f55d612012-01-26 13:44:28 +0200449 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700450 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200451 protected function _field_data($table)
Esen Sagynov2e087942011-08-09 23:35:01 -0700452 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200453 return 'SELECT * FROM '.$table.' LIMIT 1';
Esen Sagynov2e087942011-08-09 23:35:01 -0700454 }
455
456 // --------------------------------------------------------------------
457
458 /**
459 * The error message string
460 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700461 * @return string
462 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200463 protected function _error_message()
Esen Sagynov2e087942011-08-09 23:35:01 -0700464 {
465 return cubrid_error($this->conn_id);
466 }
467
468 // --------------------------------------------------------------------
469
470 /**
471 * The error message number
472 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200473 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700474 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200475 protected function _error_number()
Esen Sagynov2e087942011-08-09 23:35:01 -0700476 {
477 return cubrid_errno($this->conn_id);
478 }
479
480 // --------------------------------------------------------------------
481
482 /**
483 * Escape the SQL Identifiers
484 *
485 * This function escapes column and table names
486 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700487 * @param string
488 * @return string
489 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200490 public function _escape_identifiers($item)
Esen Sagynov2e087942011-08-09 23:35:01 -0700491 {
492 if ($this->_escape_char == '')
493 {
494 return $item;
495 }
496
497 foreach ($this->_reserved_identifiers as $id)
498 {
499 if (strpos($item, '.'.$id) !== FALSE)
500 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200501 $item = str_replace('.', $this->_escape_char.'.', $item);
Esen Sagynov2e087942011-08-09 23:35:01 -0700502
503 // remove duplicates if the user already included the escape
Andrey Andreev7f55d612012-01-26 13:44:28 +0200504 return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
Esen Sagynov2e087942011-08-09 23:35:01 -0700505 }
506 }
507
508 if (strpos($item, '.') !== FALSE)
509 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200510 $item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
Esen Sagynov2e087942011-08-09 23:35:01 -0700511 }
512
513 // remove duplicates if the user already included the escape
Andrey Andreev7f55d612012-01-26 13:44:28 +0200514 return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
Esen Sagynov2e087942011-08-09 23:35:01 -0700515 }
516
517 // --------------------------------------------------------------------
518
519 /**
520 * From Tables
521 *
522 * This function implicitly groups FROM tables so there is no confusion
523 * about operator precedence in harmony with SQL standards
524 *
Andrey Andreev7f55d612012-01-26 13:44:28 +0200525 * @param string the table name
526 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700527 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200528 protected function _from_tables($tables)
Esen Sagynov2e087942011-08-09 23:35:01 -0700529 {
530 if ( ! is_array($tables))
531 {
532 $tables = array($tables);
533 }
534
535 return '('.implode(', ', $tables).')';
536 }
537
538 // --------------------------------------------------------------------
539
540 /**
541 * Insert statement
542 *
543 * Generates a platform-specific insert string from the supplied data
544 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700545 * @param string the table name
546 * @param array the insert keys
547 * @param array the insert values
548 * @return string
549 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200550 protected function _insert($table, $keys, $values)
Esen Sagynov2e087942011-08-09 23:35:01 -0700551 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200552 return 'INSERT INTO '.$table.' ("'.implode('", "', $keys).'") VALUES ('.implode(', ', $values).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700553 }
554
555 // --------------------------------------------------------------------
556
557
558 /**
559 * Replace statement
560 *
561 * Generates a platform-specific replace string from the supplied data
562 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700563 * @param string the table name
564 * @param array the insert keys
565 * @param array the insert values
566 * @return string
567 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200568 protected function _replace($table, $keys, $values)
Esen Sagynov2e087942011-08-09 23:35:01 -0700569 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200570 return 'REPLACE INTO '.$table.' ("'.implode('", "', $keys).'") VALUES ('.implode(', ', $values).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700571 }
572
573 // --------------------------------------------------------------------
574
575 /**
576 * Insert_batch statement
577 *
578 * Generates a platform-specific insert string from the supplied data
579 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700580 * @param string the table name
581 * @param array the insert keys
582 * @param array the insert values
583 * @return string
584 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200585 protected function _insert_batch($table, $keys, $values)
Esen Sagynov2e087942011-08-09 23:35:01 -0700586 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200587 return 'INSERT INTO '.$table.' ("'.implode('", "', $keys).'") VALUES '.implode(', ', $values);
Esen Sagynov2e087942011-08-09 23:35:01 -0700588 }
589
590 // --------------------------------------------------------------------
591
Esen Sagynov2e087942011-08-09 23:35:01 -0700592 /**
593 * Update statement
594 *
595 * Generates a platform-specific update string from the supplied data
596 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700597 * @param string the table name
598 * @param array the update data
599 * @param array the where clause
600 * @param array the orderby clause
601 * @param array the limit clause
602 * @return string
603 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200604 protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700605 {
606 foreach ($values as $key => $val)
607 {
Esen Sagynovee3e5942011-08-10 03:22:58 -0700608 $valstr[] = sprintf('"%s" = %s', $key, $val);
Esen Sagynov2e087942011-08-09 23:35:01 -0700609 }
610
Andrey Andreev7f55d612012-01-26 13:44:28 +0200611 return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
612 .(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
613 .(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
614 .( ! $limit ? '' : ' LIMIT '.$limit);
Esen Sagynov2e087942011-08-09 23:35:01 -0700615 }
616
617 // --------------------------------------------------------------------
618
619
620 /**
621 * Update_Batch statement
622 *
623 * Generates a platform-specific batch update string from the supplied data
624 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700625 * @param string the table name
626 * @param array the update data
627 * @param array the where clause
628 * @return string
629 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200630 protected function _update_batch($table, $values, $index, $where = NULL)
Esen Sagynov2e087942011-08-09 23:35:01 -0700631 {
632 $ids = array();
Esen Sagynov2e087942011-08-09 23:35:01 -0700633 foreach ($values as $key => $val)
634 {
635 $ids[] = $val[$index];
636
637 foreach (array_keys($val) as $field)
638 {
639 if ($field != $index)
640 {
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700641 $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
Esen Sagynov2e087942011-08-09 23:35:01 -0700642 }
643 }
644 }
645
Esen Sagynov2e087942011-08-09 23:35:01 -0700646 $cases = '';
Esen Sagynov2e087942011-08-09 23:35:01 -0700647 foreach ($final as $k => $v)
648 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200649 $cases .= $k." = CASE \n"
650 .implode("\n", $v)
651 .'ELSE '.$k.' END, ';
Esen Sagynov2e087942011-08-09 23:35:01 -0700652 }
653
Andrey Andreev2e430a32012-02-12 23:37:58 +0200654 return 'UPDATE '.$table.' SET '.substr($cases, 0, -2)
Andrey Andreev7f55d612012-01-26 13:44:28 +0200655 .' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '')
656 .$index.' IN ('.implode(',', $ids).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700657 }
658
659 // --------------------------------------------------------------------
660
Esen Sagynov2e087942011-08-09 23:35:01 -0700661 /**
662 * Truncate statement
663 *
664 * Generates a platform-specific truncate string from the supplied data
665 * If the database does not support the truncate() command
666 * This function maps to "DELETE FROM table"
667 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700668 * @param string the table name
669 * @return string
670 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200671 protected function _truncate($table)
Esen Sagynov2e087942011-08-09 23:35:01 -0700672 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200673 return 'TRUNCATE '.$table;
Esen Sagynov2e087942011-08-09 23:35:01 -0700674 }
675
676 // --------------------------------------------------------------------
677
678 /**
679 * Delete statement
680 *
681 * Generates a platform-specific delete string from the supplied data
682 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700683 * @param string the table name
684 * @param array the where clause
685 * @param string the limit clause
686 * @return string
687 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200688 protected function _delete($table, $where = array(), $like = array(), $limit = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700689 {
690 $conditions = '';
691
692 if (count($where) > 0 OR count($like) > 0)
693 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200694 $conditions = "\nWHERE ".implode("\n", $where)
695 .((count($where) > 0 && count($like) > 0) ? ' AND ' : '')
696 .implode("\n", $like);
Esen Sagynov2e087942011-08-09 23:35:01 -0700697 }
698
Andrey Andreev7f55d612012-01-26 13:44:28 +0200699 return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
Esen Sagynov2e087942011-08-09 23:35:01 -0700700 }
701
702 // --------------------------------------------------------------------
703
704 /**
705 * Limit string
706 *
707 * Generates a platform-specific LIMIT clause
708 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700709 * @param string the sql query string
Andrey Andreev7f55d612012-01-26 13:44:28 +0200710 * @param int the number of rows to limit the query to
711 * @param int the offset value
Esen Sagynov2e087942011-08-09 23:35:01 -0700712 * @return string
713 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200714 protected function _limit($sql, $limit, $offset)
Esen Sagynov2e087942011-08-09 23:35:01 -0700715 {
Andrey Andreevc6953f42012-01-26 14:43:16 +0200716 return $sql.'LIMIT '.($offset == 0 ? '' : $offset.', ').$limit;
Esen Sagynov2e087942011-08-09 23:35:01 -0700717 }
718
719 // --------------------------------------------------------------------
720
721 /**
722 * Close DB Connection
723 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700724 * @param resource
725 * @return void
726 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200727 protected function _close($conn_id)
Esen Sagynov2e087942011-08-09 23:35:01 -0700728 {
729 @cubrid_close($conn_id);
730 }
731
732}
733
Esen Sagynov2e087942011-08-09 23:35:01 -0700734/* End of file cubrid_driver.php */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200735/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */