blob: 048a0597ba5be7a4b4f4d75ceebeb14e2d00fcf3 [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
Andrey Andreevcf631202012-02-16 11:36:28 +020024 * @since Version 2.1
Esen Sagynov2e087942011-08-09 23:35:01 -070025 * @filesource
26 */
27
Esen Sagynov2e087942011-08-09 23:35:01 -070028/**
29 * CUBRID Forge Class
30 *
31 * @category Database
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -070032 * @author Esen Sagynov
Esen Sagynov2e087942011-08-09 23:35:01 -070033 * @link http://codeigniter.com/user_guide/database/
34 */
35class CI_DB_cubrid_forge extends CI_DB_forge {
36
37 /**
38 * Create database
39 *
Esen Sagynov2e087942011-08-09 23:35:01 -070040 * @param string the database name
41 * @return bool
42 */
Andrey Andreev7f55d612012-01-26 13:44:28 +020043 public function _create_database($name)
Esen Sagynov2e087942011-08-09 23:35:01 -070044 {
Andrey Andreev394a3f12012-02-15 14:35:11 +020045 // CUBRID does not allow to create a database in SQL. GUI or
46 // command line tools have to be used for this purpose.
Esen Sagynov2e087942011-08-09 23:35:01 -070047 return FALSE;
48 }
49
50 // --------------------------------------------------------------------
51
52 /**
53 * Drop database
54 *
Esen Sagynov2e087942011-08-09 23:35:01 -070055 * @param string the database name
56 * @return bool
57 */
Andrey Andreev7f55d612012-01-26 13:44:28 +020058 public function _drop_database($name)
Esen Sagynov2e087942011-08-09 23:35:01 -070059 {
Andrey Andreev394a3f12012-02-15 14:35:11 +020060 // CUBRID does not allow to drop a database in SQL. GUI or
61 // command line tools have to be used for this purpose.
Esen Sagynov2e087942011-08-09 23:35:01 -070062 return FALSE;
63 }
64
65 // --------------------------------------------------------------------
66
67 /**
68 * Process Fields
69 *
Esen Sagynov2e087942011-08-09 23:35:01 -070070 * @param mixed the fields
71 * @return string
72 */
Andrey Andreev7719a032012-01-27 21:05:55 +020073 protected function _process_fields($fields)
Esen Sagynov2e087942011-08-09 23:35:01 -070074 {
75 $current_field_count = 0;
76 $sql = '';
77
Andrey Andreev7f55d612012-01-26 13:44:28 +020078 foreach ($fields as $field => $attributes)
Esen Sagynov2e087942011-08-09 23:35:01 -070079 {
80 // Numeric field names aren't allowed in databases, so if the key is
81 // numeric, we know it was assigned by PHP and the developer manually
82 // entered the field information, so we'll simply add it to the list
83 if (is_numeric($field))
84 {
Andrey Andreev7f55d612012-01-26 13:44:28 +020085 $sql .= "\n\t".$attributes;
Esen Sagynov2e087942011-08-09 23:35:01 -070086 }
87 else
88 {
89 $attributes = array_change_key_case($attributes, CASE_UPPER);
90
Andrey Andreev394a3f12012-02-15 14:35:11 +020091 $sql .= "\n\t".$this->db->protect_identifiers($field)
Andrey Andreevc6953f42012-01-26 14:43:16 +020092 .( ! empty($attributes['NAME']) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '');
Esen Sagynov2e087942011-08-09 23:35:01 -070093
Andrey Andreev69a60932012-01-26 14:04:06 +020094 if ( ! empty($attributes['TYPE']))
Esen Sagynov2e087942011-08-09 23:35:01 -070095 {
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -070096 $sql .= ' '.$attributes['TYPE'];
Esen Sagynov2e087942011-08-09 23:35:01 -070097
Andrey Andreevc6953f42012-01-26 14:43:16 +020098 if ( ! empty($attributes['CONSTRAINT']))
Esen Sagynov2e087942011-08-09 23:35:01 -070099 {
100 switch ($attributes['TYPE'])
101 {
102 case 'decimal':
103 case 'float':
104 case 'numeric':
105 $sql .= '('.implode(',', $attributes['CONSTRAINT']).')';
106 break;
Andrey Andreev394a3f12012-02-15 14:35:11 +0200107 case 'enum':
108 // Will be supported in the future as part a part of
109 // MySQL compatibility features.
Andrey Andreev7f55d612012-01-26 13:44:28 +0200110 break;
Esen Sagynov2e087942011-08-09 23:35:01 -0700111 case 'set':
112 $sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")';
113 break;
114 default:
115 $sql .= '('.$attributes['CONSTRAINT'].')';
116 }
117 }
118 }
119
Andrey Andreev394a3f12012-02-15 14:35:11 +0200120 /* As of version 8.4.1 CUBRID does not support UNSIGNED INTEGER data type.
Andrey Andreev7f55d612012-01-26 13:44:28 +0200121 * Will be supported in the next release as a part of MySQL Compatibility.
122 *
Andrey Andreev69a60932012-01-26 14:04:06 +0200123 if (isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700124 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200125 $sql .= ' UNSIGNED';
Esen Sagynov2e087942011-08-09 23:35:01 -0700126 }
Andrey Andreev7f55d612012-01-26 13:44:28 +0200127 */
Esen Sagynov2e087942011-08-09 23:35:01 -0700128
Andrey Andreev69a60932012-01-26 14:04:06 +0200129 $sql .= (isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
Andrey Andreevc6953f42012-01-26 14:43:16 +0200130 .(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
131 .(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '')
132 .(( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) ? ' UNIQUE' : '');
Esen Sagynov2e087942011-08-09 23:35:01 -0700133 }
134
135 // don't add a comma on the end of the last field
136 if (++$current_field_count < count($fields))
137 {
138 $sql .= ',';
139 }
140 }
141
142 return $sql;
143 }
144
145 // --------------------------------------------------------------------
146
147 /**
148 * Create Table
149 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700150 * @param string the table name
151 * @param mixed the fields
152 * @param mixed primary key(s)
153 * @param mixed key(s)
154 * @param boolean should 'IF NOT EXISTS' be added to the SQL
155 * @return bool
156 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200157 public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
Esen Sagynov2e087942011-08-09 23:35:01 -0700158 {
159 $sql = 'CREATE TABLE ';
160
Andrey Andreev394a3f12012-02-15 14:35:11 +0200161 /* As of version 8.4.1 CUBRID does not support this SQL syntax.
Esen Sagynov2e087942011-08-09 23:35:01 -0700162 if ($if_not_exists === TRUE)
163 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200164 $sql .= 'IF NOT EXISTS ';
Esen Sagynov2e087942011-08-09 23:35:01 -0700165 }
Andrey Andreev7f55d612012-01-26 13:44:28 +0200166 */
Esen Sagynov2e087942011-08-09 23:35:01 -0700167
Andrey Andreev2e430a32012-02-12 23:37:58 +0200168 $sql .= $this->db->protect_identifiers($table).' ('.$this->_process_fields($fields);
Esen Sagynov2e087942011-08-09 23:35:01 -0700169
170 // If there is a PK defined
171 if (count($primary_keys) > 0)
172 {
Andrey Andreev394a3f12012-02-15 14:35:11 +0200173 $key_name = $this->db->protect_identifiers('pk_'.$table.'_'.implode('_', $primary_keys));
Andrey Andreev7f55d612012-01-26 13:44:28 +0200174 $sql .= ",\n\tCONSTRAINT ".$key_name.' PRIMARY KEY('.implode(', ', $this->db->protect_identifiers($primary_keys)).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700175 }
176
177 if (is_array($keys) && count($keys) > 0)
178 {
179 foreach ($keys as $key)
180 {
181 if (is_array($key))
182 {
Andrey Andreev394a3f12012-02-15 14:35:11 +0200183 $key_name = $this->db->protect_identifiers('idx_'.$table.implode('_', $key));
Andrey Andreev7f55d612012-01-26 13:44:28 +0200184 $key = $this->db->protect_identifiers($key);
Esen Sagynov2e087942011-08-09 23:35:01 -0700185 }
186 else
187 {
Andrey Andreev394a3f12012-02-15 14:35:11 +0200188 $key_name = $this->db->protect_identifiers('idx_'.$table.$key);
Esen Sagynov2e087942011-08-09 23:35:01 -0700189 $key = array($key_name);
190 }
Andrey Andreev7f55d612012-01-26 13:44:28 +0200191
192 $sql .= ",\n\tKEY ".$key_name.' ('.implode(', ', $key).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700193 }
194 }
195
Andrey Andreev7f55d612012-01-26 13:44:28 +0200196 return $sql."\n);";
Esen Sagynov2e087942011-08-09 23:35:01 -0700197 }
198
199 // --------------------------------------------------------------------
200
201 /**
202 * Drop Table
203 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700204 * @return string
205 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200206 public function _drop_table($table)
Esen Sagynov2e087942011-08-09 23:35:01 -0700207 {
Andrey Andreev2e430a32012-02-12 23:37:58 +0200208 return 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table);
Esen Sagynov2e087942011-08-09 23:35:01 -0700209 }
210
211 // --------------------------------------------------------------------
212
213 /**
214 * Alter table query
215 *
216 * Generates a platform-specific query so that a table can be altered
217 * Called by add_column(), drop_column(), and column_alter(),
218 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700219 * @param string the ALTER type (ADD, DROP, CHANGE)
220 * @param string the column name
221 * @param array fields
222 * @param string the field after which we should add the new field
Andrey Andreev7f55d612012-01-26 13:44:28 +0200223 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700224 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200225 public function _alter_table($alter_type, $table, $fields, $after_field = '')
Esen Sagynov2e087942011-08-09 23:35:01 -0700226 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200227 $sql = 'ALTER TABLE '.$this->db->protect_identifiers($table).' '.$alter_type.' ';
Esen Sagynov2e087942011-08-09 23:35:01 -0700228
229 // DROP has everything it needs now.
Andrey Andreev7f55d612012-01-26 13:44:28 +0200230 if ($alter_type === 'DROP')
Esen Sagynov2e087942011-08-09 23:35:01 -0700231 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200232 return $sql.$this->db->protect_identifiers($fields);
Esen Sagynov2e087942011-08-09 23:35:01 -0700233 }
234
Andrey Andreev7f55d612012-01-26 13:44:28 +0200235 return $sql.$this->_process_fields($fields)
236 .($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
Esen Sagynov2e087942011-08-09 23:35:01 -0700237 }
238
239 // --------------------------------------------------------------------
240
241 /**
242 * Rename a table
243 *
244 * Generates a platform-specific query so that a table can be renamed
245 *
Esen Sagynov2e087942011-08-09 23:35:01 -0700246 * @param string the old table name
247 * @param string the new table name
248 * @return string
249 */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200250 public function _rename_table($table_name, $new_table_name)
Esen Sagynov2e087942011-08-09 23:35:01 -0700251 {
Andrey Andreev7f55d612012-01-26 13:44:28 +0200252 return 'RENAME TABLE '.$this->db->protect_identifiers($table_name).' AS '.$this->db->protect_identifiers($new_table_name);
Esen Sagynov2e087942011-08-09 23:35:01 -0700253 }
254
255}
256
257/* End of file cubrid_forge.php */
Andrey Andreev7f55d612012-01-26 13:44:28 +0200258/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */