upgrade to codeigniter 1.7.2 for f12
[www-register-wizard.git] / database / drivers / mssql / mssql_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  * MS SQL Forge Class
20  *
21  * @category    Database
22  * @author              ExpressionEngine Dev Team
23  * @link                http://codeigniter.com/user_guide/database/
24  */
25 class CI_DB_mssql_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          * Drop Table
57          *
58          * @access      private
59          * @return      bool
60          */
61         function _drop_table($table)
62         {
63                 return "DROP TABLE ".$this->db->_escape_identifiers($table);
64         }
65
66         // --------------------------------------------------------------------
67
68         /**
69          * Create Table
70          *
71          * @access      private
72          * @param       string  the table name
73          * @param       array   the fields
74          * @param       mixed   primary key(s)
75          * @param       mixed   key(s)
76          * @param       boolean should 'IF NOT EXISTS' be added to the SQL
77          * @return      bool
78          */
79         function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
80         {
81                 $sql = 'CREATE TABLE ';
82                 
83                 if ($if_not_exists === TRUE)
84                 {
85                         $sql .= 'IF NOT EXISTS ';
86                 }
87                 
88                 $sql .= $this->db->_escape_identifiers($table)." (";
89                 $current_field_count = 0;
90
91                 foreach ($fields as $field=>$attributes)
92                 {
93                         // Numeric field names aren't allowed in databases, so if the key is
94                         // numeric, we know it was assigned by PHP and the developer manually
95                         // entered the field information, so we'll simply add it to the list
96                         if (is_numeric($field))
97                         {
98                                 $sql .= "\n\t$attributes";
99                         }
100                         else
101                         {
102                                 $attributes = array_change_key_case($attributes, CASE_UPPER);
103                                 
104                                 $sql .= "\n\t".$this->db->_protect_identifiers($field);
105                                 
106                                 $sql .=  ' '.$attributes['TYPE'];
107         
108                                 if (array_key_exists('CONSTRAINT', $attributes))
109                                 {
110                                         $sql .= '('.$attributes['CONSTRAINT'].')';
111                                 }
112         
113                                 if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
114                                 {
115                                         $sql .= ' UNSIGNED';
116                                 }
117         
118                                 if (array_key_exists('DEFAULT', $attributes))
119                                 {
120                                         $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
121                                 }
122         
123                                 if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
124                                 {
125                                         $sql .= ' NULL';
126                                 }
127                                 else
128                                 {
129                                         $sql .= ' NOT NULL';                    
130                                 }
131         
132                                 if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
133                                 {
134                                         $sql .= ' AUTO_INCREMENT';
135                                 }
136                         }
137                         
138                         // don't add a comma on the end of the last field
139                         if (++$current_field_count < count($fields))
140                         {
141                                 $sql .= ',';
142                         }
143                 }
144
145                 if (count($primary_keys) > 0)
146                 {
147                         $primary_keys = $this->db->_protect_identifiers($primary_keys);
148                         $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
149                 }
150                 
151                 if (is_array($keys) && count($keys) > 0)
152                 {
153                         foreach ($keys as $key)
154                         {
155                                 if (is_array($key))
156                                 {
157                                         $key = $this->db->_protect_identifiers($key);   
158                                 }
159                                 else
160                                 {
161                                         $key = array($this->db->_protect_identifiers($key));
162                                 }
163                                 
164                                 $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
165                         }
166                 }
167                 
168                 $sql .= "\n)";
169
170                 return $sql;
171         }
172
173         // --------------------------------------------------------------------
174
175         /**
176          * Alter table query
177          *
178          * Generates a platform-specific query so that a table can be altered
179          * Called by add_column(), drop_column(), and column_alter(),
180          *
181          * @access      private
182          * @param       string  the ALTER type (ADD, DROP, CHANGE)
183          * @param       string  the column name
184          * @param       string  the table name
185          * @param       string  the column definition
186          * @param       string  the default value
187          * @param       boolean should 'NOT NULL' be added
188          * @param       string  the field after which we should add the new field
189          * @return      object
190          */
191         function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
192         {
193                 $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
194
195                 // DROP has everything it needs now.
196                 if ($alter_type == 'DROP')
197                 {
198                         return $sql;
199                 }
200
201                 $sql .= " $column_definition";
202
203                 if ($default_value != '')
204                 {
205                         $sql .= " DEFAULT \"$default_value\"";
206                 }
207
208                 if ($null === NULL)
209                 {
210                         $sql .= ' NULL';
211                 }
212                 else
213                 {
214                         $sql .= ' NOT NULL';
215                 }
216
217                 if ($after_field != '')
218                 {
219                         $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
220                 }
221                 
222                 return $sql;
223                 
224         }
225
226         // --------------------------------------------------------------------
227
228         /**
229          * Rename a table
230          *
231          * Generates a platform-specific query so that a table can be renamed
232          *
233          * @access      private
234          * @param       string  the old table name
235          * @param       string  the new table name
236          * @return      string
237          */
238         function _rename_table($table_name, $new_table_name)
239         {
240                 // I think this syntax will work, but can find little documentation on renaming tables in MSSQL
241                 $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
242                 return $sql;
243         }
244
245 }
246
247 /* End of file mssql_forge.php */
248 /* Location: ./system/database/drivers/mssql/mssql_forge.php */