blob: 7a5c048f992f6fb2c35e176c8c3612c86f4d5fcb [file] [log] [blame]
Andrey Andreev592f4ec2012-03-20 15:10:08 +02001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
Esen Sagynov2e087942011-08-09 23:35:01 -07002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Esen Sagynov2e087942011-08-09 23:35:01 -07006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreev592f4ec2012-03-20 15:10:08 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreev592f4ec2012-03-20 15:10:08 +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 Andreev592f4ec2012-03-20 15:10:08 +020043 public $dbdriver = 'cubrid';
Esen Sagynov2e087942011-08-09 23:35:01 -070044
45 // The character used for escaping - no need in CUBRID
Andrey Andreev592f4ec2012-03-20 15:10:08 +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 Andreev592f4ec2012-03-20 15:10:08 +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 Andreev592f4ec2012-03-20 15:10:08 +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 Andreeva00e5042012-03-26 12:23:13 +030060 // CUBRID-specific properties
61 public $auto_commit = TRUE;
62
63 public function __construct($params)
64 {
65 parent::__construct($params);
66
67 if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:[^:]*:[^:]*:(\?.+)?$/', $this->dsn, $matches))
68 {
69 if (stripos($matches[2], 'autocommit=off') !== FALSE)
70 {
71 $this->auto_commit = FALSE;
72 }
73 }
74 else
75 {
76 // If no port is defined by the user, use the default value
77 $this->port == '' OR $this->port = 33000;
78 }
79 }
80
Esen Sagynov2e087942011-08-09 23:35:01 -070081 /**
82 * Non-persistent database connection
83 *
Esen Sagynov2e087942011-08-09 23:35:01 -070084 * @return resource
85 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +020086 public function db_connect()
Esen Sagynov2e087942011-08-09 23:35:01 -070087 {
Andrey Andreeva00e5042012-03-26 12:23:13 +030088 return $this->_cubrid_connect();
Esen Sagynov2e087942011-08-09 23:35:01 -070089 }
90
91 // --------------------------------------------------------------------
92
93 /**
94 * Persistent database connection
Andrey Andreev592f4ec2012-03-20 15:10:08 +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 Andreeva00e5042012-03-26 12:23:13 +0300100 * server will become persistent.
Esen Sagynov2e087942011-08-09 23:35:01 -0700101 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700102 * @return resource
103 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200104 public function db_pconnect()
Esen Sagynov2e087942011-08-09 23:35:01 -0700105 {
Andrey Andreeva00e5042012-03-26 12:23:13 +0300106 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 $_temp = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url';
126 $conn_id = ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '')
127 ? $_temp($this->dsn, $this->username, $this->password)
128 : $_temp($this->dsn);
129 }
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 return $conn_id;
Esen Sagynov2e087942011-08-09 23:35:01 -0700139 }
140
141 // --------------------------------------------------------------------
142
143 /**
144 * Reconnect
145 *
146 * Keep / reestablish the db connection if no queries have been
147 * sent for a length of time exceeding the server's idle timeout
148 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700149 * @return void
150 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200151 public function reconnect()
Esen Sagynov2e087942011-08-09 23:35:01 -0700152 {
153 if (cubrid_ping($this->conn_id) === FALSE)
154 {
155 $this->conn_id = FALSE;
156 }
157 }
158
159 // --------------------------------------------------------------------
160
161 /**
Andrey Andreev08856b82012-03-03 03:19:28 +0200162 * Database version number
Esen Sagynov2e087942011-08-09 23:35:01 -0700163 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700164 * @return string
165 */
Andrey Andreev08856b82012-03-03 03:19:28 +0200166 public function version()
Esen Sagynov2e087942011-08-09 23:35:01 -0700167 {
Andrey Andreev08856b82012-03-03 03:19:28 +0200168 return isset($this->data_cache['version'])
169 ? $this->data_cache['version']
170 : $this->data_cache['version'] = cubrid_get_server_info($this->conn_id);
Esen Sagynov2e087942011-08-09 23:35:01 -0700171 }
172
173 // --------------------------------------------------------------------
174
175 /**
176 * Execute the query
177 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700178 * @param string an SQL query
179 * @return resource
180 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200181 protected function _execute($sql)
Esen Sagynov2e087942011-08-09 23:35:01 -0700182 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700183 return @cubrid_query($sql, $this->conn_id);
184 }
185
186 // --------------------------------------------------------------------
187
188 /**
Esen Sagynov2e087942011-08-09 23:35:01 -0700189 * Begin Transaction
190 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700191 * @return bool
192 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200193 public function trans_begin($test_mode = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700194 {
195 if ( ! $this->trans_enabled)
196 {
197 return TRUE;
198 }
199
200 // When transactions are nested we only begin/commit/rollback the outermost ones
201 if ($this->_trans_depth > 0)
202 {
203 return TRUE;
204 }
205
206 // Reset the transaction failure flag.
207 // If the $test_mode flag is set to TRUE transactions will be rolled back
208 // even if the queries produce a successful result.
209 $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
210
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700211 if (cubrid_get_autocommit($this->conn_id))
212 {
213 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE);
214 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700215
216 return TRUE;
217 }
218
219 // --------------------------------------------------------------------
220
221 /**
222 * Commit Transaction
223 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700224 * @return bool
225 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200226 public function trans_commit()
Esen Sagynov2e087942011-08-09 23:35:01 -0700227 {
228 if ( ! $this->trans_enabled)
229 {
230 return TRUE;
231 }
232
233 // When transactions are nested we only begin/commit/rollback the outermost ones
234 if ($this->_trans_depth > 0)
235 {
236 return TRUE;
237 }
238
239 cubrid_commit($this->conn_id);
240
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700241 if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
242 {
243 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
244 }
245
Esen Sagynov2e087942011-08-09 23:35:01 -0700246 return TRUE;
247 }
248
249 // --------------------------------------------------------------------
250
251 /**
252 * Rollback Transaction
253 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700254 * @return bool
255 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200256 public function trans_rollback()
Esen Sagynov2e087942011-08-09 23:35:01 -0700257 {
258 if ( ! $this->trans_enabled)
259 {
260 return TRUE;
261 }
262
263 // When transactions are nested we only begin/commit/rollback the outermost ones
264 if ($this->_trans_depth > 0)
265 {
266 return TRUE;
267 }
268
269 cubrid_rollback($this->conn_id);
270
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700271 if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
272 {
273 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
274 }
275
Esen Sagynov2e087942011-08-09 23:35:01 -0700276 return TRUE;
277 }
278
279 // --------------------------------------------------------------------
280
281 /**
282 * Escape String
283 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700284 * @param string
285 * @param bool whether or not the string will be used in a LIKE condition
286 * @return string
287 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200288 public function escape_str($str, $like = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700289 {
290 if (is_array($str))
291 {
292 foreach ($str as $key => $val)
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700293 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700294 $str[$key] = $this->escape_str($val, $like);
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700295 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700296
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700297 return $str;
298 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700299
300 if (function_exists('cubrid_real_escape_string') AND is_resource($this->conn_id))
301 {
302 $str = cubrid_real_escape_string($str, $this->conn_id);
303 }
304 else
305 {
306 $str = addslashes($str);
307 }
308
309 // escape LIKE condition wildcards
310 if ($like === TRUE)
311 {
Esen Sagynov2e087942011-08-09 23:35:01 -0700312 $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
313 }
314
315 return $str;
316 }
317
318 // --------------------------------------------------------------------
319
320 /**
321 * Affected Rows
322 *
Andrey Andreevea3eec92012-03-01 19:16:23 +0200323 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700324 */
Timothy Warren175e2892012-03-19 19:08:39 -0400325 public function affected_rows()
Esen Sagynov2e087942011-08-09 23:35:01 -0700326 {
Andrey Andreevea3eec92012-03-01 19:16:23 +0200327 return @cubrid_affected_rows();
Esen Sagynov2e087942011-08-09 23:35:01 -0700328 }
329
330 // --------------------------------------------------------------------
331
332 /**
333 * Insert ID
334 *
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200335 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700336 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200337 public function insert_id()
Esen Sagynov2e087942011-08-09 23:35:01 -0700338 {
339 return @cubrid_insert_id($this->conn_id);
340 }
341
342 // --------------------------------------------------------------------
343
344 /**
345 * "Count All" query
346 *
347 * Generates a platform-specific query string that counts all records in
348 * the specified table
349 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700350 * @param string
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200351 * @return int
Esen Sagynov2e087942011-08-09 23:35:01 -0700352 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200353 public function count_all($table = '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700354 {
355 if ($table == '')
356 {
357 return 0;
358 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700359
Andrey Andreev032e7ea2012-03-06 19:48:35 +0200360 $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 -0700361 if ($query->num_rows() == 0)
362 {
363 return 0;
364 }
365
366 $row = $query->row();
Greg Aker90248ab2011-08-20 14:23:14 -0500367 $this->_reset_select();
Esen Sagynov2e087942011-08-09 23:35:01 -0700368 return (int) $row->numrows;
369 }
370
371 // --------------------------------------------------------------------
372
373 /**
374 * List table query
375 *
376 * Generates a platform-specific query string so that the table names can be fetched
377 *
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200378 * @param bool
Esen Sagynov2e087942011-08-09 23:35:01 -0700379 * @return string
380 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200381 protected function _list_tables($prefix_limit = FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700382 {
383 $sql = "SHOW TABLES";
384
385 if ($prefix_limit !== FALSE AND $this->dbprefix != '')
386 {
387 $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
388 }
389
390 return $sql;
391 }
392
393 // --------------------------------------------------------------------
394
395 /**
396 * Show column query
397 *
398 * Generates a platform-specific query string so that the column names can be fetched
399 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700400 * @param string the table name
401 * @return string
402 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200403 protected function _list_columns($table = '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700404 {
Andrey Andreev032e7ea2012-03-06 19:48:35 +0200405 return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);
Esen Sagynov2e087942011-08-09 23:35:01 -0700406 }
407
408 // --------------------------------------------------------------------
409
410 /**
411 * Field data query
412 *
413 * Generates a platform-specific query so that the column data can be retrieved
414 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700415 * @param string the table name
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200416 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700417 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200418 protected function _field_data($table)
Esen Sagynov2e087942011-08-09 23:35:01 -0700419 {
420 return "SELECT * FROM ".$table." LIMIT 1";
421 }
422
423 // --------------------------------------------------------------------
424
425 /**
Andrey Andreev4be5de12012-03-02 15:45:41 +0200426 * Error
Esen Sagynov2e087942011-08-09 23:35:01 -0700427 *
Andrey Andreev4be5de12012-03-02 15:45:41 +0200428 * Returns an array containing code and message of the last
429 * database error that has occured.
Esen Sagynov2e087942011-08-09 23:35:01 -0700430 *
Andrey Andreev4be5de12012-03-02 15:45:41 +0200431 * @return array
Esen Sagynov2e087942011-08-09 23:35:01 -0700432 */
Timothy Warren175e2892012-03-19 19:08:39 -0400433 public function error()
Esen Sagynov2e087942011-08-09 23:35:01 -0700434 {
Andrey Andreev4be5de12012-03-02 15:45:41 +0200435 return array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id));
Esen Sagynov2e087942011-08-09 23:35:01 -0700436 }
437
Esen Sagynov2e087942011-08-09 23:35:01 -0700438 // --------------------------------------------------------------------
439
440 /**
441 * From Tables
442 *
Timothy Warren175e2892012-03-19 19:08:39 -0400443 * This function implicitly groups FROM tables so there is no confusion
Esen Sagynov2e087942011-08-09 23:35:01 -0700444 * about operator precedence in harmony with SQL standards
445 *
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200446 * @param array
447 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700448 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200449 protected function _from_tables($tables)
Esen Sagynov2e087942011-08-09 23:35:01 -0700450 {
451 if ( ! is_array($tables))
452 {
453 $tables = array($tables);
454 }
455
456 return '('.implode(', ', $tables).')';
457 }
458
459 // --------------------------------------------------------------------
460
461 /**
Esen Sagynov2e087942011-08-09 23:35:01 -0700462 * Update_Batch statement
463 *
464 * Generates a platform-specific batch update string from the supplied data
465 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700466 * @param string the table name
467 * @param array the update data
468 * @param array the where clause
469 * @return string
470 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200471 protected function _update_batch($table, $values, $index, $where = NULL)
Esen Sagynov2e087942011-08-09 23:35:01 -0700472 {
473 $ids = array();
474 $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : '';
475
476 foreach ($values as $key => $val)
477 {
478 $ids[] = $val[$index];
479
480 foreach (array_keys($val) as $field)
481 {
482 if ($field != $index)
483 {
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -0700484 $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
Esen Sagynov2e087942011-08-09 23:35:01 -0700485 }
486 }
487 }
488
489 $sql = "UPDATE ".$table." SET ";
490 $cases = '';
491
492 foreach ($final as $k => $v)
493 {
494 $cases .= $k.' = CASE '."\n";
495 foreach ($v as $row)
496 {
497 $cases .= $row."\n";
498 }
499
500 $cases .= 'ELSE '.$k.' END, ';
501 }
502
503 $sql .= substr($cases, 0, -2);
504
505 $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
506
507 return $sql;
508 }
509
510 // --------------------------------------------------------------------
511
Esen Sagynov2e087942011-08-09 23:35:01 -0700512 /**
Esen Sagynov2e087942011-08-09 23:35:01 -0700513 * Limit string
514 *
515 * Generates a platform-specific LIMIT clause
516 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700517 * @param string the sql query string
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200518 * @param int the number of rows to limit the query to
519 * @param int the offset value
Esen Sagynov2e087942011-08-09 23:35:01 -0700520 * @return string
521 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200522 protected function _limit($sql, $limit, $offset)
Esen Sagynov2e087942011-08-09 23:35:01 -0700523 {
524 if ($offset == 0)
525 {
526 $offset = '';
527 }
528 else
529 {
530 $offset .= ", ";
531 }
532
533 return $sql."LIMIT ".$offset.$limit;
534 }
535
536 // --------------------------------------------------------------------
537
538 /**
539 * Close DB Connection
540 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700541 * @param resource
542 * @return void
543 */
Andrey Andreev592f4ec2012-03-20 15:10:08 +0200544 protected function _close($conn_id)
Esen Sagynov2e087942011-08-09 23:35:01 -0700545 {
546 @cubrid_close($conn_id);
547 }
548
549}
550
Esen Sagynov2e087942011-08-09 23:35:01 -0700551/* End of file cubrid_driver.php */
Timothy Warren215890b2012-03-20 09:38:16 -0400552/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */