PageRenderTime 18ms CodeModel.GetById 11ms app.highlight 4ms RepoModel.GetById 1ms app.codeStats 0ms

/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php

https://bitbucket.org/Naked_Yoshi/sq_kanban
PHP | 210 lines | 96 code | 22 blank | 92 comment | 15 complexity | f240b1afd0d31c8e2f472a36f7c12f26 MD5 | raw file
  1<?php
  2/**
  3 * CodeIgniter
  4 *
  5 * An open source application development framework for PHP
  6 *
  7 * This content is released under the MIT License (MIT)
  8 *
  9 * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
 10 *
 11 * 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:
 17 *
 18 * 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
 31 * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
 32 * @copyright	Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
 33 * @license	http://opensource.org/licenses/MIT	MIT License
 34 * @link	https://codeigniter.com
 35 * @since	Version 3.0.0
 36 * @filesource
 37 */
 38defined('BASEPATH') OR exit('No direct script access allowed');
 39
 40/**
 41 * PDO PostgreSQL Forge Class
 42 *
 43 * @category	Database
 44 * @author		EllisLab Dev Team
 45 * @link		https://codeigniter.com/user_guide/database/
 46 */
 47class CI_DB_pdo_pgsql_forge extends CI_DB_pdo_forge {
 48
 49	/**
 50	 * DROP TABLE IF statement
 51	 *
 52	 * @var	string
 53	 */
 54	protected $_drop_table_if	= 'DROP TABLE IF EXISTS';
 55
 56	/**
 57	 * UNSIGNED support
 58	 *
 59	 * @var	array
 60	 */
 61	protected $_unsigned		= array(
 62		'INT2'		=> 'INTEGER',
 63		'SMALLINT'	=> 'INTEGER',
 64		'INT'		=> 'BIGINT',
 65		'INT4'		=> 'BIGINT',
 66		'INTEGER'	=> 'BIGINT',
 67		'INT8'		=> 'NUMERIC',
 68		'BIGINT'	=> 'NUMERIC',
 69		'REAL'		=> 'DOUBLE PRECISION',
 70		'FLOAT'		=> 'DOUBLE PRECISION'
 71	);
 72
 73	/**
 74	 * NULL value representation in CREATE/ALTER TABLE statements
 75	 *
 76	 * @var	string
 77	 */
 78	protected $_null = 'NULL';
 79
 80	// --------------------------------------------------------------------
 81
 82	/**
 83	 * Class constructor
 84	 *
 85	 * @param	object	&$db	Database object
 86	 * @return	void
 87	 */
 88	public function __construct(&$db)
 89	{
 90		parent::__construct($db);
 91
 92		if (version_compare($this->db->version(), '9.0', '>'))
 93		{
 94			$this->create_table_if = 'CREATE TABLE IF NOT EXISTS';
 95		}
 96	}
 97
 98	// --------------------------------------------------------------------
 99
100	/**
101	 * ALTER TABLE
102	 *
103	 * @param	string	$alter_type	ALTER type
104	 * @param	string	$table		Table name
105	 * @param	mixed	$field		Column definition
106	 * @return	string|string[]
107	 */
108	protected function _alter_table($alter_type, $table, $field)
109 	{
110		if (in_array($alter_type, array('DROP', 'ADD'), TRUE))
111		{
112			return parent::_alter_table($alter_type, $table, $field);
113		}
114
115		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);
116		$sqls = array();
117		for ($i = 0, $c = count($field); $i < $c; $i++)
118		{
119			if ($field[$i]['_literal'] !== FALSE)
120			{
121				return FALSE;
122			}
123
124			if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type']))
125			{
126				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
127					.' TYPE '.$field[$i]['type'].$field[$i]['length'];
128			}
129
130			if ( ! empty($field[$i]['default']))
131			{
132				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
133					.' SET DEFAULT '.$field[$i]['default'];
134			}
135
136			if (isset($field[$i]['null']))
137			{
138				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
139					.($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL');
140			}
141
142			if ( ! empty($field[$i]['new_name']))
143			{
144				$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
145					.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);
146			}
147
148			if ( ! empty($field[$i]['comment']))
149			{
150				$sqls[] = 'COMMENT ON COLUMN '
151					.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name'])
152					.' IS '.$field[$i]['comment'];
153			}
154		}
155
156		return $sqls;
157 	}
158
159	// --------------------------------------------------------------------
160
161	/**
162	 * Field attribute TYPE
163	 *
164	 * Performs a data type mapping between different databases.
165	 *
166	 * @param	array	&$attributes
167	 * @return	void
168	 */
169	protected function _attr_type(&$attributes)
170	{
171		// Reset field lengths for data types that don't support it
172		if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE)
173		{
174			$attributes['CONSTRAINT'] = NULL;
175		}
176
177		switch (strtoupper($attributes['TYPE']))
178		{
179			case 'TINYINT':
180				$attributes['TYPE'] = 'SMALLINT';
181				$attributes['UNSIGNED'] = FALSE;
182				return;
183			case 'MEDIUMINT':
184				$attributes['TYPE'] = 'INTEGER';
185				$attributes['UNSIGNED'] = FALSE;
186				return;
187			default: return;
188		}
189	}
190
191	// --------------------------------------------------------------------
192
193	/**
194	 * Field attribute AUTO_INCREMENT
195	 *
196	 * @param	array	&$attributes
197	 * @param	array	&$field
198	 * @return	void
199	 */
200	protected function _attr_auto_increment(&$attributes, &$field)
201	{
202		if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE)
203		{
204			$field['type'] = ($field['type'] === 'NUMERIC')
205				? 'BIGSERIAL'
206				: 'SERIAL';
207		}
208	}
209
210}