|
|
<?php /** * CodeIgniter * * An open source application development framework for PHP * * This content is released under the MIT License (MIT) * * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ defined('BASEPATH') OR exit('No direct script access allowed');
/** * MySQL Forge Class * * @category Database * @author EllisLab Dev Team * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysql_forge extends CI_DB_forge {
/** * CREATE DATABASE statement * * @var string */ protected $_create_database = 'CREATE DATABASE %s CHARACTER SET %s COLLATE %s';
/** * CREATE TABLE keys flag * * Whether table keys are created from within the * CREATE TABLE statement. * * @var bool */ protected $_create_table_keys = TRUE;
/** * UNSIGNED support * * @var array */ protected $_unsigned = array( 'TINYINT', 'SMALLINT', 'MEDIUMINT', 'INT', 'INTEGER', 'BIGINT', 'REAL', 'DOUBLE', 'DOUBLE PRECISION', 'FLOAT', 'DECIMAL', 'NUMERIC' );
/** * NULL value representation in CREATE/ALTER TABLE statements * * @var string */ protected $_null = 'NULL';
// --------------------------------------------------------------------
/** * CREATE TABLE attributes * * @param array $attributes Associative array of table attributes * @return string */ protected function _create_table_attr($attributes) { $sql = '';
foreach (array_keys($attributes) as $key) { if (is_string($key)) { $sql .= ' '.strtoupper($key).' = '.$attributes[$key]; } }
if ( ! empty($this->db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) { $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; }
if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) { $sql .= ' COLLATE = '.$this->db->dbcollat; }
return $sql; }
// --------------------------------------------------------------------
/** * ALTER TABLE * * @param string $alter_type ALTER type * @param string $table Table name * @param mixed $field Column definition * @return string|string[] */ protected function _alter_table($alter_type, $table, $field) { if ($alter_type === 'DROP') { return parent::_alter_table($alter_type, $table, $field); }
$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== FALSE) { $field[$i] = ($alter_type === 'ADD') ? "\n\tADD ".$field[$i]['_literal'] : "\n\tMODIFY ".$field[$i]['_literal']; } else { if ($alter_type === 'ADD') { $field[$i]['_literal'] = "\n\tADD "; } else { $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; }
$field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); } }
return array($sql.implode(',', $field)); }
// --------------------------------------------------------------------
/** * Process column * * @param array $field * @return string */ protected function _process_column($field) { $extra_clause = isset($field['after']) ? ' AFTER '.$this->db->escape_identifiers($field['after']) : '';
if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) { $extra_clause = ' FIRST'; }
return $this->db->escape_identifiers($field['name']) .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) .' '.$field['type'].$field['length'] .$field['unsigned'] .$field['null'] .$field['default'] .$field['auto_increment'] .$field['unique'] .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) .$extra_clause; }
// --------------------------------------------------------------------
/** * Process indexes * * @param string $table (ignored) * @return string */ protected function _process_indexes($table) { $sql = '';
for ($i = 0, $c = count($this->keys); $i < $c; $i++) { if (is_array($this->keys[$i])) { for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { if ( ! isset($this->fields[$this->keys[$i][$i2]])) { unset($this->keys[$i][$i2]); continue; } } } elseif ( ! isset($this->fields[$this->keys[$i]])) { unset($this->keys[$i]); continue; }
is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]);
$sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; }
$this->keys = array();
return $sql; }
}
|