blob: f8a998b56cfc393516df1d7a17d2e382a3735303 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02005 * An open source application development framework for PHP
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Andrey Andreev2caf2892012-01-27 00:12:03 +02008 *
Andrey Andreevcce6bd12018-01-09 11:32:02 +02009 * Copyright (c) 2014 - 2018, British Columbia Institute of Technology
Andrey Andreev2caf2892012-01-27 00:12:03 +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 1.0.0
Derek Allard2067d1a2008-11-13 22:59:24 +000036 * @filesource
37 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000039
Derek Allard2067d1a2008-11-13 22:59:24 +000040/**
41 * MySQL Forge Class
42 *
43 * @category Database
Derek Jonesf4a4bd82011-10-20 12:18:42 -050044 * @author EllisLab Dev Team
Andrey Andreevbd202c92016-01-11 12:50:18 +020045 * @link https://codeigniter.com/user_guide/database/
Derek Allard2067d1a2008-11-13 22:59:24 +000046 */
47class CI_DB_mysql_forge extends CI_DB_forge {
Barry Mienydd671972010-10-04 16:33:58 +020048
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 = 'CREATE DATABASE %s CHARACTER SET %s COLLATE %s';
Derek Allard2067d1a2008-11-13 22:59:24 +000055
Andrey Andreeva287a342012-11-05 23:19: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 Andreeva287a342012-11-05 23:19:59 +020067 * UNSIGNED support
68 *
69 * @var array
70 */
71 protected $_unsigned = array(
72 'TINYINT',
73 'SMALLINT',
74 'MEDIUMINT',
75 'INT',
76 'INTEGER',
77 'BIGINT',
78 'REAL',
79 'DOUBLE',
80 'DOUBLE PRECISION',
81 'FLOAT',
82 'DECIMAL',
83 'NUMERIC'
84 );
85
86 /**
87 * NULL value representation in CREATE/ALTER TABLE statements
88 *
89 * @var string
90 */
Andrey Andreev5289f272014-11-03 22:45:28 +020091 protected $_null = 'NULL';
Andrey Andreeva287a342012-11-05 23:19:59 +020092
Andrey Andreevc98e93a2012-11-02 02:04:59 +020093 // --------------------------------------------------------------------
94
Derek Allard2067d1a2008-11-13 22:59:24 +000095 /**
Andrey Andreev27f798b2014-01-20 18:19:13 +020096 * CREATE TABLE attributes
Derek Allard2067d1a2008-11-13 22:59:24 +000097 *
Andrey Andreev27f798b2014-01-20 18:19:13 +020098 * @param array $attributes Associative array of table attributes
99 * @return string
Derek Allard2067d1a2008-11-13 22:59:24 +0000100 */
Andrey Andreev27f798b2014-01-20 18:19:13 +0200101 protected function _create_table_attr($attributes)
Derek Allard2067d1a2008-11-13 22:59:24 +0000102 {
Andrey Andreev27f798b2014-01-20 18:19:13 +0200103 $sql = '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000104
Andrey Andreev27f798b2014-01-20 18:19:13 +0200105 foreach (array_keys($attributes) as $key)
106 {
107 if (is_string($key))
108 {
109 $sql .= ' '.strtoupper($key).' = '.$attributes[$key];
110 }
111 }
112
113 if ( ! empty($this->db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET'))
114 {
115 $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set;
116 }
117
118 if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE'))
119 {
120 $sql .= ' COLLATE = '.$this->db->dbcollat;
121 }
122
123 return $sql;
Andrey Andreeva287a342012-11-05 23:19:59 +0200124 }
125
126 // --------------------------------------------------------------------
127
128 /**
129 * ALTER TABLE
130 *
131 * @param string $alter_type ALTER type
132 * @param string $table Table name
133 * @param mixed $field Column definition
134 * @return string|string[]
135 */
136 protected function _alter_table($alter_type, $table, $field)
137 {
138 if ($alter_type === 'DROP')
Derek Allard2067d1a2008-11-13 22:59:24 +0000139 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200140 return parent::_alter_table($alter_type, $table, $field);
141 }
142
143 $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);
144 for ($i = 0, $c = count($field); $i < $c; $i++)
145 {
146 if ($field[$i]['_literal'] !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000147 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200148 $field[$i] = ($alter_type === 'ADD')
149 ? "\n\tADD ".$field[$i]['_literal']
150 : "\n\tMODIFY ".$field[$i]['_literal'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000151 }
152 else
153 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200154 if ($alter_type === 'ADD')
Derek Allard2067d1a2008-11-13 22:59:24 +0000155 {
Andrey Andreeva287a342012-11-05 23:19:59 +0200156 $field[$i]['_literal'] = "\n\tADD ";
Derek Allard2067d1a2008-11-13 22:59:24 +0000157 }
158 else
159 {
Andrey Andreeve8b89632012-11-08 12:05:00 +0200160 $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE ";
Derek Allard2067d1a2008-11-13 22:59:24 +0000161 }
Barry Mienydd671972010-10-04 16:33:58 +0200162
Andrey Andreeve8b89632012-11-08 12:05:00 +0200163 $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]);
Derek Allard2067d1a2008-11-13 22:59:24 +0000164 }
165 }
166
Andrey Andreeva287a342012-11-05 23:19:59 +0200167 return array($sql.implode(',', $field));
Derek Allard2067d1a2008-11-13 22:59:24 +0000168 }
169
170 // --------------------------------------------------------------------
171
172 /**
Andrey Andreeva287a342012-11-05 23:19:59 +0200173 * Process column
Derek Allard2067d1a2008-11-13 22:59:24 +0000174 *
Andrey Andreeva287a342012-11-05 23:19:59 +0200175 * @param array $field
Andrey Andreev2caf2892012-01-27 00:12:03 +0200176 * @return string
Derek Allard2067d1a2008-11-13 22:59:24 +0000177 */
Andrey Andreeva287a342012-11-05 23:19:59 +0200178 protected function _process_column($field)
Derek Allard2067d1a2008-11-13 22:59:24 +0000179 {
Andrey Andreevb67277b2012-11-12 12:51:14 +0200180 $extra_clause = isset($field['after'])
181 ? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';
182
183 if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE)
184 {
185 $extra_clause = ' FIRST';
186 }
187
Zachary Flowere4b10bf2014-11-03 10:42:57 -0700188
Andrey Andreeva287a342012-11-05 23:19:59 +0200189 return $this->db->escape_identifiers($field['name'])
Andrey Andreev7ade8b72012-11-22 13:12:22 +0200190 .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
Andrey Andreeva287a342012-11-05 23:19:59 +0200191 .' '.$field['type'].$field['length']
192 .$field['unsigned']
193 .$field['null']
194 .$field['default']
195 .$field['auto_increment']
Andrey Andreevb67277b2012-11-12 12:51:14 +0200196 .$field['unique']
Andrey Andreev5289f272014-11-03 22:45:28 +0200197 .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment'])
Andrey Andreevb67277b2012-11-12 12:51:14 +0200198 .$extra_clause;
Andrey Andreeva287a342012-11-05 23:19:59 +0200199 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000200
Andrey Andreeva287a342012-11-05 23:19:59 +0200201 // --------------------------------------------------------------------
202
203 /**
204 * Process indexes
205 *
206 * @param string $table (ignored)
207 * @return string
208 */
Andrey Andreev35451022012-11-25 17:20:04 +0200209 protected function _process_indexes($table)
Andrey Andreeva287a342012-11-05 23:19:59 +0200210 {
211 $sql = '';
212
213 for ($i = 0, $c = count($this->keys); $i < $c; $i++)
Derek Allard2067d1a2008-11-13 22:59:24 +0000214 {
Andrey Andreev35451022012-11-25 17:20:04 +0200215 if (is_array($this->keys[$i]))
216 {
217 for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++)
218 {
219 if ( ! isset($this->fields[$this->keys[$i][$i2]]))
220 {
221 unset($this->keys[$i][$i2]);
222 continue;
223 }
224 }
225 }
226 elseif ( ! isset($this->fields[$this->keys[$i]]))
Andrey Andreeva287a342012-11-05 23:19:59 +0200227 {
228 unset($this->keys[$i]);
229 continue;
230 }
231
232 is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);
233
234 $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i]))
235 .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')';
Derek Allard2067d1a2008-11-13 22:59:24 +0000236 }
237
Andrey Andreeva287a342012-11-05 23:19:59 +0200238 $this->keys = array();
239
240 return $sql;
Derek Allard2067d1a2008-11-13 22:59:24 +0000241 }
242
Derek Allard2067d1a2008-11-13 22:59:24 +0000243}