blob: a71fca78f3841de8bd385790de42a5531d955733 [file] [log] [blame]
Derek Allard2067d1a2008-11-13 22:59:24 +00001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2/**
3 * Code Igniter
4 *
Greg Aker741de1c2010-11-10 14:52:57 -06005 * An open source application development framework for PHP 5.1.6 or newer
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
7 * @package CodeIgniter
8 * @author ExpressionEngine Dev Team
Greg Aker0711dc82011-01-05 10:49:40 -06009 * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
Derek Allard2067d1a2008-11-13 22:59:24 +000010 * @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 * Database Utility Class
20 *
21 * @category Database
22 * @author ExpressionEngine Dev Team
23 * @link http://codeigniter.com/user_guide/database/
24 */
25class CI_DB_forge {
26
Barry Mienydd671972010-10-04 16:33:58 +020027 var $fields = array();
Derek Allard2067d1a2008-11-13 22:59:24 +000028 var $keys = array();
Barry Mienydd671972010-10-04 16:33:58 +020029 var $primary_keys = array();
Derek Allard2067d1a2008-11-13 22:59:24 +000030 var $db_char_set = '';
31
32 /**
33 * Constructor
34 *
35 * Grabs the CI super object instance so we can access it.
36 *
Barry Mienydd671972010-10-04 16:33:58 +020037 */
Derek Allard2067d1a2008-11-13 22:59:24 +000038 function CI_DB_forge()
39 {
40 // Assign the main database object to $this->db
41 $CI =& get_instance();
42 $this->db =& $CI->db;
43 log_message('debug', "Database Forge Class Initialized");
44 }
45
46 // --------------------------------------------------------------------
47
48 /**
49 * Create database
50 *
51 * @access public
52 * @param string the database name
53 * @return bool
54 */
55 function create_database($db_name)
56 {
57 $sql = $this->_create_database($db_name);
Barry Mienydd671972010-10-04 16:33:58 +020058
Derek Allard2067d1a2008-11-13 22:59:24 +000059 if (is_bool($sql))
60 {
61 return $sql;
62 }
Barry Mienydd671972010-10-04 16:33:58 +020063
Derek Allard2067d1a2008-11-13 22:59:24 +000064 return $this->db->query($sql);
65 }
66
67 // --------------------------------------------------------------------
68
69 /**
70 * Drop database
71 *
72 * @access public
73 * @param string the database name
74 * @return bool
75 */
76 function drop_database($db_name)
77 {
78 $sql = $this->_drop_database($db_name);
Barry Mienydd671972010-10-04 16:33:58 +020079
Derek Allard2067d1a2008-11-13 22:59:24 +000080 if (is_bool($sql))
81 {
82 return $sql;
83 }
Barry Mienydd671972010-10-04 16:33:58 +020084
Derek Allard2067d1a2008-11-13 22:59:24 +000085 return $this->db->query($sql);
86 }
87
88 // --------------------------------------------------------------------
89
90 /**
91 * Add Key
92 *
93 * @access public
94 * @param string key
95 * @param string type
96 * @return void
97 */
98 function add_key($key = '', $primary = FALSE)
99 {
100 if (is_array($key))
101 {
Pascal Krietec3a4a8d2011-02-14 13:40:08 -0500102 foreach ($key as $one)
Derek Allard2067d1a2008-11-13 22:59:24 +0000103 {
104 $this->add_key($one, $primary);
105 }
Barry Mienydd671972010-10-04 16:33:58 +0200106
Derek Allard2067d1a2008-11-13 22:59:24 +0000107 return;
108 }
Barry Mienydd671972010-10-04 16:33:58 +0200109
Derek Allard2067d1a2008-11-13 22:59:24 +0000110 if ($key == '')
111 {
112 show_error('Key information is required for that operation.');
113 }
Barry Mienydd671972010-10-04 16:33:58 +0200114
Derek Allard2067d1a2008-11-13 22:59:24 +0000115 if ($primary === TRUE)
116 {
117 $this->primary_keys[] = $key;
118 }
119 else
120 {
121 $this->keys[] = $key;
122 }
123 }
124
125 // --------------------------------------------------------------------
126
127 /**
128 * Add Field
129 *
130 * @access public
131 * @param string collation
132 * @return void
133 */
134 function add_field($field = '')
135 {
136 if ($field == '')
137 {
138 show_error('Field information is required.');
139 }
Barry Mienydd671972010-10-04 16:33:58 +0200140
Derek Allard2067d1a2008-11-13 22:59:24 +0000141 if (is_string($field))
142 {
143 if ($field == 'id')
144 {
145 $this->add_field(array(
146 'id' => array(
147 'type' => 'INT',
148 'constraint' => 9,
149 'auto_increment' => TRUE
150 )
151 ));
152 $this->add_key('id', TRUE);
153 }
154 else
155 {
156 if (strpos($field, ' ') === FALSE)
157 {
158 show_error('Field information is required for that operation.');
159 }
Barry Mienydd671972010-10-04 16:33:58 +0200160
Derek Allard2067d1a2008-11-13 22:59:24 +0000161 $this->fields[] = $field;
162 }
163 }
Barry Mienydd671972010-10-04 16:33:58 +0200164
Derek Allard2067d1a2008-11-13 22:59:24 +0000165 if (is_array($field))
166 {
167 $this->fields = array_merge($this->fields, $field);
168 }
Barry Mienydd671972010-10-04 16:33:58 +0200169
Derek Allard2067d1a2008-11-13 22:59:24 +0000170 }
171
172 // --------------------------------------------------------------------
173
174 /**
175 * Create Table
176 *
177 * @access public
178 * @param string the table name
179 * @return bool
180 */
181 function create_table($table = '', $if_not_exists = FALSE)
Barry Mienydd671972010-10-04 16:33:58 +0200182 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000183 if ($table == '')
184 {
185 show_error('A table name is required for that operation.');
186 }
Barry Mienydd671972010-10-04 16:33:58 +0200187
Derek Allard2067d1a2008-11-13 22:59:24 +0000188 if (count($this->fields) == 0)
Barry Mienydd671972010-10-04 16:33:58 +0200189 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000190 show_error('Field information is required.');
191 }
192
193 $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);
Barry Mienydd671972010-10-04 16:33:58 +0200194
Derek Allard2067d1a2008-11-13 22:59:24 +0000195 $this->_reset();
196 return $this->db->query($sql);
197 }
198
199 // --------------------------------------------------------------------
200
201 /**
202 * Drop Table
203 *
204 * @access public
205 * @param string the table name
206 * @return bool
207 */
208 function drop_table($table_name)
209 {
210 $sql = $this->_drop_table($this->db->dbprefix.$table_name);
Barry Mienydd671972010-10-04 16:33:58 +0200211
Derek Allard2067d1a2008-11-13 22:59:24 +0000212 if (is_bool($sql))
213 {
214 return $sql;
215 }
Barry Mienydd671972010-10-04 16:33:58 +0200216
Derek Allard2067d1a2008-11-13 22:59:24 +0000217 return $this->db->query($sql);
218 }
219
220 // --------------------------------------------------------------------
221
222 /**
223 * Rename Table
224 *
225 * @access public
226 * @param string the old table name
227 * @param string the new table name
228 * @return bool
229 */
230 function rename_table($table_name, $new_table_name)
231 {
232 if ($table_name == '' OR $new_table_name == '')
233 {
234 show_error('A table name is required for that operation.');
235 }
Barry Mienydd671972010-10-04 16:33:58 +0200236
Derek Allard2067d1a2008-11-13 22:59:24 +0000237 $sql = $this->_rename_table($table_name, $new_table_name);
238 return $this->db->query($sql);
239 }
240
241 // --------------------------------------------------------------------
242
243 /**
244 * Column Add
245 *
246 * @access public
247 * @param string the table name
248 * @param string the column name
249 * @param string the column definition
250 * @return bool
251 */
252 function add_column($table = '', $field = array(), $after_field = '')
253 {
254 if ($table == '')
255 {
256 show_error('A table name is required for that operation.');
257 }
258
259 // add field info into field array, but we can only do one at a time
Robin Sowell8a54ef22009-03-04 14:49:53 +0000260 // so we cycle through
Derek Allard2067d1a2008-11-13 22:59:24 +0000261
Barry Mienydd671972010-10-04 16:33:58 +0200262 foreach ($field as $k => $v)
263 {
264 $this->add_field(array($k => $field[$k]));
Robin Sowell8a54ef22009-03-04 14:49:53 +0000265
266 if (count($this->fields) == 0)
Barry Mienydd671972010-10-04 16:33:58 +0200267 {
Robin Sowell8a54ef22009-03-04 14:49:53 +0000268 show_error('Field information is required.');
269 }
Barry Mienydd671972010-10-04 16:33:58 +0200270
Robin Sowell8a54ef22009-03-04 14:49:53 +0000271 $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);
272
273 $this->_reset();
Barry Mienydd671972010-10-04 16:33:58 +0200274
Robin Sowell8a54ef22009-03-04 14:49:53 +0000275 if ($this->db->query($sql) === FALSE)
276 {
277 return FALSE;
278 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000279 }
Barry Mienydd671972010-10-04 16:33:58 +0200280
Robin Sowell8a54ef22009-03-04 14:49:53 +0000281 return TRUE;
Derek Jones30b35eb2010-03-02 17:25:41 -0600282
Derek Allard2067d1a2008-11-13 22:59:24 +0000283 }
284
285 // --------------------------------------------------------------------
286
287 /**
288 * Column Drop
289 *
290 * @access public
291 * @param string the table name
292 * @param string the column name
293 * @return bool
294 */
295 function drop_column($table = '', $column_name = '')
296 {
Barry Mienydd671972010-10-04 16:33:58 +0200297
Derek Allard2067d1a2008-11-13 22:59:24 +0000298 if ($table == '')
299 {
300 show_error('A table name is required for that operation.');
301 }
302
303 if ($column_name == '')
304 {
305 show_error('A column name is required for that operation.');
306 }
307
308 $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);
Barry Mienydd671972010-10-04 16:33:58 +0200309
Derek Allard2067d1a2008-11-13 22:59:24 +0000310 return $this->db->query($sql);
311 }
312
313 // --------------------------------------------------------------------
314
315 /**
316 * Column Modify
317 *
318 * @access public
319 * @param string the table name
320 * @param string the column name
321 * @param string the column definition
322 * @return bool
323 */
324 function modify_column($table = '', $field = array())
325 {
326 if ($table == '')
327 {
328 show_error('A table name is required for that operation.');
329 }
330
331 // add field info into field array, but we can only do one at a time
Robin Sowell8a54ef22009-03-04 14:49:53 +0000332 // so we cycle through
Derek Allard2067d1a2008-11-13 22:59:24 +0000333
Robin Sowell8a54ef22009-03-04 14:49:53 +0000334 foreach ($field as $k => $v)
335 {
Phil Sturgeona58ecae2010-12-15 10:32:10 +0000336 // If no name provided, use the current name
337 if ( ! isset($field[$k]['name']))
338 {
339 $field[$k]['name'] = $k;
340 }
341
Robin Sowell8a54ef22009-03-04 14:49:53 +0000342 $this->add_field(array($k => $field[$k]));
343
344 if (count($this->fields) == 0)
Barry Mienydd671972010-10-04 16:33:58 +0200345 {
Robin Sowell8a54ef22009-03-04 14:49:53 +0000346 show_error('Field information is required.');
347 }
Barry Mienydd671972010-10-04 16:33:58 +0200348
Robin Sowell8a54ef22009-03-04 14:49:53 +0000349 $sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);
350
351 $this->_reset();
Barry Mienydd671972010-10-04 16:33:58 +0200352
Robin Sowell8a54ef22009-03-04 14:49:53 +0000353 if ($this->db->query($sql) === FALSE)
354 {
355 return FALSE;
356 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000357 }
Barry Mienydd671972010-10-04 16:33:58 +0200358
Robin Sowell8a54ef22009-03-04 14:49:53 +0000359 return TRUE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000360 }
361
362 // --------------------------------------------------------------------
363
364 /**
365 * Reset
366 *
367 * Resets table creation vars
368 *
369 * @access private
370 * @return void
371 */
372 function _reset()
373 {
Barry Mienydd671972010-10-04 16:33:58 +0200374 $this->fields = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000375 $this->keys = array();
Barry Mienydd671972010-10-04 16:33:58 +0200376 $this->primary_keys = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000377 }
378
379}
380
381/* End of file DB_forge.php */
Derek Jonesa3ffbbb2008-05-11 18:18:29 +0000382/* Location: ./system/database/DB_forge.php */