upgrade to codeigniter 1.7.2 for f12
[www-register-wizard.git] / database / drivers / mysql / mysql_forge.php
1 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2 /**
3  * CodeIgniter
4  *
5  * An open source application development framework for PHP 4.3.2 or newer
6  *
7  * @package             CodeIgniter
8  * @author              ExpressionEngine Dev Team
9  * @copyright   Copyright (c) 2008 - 2009, EllisLab, Inc.
10  * @license             http://codeigniter.com/user_guide/license.html
11  * @link                http://codeigniter.com
12  * @since               Version 1.0
13  * @filesource
14  */
15
16 // ------------------------------------------------------------------------
17
18 /**
19  * MySQL Forge Class
20  *
21  * @category    Database
22  * @author              ExpressionEngine Dev Team
23  * @link                http://codeigniter.com/user_guide/database/
24  */
25 class CI_DB_mysql_forge extends CI_DB_forge {
26         
27         /**
28          * Create database
29          *
30          * @access      private
31          * @param       string  the database name
32          * @return      bool
33          */
34         function _create_database($name)
35         {
36                 return "CREATE DATABASE ".$name;
37         }
38
39         // --------------------------------------------------------------------
40
41         /**
42          * Drop database
43          *
44          * @access      private
45          * @param       string  the database name
46          * @return      bool
47          */
48         function _drop_database($name)
49         {
50                 return "DROP DATABASE ".$name;
51         }
52
53         // --------------------------------------------------------------------
54
55         /**
56          * Process Fields
57          *
58          * @access      private
59          * @param       mixed   the fields
60          * @return      string
61          */
62         function _process_fields($fields)
63         {
64                 $current_field_count = 0;
65                 $sql = '';
66
67                 foreach ($fields as $field=>$attributes)
68                 {
69                         // Numeric field names aren't allowed in databases, so if the key is
70                         // numeric, we know it was assigned by PHP and the developer manually
71                         // entered the field information, so we'll simply add it to the list
72                         if (is_numeric($field))
73                         {
74                                 $sql .= "\n\t$attributes";
75                         }
76                         else
77                         {
78                                 $attributes = array_change_key_case($attributes, CASE_UPPER);
79                                 
80                                 $sql .= "\n\t".$this->db->_protect_identifiers($field);
81
82                                 if (array_key_exists('NAME', $attributes))
83                                 {
84                                         $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
85                                 }
86                                 
87                                 if (array_key_exists('TYPE', $attributes))
88                                 {
89                                         $sql .=  ' '.$attributes['TYPE'];
90                                 }
91         
92                                 if (array_key_exists('CONSTRAINT', $attributes))
93                                 {
94                                         $sql .= '('.$attributes['CONSTRAINT'].')';
95                                 }
96         
97                                 if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
98                                 {
99                                         $sql .= ' UNSIGNED';
100                                 }
101         
102                                 if (array_key_exists('DEFAULT', $attributes))
103                                 {
104                                         $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
105                                 }
106         
107                                 if (array_key_exists('NULL', $attributes))
108                                 {
109                                         $sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';
110                                 }
111         
112                                 if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
113                                 {
114                                         $sql .= ' AUTO_INCREMENT';
115                                 }
116                         }
117                         
118                         // don't add a comma on the end of the last field
119                         if (++$current_field_count < count($fields))
120                         {
121                                 $sql .= ',';
122                         }
123                 }
124                 
125                 return $sql;
126         }
127
128         // --------------------------------------------------------------------
129
130         /**
131          * Create Table
132          *
133          * @access      private
134          * @param       string  the table name
135          * @param       mixed   the fields
136          * @param       mixed   primary key(s)
137          * @param       mixed   key(s)
138          * @param       boolean should 'IF NOT EXISTS' be added to the SQL
139          * @return      bool
140          */
141         function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
142         {
143                 $sql = 'CREATE TABLE ';
144                 
145                 if ($if_not_exists === TRUE)
146                 {
147                         $sql .= 'IF NOT EXISTS ';
148                 }
149                 
150                 $sql .= $this->db->_escape_identifiers($table)." (";
151
152                 $sql .= $this->_process_fields($fields);
153
154                 if (count($primary_keys) > 0)
155                 {
156                         $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
157                         $primary_keys = $this->db->_protect_identifiers($primary_keys);
158                         $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
159                 }
160
161                 if (is_array($keys) && count($keys) > 0)
162                 {
163                         foreach ($keys as $key)
164                         {
165                                 if (is_array($key))
166                                 {
167                                         $key_name = $this->db->_protect_identifiers(implode('_', $key));
168                                         $key = $this->db->_protect_identifiers($key);   
169                                 }
170                                 else
171                                 {
172                                         $key_name = $this->db->_protect_identifiers($key);
173                                         $key = array($key_name);
174                                 }
175                                 
176                                 $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
177                         }
178                 }
179
180                 $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
181
182                 return $sql;
183         }
184
185         // --------------------------------------------------------------------
186
187         /**
188          * Drop Table
189          *
190          * @access      private
191          * @return      string
192          */
193         function _drop_table($table)
194         {
195                 return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
196         }
197
198         // --------------------------------------------------------------------
199
200         /**
201          * Alter table query
202          *
203          * Generates a platform-specific query so that a table can be altered
204          * Called by add_column(), drop_column(), and column_alter(),
205          *
206          * @access      private
207          * @param       string  the ALTER type (ADD, DROP, CHANGE)
208          * @param       string  the column name
209          * @param       array   fields
210          * @param       string  the field after which we should add the new field
211          * @return      object
212          */
213         function _alter_table($alter_type, $table, $fields, $after_field = '')
214         {
215                 $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
216
217                 // DROP has everything it needs now.
218                 if ($alter_type == 'DROP')
219                 {
220                         return $sql.$this->db->_protect_identifiers($fields);
221                 }
222
223                 $sql .= $this->_process_fields($fields);
224
225                 if ($after_field != '')
226                 {
227                         $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
228                 }
229                 
230                 return $sql;
231         }
232
233         // --------------------------------------------------------------------
234
235         /**
236          * Rename a table
237          *
238          * Generates a platform-specific query so that a table can be renamed
239          *
240          * @access      private
241          * @param       string  the old table name
242          * @param       string  the new table name
243          * @return      string
244          */
245         function _rename_table($table_name, $new_table_name)
246         {
247                 $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
248                 return $sql;
249         }
250
251 }
252
253 /* End of file mysql_forge.php */
254 /* Location: ./system/database/drivers/mysql/mysql_forge.php */