blob: 95e7ca1d0746d38d9dcb88ae361744e35dfd454d [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Esen Sagynov2e087942011-08-09 23:35:01 -07002/**
3 * CodeIgniter
4 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02005 * An open source application development framework for PHP
Esen Sagynov2e087942011-08-09 23:35:01 -07006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Andrey Andreev7f55d612012-01-26 13:44:28 +02008 *
Andrey Andreevcce6bd12018-01-09 11:32:02 +02009 * Copyright (c) 2014 - 2018, British Columbia Institute of Technology
Andrey Andreev7f55d612012-01-26 13:44:28 +020010 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020011 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
Derek Jonesf4a4bd82011-10-20 12:18:42 -050017 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020018 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 *
29 * @package CodeIgniter
30 * @author EllisLab Dev Team
Andrey Andreev1924e872016-01-11 12:55:34 +020031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
Andrey Andreevcce6bd12018-01-09 11:32:02 +020032 * @copyright Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020033 * @license http://opensource.org/licenses/MIT MIT License
Andrey Andreevbd202c92016-01-11 12:50:18 +020034 * @link https://codeigniter.com
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020035 * @since Version 2.1.0
Esen Sagynov2e087942011-08-09 23:35:01 -070036 * @filesource
37 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Esen Sagynov2e087942011-08-09 23:35:01 -070039
Esen Sagynov2e087942011-08-09 23:35:01 -070040/**
41 * CUBRID Forge Class
42 *
43 * @category Database
Esen Sagynov2ab2b1e2011-08-11 00:41:16 -070044 * @author Esen Sagynov
Andrey Andreevbd202c92016-01-11 12:50:18 +020045 * @link https://codeigniter.com/user_guide/database/
Esen Sagynov2e087942011-08-09 23:35:01 -070046 */
47class CI_DB_cubrid_forge extends CI_DB_forge {
48
Andrey Andreevc98e93a2012-11-02 02:04:59 +020049 /**
50 * CREATE DATABASE statement
51 *
52 * @var string
53 */
Andrey Andreevd947eba2012-04-09 14:58:28 +030054 protected $_create_database = FALSE;
Andrey Andreevc98e93a2012-11-02 02:04:59 +020055
Andrey Andreevc98e93a2012-11-02 02:04:59 +020056 /**
Andrey Andreevb0a97c12012-11-11 13:58:53 +020057 * CREATE TABLE keys flag
58 *
59 * Whether table keys are created from within the
60 * CREATE TABLE statement.
61 *
62 * @var bool
63 */
64 protected $_create_table_keys = TRUE;
65
66 /**
Andrey Andreevc98e93a2012-11-02 02:04:59 +020067 * DROP DATABASE statement
68 *
69 * @var string
70 */
Andrey Andreevd947eba2012-04-09 14:58:28 +030071 protected $_drop_database = FALSE;
Esen Sagynov2e087942011-08-09 23:35:01 -070072
73 /**
Andrey Andreeva287a342012-11-05 23:19:59 +020074 * CREATE TABLE IF statement
Esen Sagynov2e087942011-08-09 23:35:01 -070075 *
Andrey Andreeva287a342012-11-05 23:19:59 +020076 * @var string
Esen Sagynov2e087942011-08-09 23:35:01 -070077 */
Andrey Andreeva287a342012-11-05 23:19:59 +020078 protected $_create_table_if = FALSE;
Esen Sagynov2e087942011-08-09 23:35:01 -070079
Andrey Andreeva287a342012-11-05 23:19:59 +020080 /**
81 * UNSIGNED support
82 *
83 * @var array
84 */
85 protected $_unsigned = array(
86 'SHORT' => 'INTEGER',
87 'SMALLINT' => 'INTEGER',
88 'INT' => 'BIGINT',
89 'INTEGER' => 'BIGINT',
90 'BIGINT' => 'NUMERIC',
91 'FLOAT' => 'DOUBLE',
92 'REAL' => 'DOUBLE'
93 );
94
95 // --------------------------------------------------------------------
96
97 /**
98 * ALTER TABLE
99 *
100 * @param string $alter_type ALTER type
101 * @param string $table Table name
102 * @param mixed $field Column definition
103 * @return string|string[]
104 */
105 protected function _alter_table($alter_type, $table, $field)
106 {
107 if (in_array($alter_type, array('DROP', 'ADD'), TRUE))
Esen Sagynov2e087942011-08-09 23:35:01 -0700108 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200109 return parent::_alter_table($alter_type, $table, $field);
110 }
111
112 $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);
113 $sqls = array();
114 for ($i = 0, $c = count($field); $i < $c; $i++)
115 {
116 if ($field[$i]['_literal'] !== FALSE)
Esen Sagynov2e087942011-08-09 23:35:01 -0700117 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200118 $sqls[] = $sql.' CHANGE '.$field[$i]['_literal'];
Esen Sagynov2e087942011-08-09 23:35:01 -0700119 }
120 else
121 {
Andrey Andreev7ade8b72012-11-22 13:12:22 +0200122 $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE ';
Andrey Andreev5e872502012-12-15 20:59:06 +0200123 $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]);
Esen Sagynov2e087942011-08-09 23:35:01 -0700124 }
125 }
126
Andrey Andreeva287a342012-11-05 23:19:59 +0200127 return $sqls;
Esen Sagynov2e087942011-08-09 23:35:01 -0700128 }
129
130 // --------------------------------------------------------------------
131
132 /**
Andrey Andreevb67277b2012-11-12 12:51:14 +0200133 * Process column
134 *
135 * @param array $field
136 * @return string
137 */
138 protected function _process_column($field)
139 {
140 $extra_clause = isset($field['after'])
141 ? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';
142
143 if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE)
144 {
145 $extra_clause = ' FIRST';
146 }
147
148 return $this->db->escape_identifiers($field['name'])
Andrey Andreev7ade8b72012-11-22 13:12:22 +0200149 .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
Andrey Andreevb67277b2012-11-12 12:51:14 +0200150 .' '.$field['type'].$field['length']
151 .$field['unsigned']
152 .$field['null']
153 .$field['default']
154 .$field['auto_increment']
155 .$field['unique']
156 .$extra_clause;
157 }
158
159 // --------------------------------------------------------------------
160
161 /**
Andrey Andreeva287a342012-11-05 23:19:59 +0200162 * Field attribute TYPE
Esen Sagynov2e087942011-08-09 23:35:01 -0700163 *
Andrey Andreeva287a342012-11-05 23:19:59 +0200164 * Performs a data type mapping between different databases.
165 *
166 * @param array &$attributes
167 * @return void
Esen Sagynov2e087942011-08-09 23:35:01 -0700168 */
Andrey Andreeva287a342012-11-05 23:19:59 +0200169 protected function _attr_type(&$attributes)
Esen Sagynov2e087942011-08-09 23:35:01 -0700170 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200171 switch (strtoupper($attributes['TYPE']))
Esen Sagynov2e087942011-08-09 23:35:01 -0700172 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200173 case 'TINYINT':
174 $attributes['TYPE'] = 'SMALLINT';
175 $attributes['UNSIGNED'] = FALSE;
176 return;
177 case 'MEDIUMINT':
178 $attributes['TYPE'] = 'INTEGER';
179 $attributes['UNSIGNED'] = FALSE;
180 return;
Andrey Andreev75794bc2016-05-25 12:58:30 +0300181 case 'LONGTEXT':
182 $attributes['TYPE'] = 'STRING';
183 return;
Andrey Andreeva287a342012-11-05 23:19:59 +0200184 default: return;
Esen Sagynov2e087942011-08-09 23:35:01 -0700185 }
Esen Sagynov2e087942011-08-09 23:35:01 -0700186 }
187
188 // --------------------------------------------------------------------
189
190 /**
Andrey Andreeva287a342012-11-05 23:19:59 +0200191 * Process indexes
Esen Sagynov2e087942011-08-09 23:35:01 -0700192 *
Andrey Andreeva287a342012-11-05 23:19:59 +0200193 * @param string $table (ignored)
Andrey Andreev7f55d612012-01-26 13:44:28 +0200194 * @return string
Esen Sagynov2e087942011-08-09 23:35:01 -0700195 */
Andrey Andreev35451022012-11-25 17:20:04 +0200196 protected function _process_indexes($table)
Esen Sagynov2e087942011-08-09 23:35:01 -0700197 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200198 $sql = '';
Esen Sagynov2e087942011-08-09 23:35:01 -0700199
Andrey Andreeva287a342012-11-05 23:19:59 +0200200 for ($i = 0, $c = count($this->keys); $i < $c; $i++)
Esen Sagynov2e087942011-08-09 23:35:01 -0700201 {
Andrey Andreev35451022012-11-25 17:20:04 +0200202 if (is_array($this->keys[$i]))
203 {
204 for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)
205 {
206 if ( ! isset($this->fields[$this->keys[$i][$i2]]))
207 {
208 unset($this->keys[$i][$i2]);
209 continue;
210 }
211 }
212 }
213 elseif ( ! isset($this->fields[$this->keys[$i]]))
Andrey Andreeva287a342012-11-05 23:19:59 +0200214 {
215 unset($this->keys[$i]);
216 continue;
217 }
218
219 is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);
220
221 $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i]))
222 .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')';
Esen Sagynov2e087942011-08-09 23:35:01 -0700223 }
224
Andrey Andreeva287a342012-11-05 23:19:59 +0200225 $this->keys = array();
226
227 return $sql;
Esen Sagynov2e087942011-08-09 23:35:01 -0700228 }
229
Esen Sagynov2e087942011-08-09 23:35:01 -0700230}