blob: 1aa2334ea8f3d6a86d5e5b6aa4ab59e9238da8c3 [file] [log] [blame]
Derek Jones4b9c6292011-07-01 17:40:48 -05001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
Derek Jonesf4a4bd82011-10-20 12:18:42 -05003 * CodeIgniter
Derek Allard2067d1a2008-11-13 22:59:24 +00004 *
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 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
8 *
9 * Licensed under the Open Software License version 3.0
10 *
11 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
18 *
Derek Allard2067d1a2008-11-13 22:59:24 +000019 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
21 * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. (http://ellislab.com/)
22 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Allard2067d1a2008-11-13 22:59:24 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
27
28// ------------------------------------------------------------------------
29
30/**
31 * Database Utility Class
32 *
33 * @category Database
Derek Jonesf4a4bd82011-10-20 12:18:42 -050034 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000035 * @link http://codeigniter.com/user_guide/database/
36 */
37class CI_DB_forge {
38
Barry Mienydd671972010-10-04 16:33:58 +020039 var $fields = array();
Derek Allard2067d1a2008-11-13 22:59:24 +000040 var $keys = array();
Barry Mienydd671972010-10-04 16:33:58 +020041 var $primary_keys = array();
Derek Allard2067d1a2008-11-13 22:59:24 +000042 var $db_char_set = '';
43
44 /**
45 * Constructor
46 *
47 * Grabs the CI super object instance so we can access it.
48 *
Barry Mienydd671972010-10-04 16:33:58 +020049 */
Timothy Warrena2097a02011-10-10 10:10:46 -040050 function __construct()
Derek Allard2067d1a2008-11-13 22:59:24 +000051 {
52 // Assign the main database object to $this->db
53 $CI =& get_instance();
54 $this->db =& $CI->db;
55 log_message('debug', "Database Forge Class Initialized");
56 }
57
58 // --------------------------------------------------------------------
59
60 /**
61 * Create database
62 *
63 * @access public
64 * @param string the database name
65 * @return bool
66 */
67 function create_database($db_name)
68 {
69 $sql = $this->_create_database($db_name);
Barry Mienydd671972010-10-04 16:33:58 +020070
Derek Allard2067d1a2008-11-13 22:59:24 +000071 if (is_bool($sql))
72 {
73 return $sql;
74 }
Barry Mienydd671972010-10-04 16:33:58 +020075
Derek Allard2067d1a2008-11-13 22:59:24 +000076 return $this->db->query($sql);
77 }
78
79 // --------------------------------------------------------------------
80
81 /**
82 * Drop database
83 *
84 * @access public
85 * @param string the database name
86 * @return bool
87 */
88 function drop_database($db_name)
89 {
90 $sql = $this->_drop_database($db_name);
Barry Mienydd671972010-10-04 16:33:58 +020091
Derek Allard2067d1a2008-11-13 22:59:24 +000092 if (is_bool($sql))
93 {
94 return $sql;
95 }
Barry Mienydd671972010-10-04 16:33:58 +020096
Derek Allard2067d1a2008-11-13 22:59:24 +000097 return $this->db->query($sql);
98 }
99
100 // --------------------------------------------------------------------
101
102 /**
103 * Add Key
104 *
105 * @access public
106 * @param string key
107 * @param string type
108 * @return void
109 */
110 function add_key($key = '', $primary = FALSE)
111 {
112 if (is_array($key))
113 {
Pascal Krietec3a4a8d2011-02-14 13:40:08 -0500114 foreach ($key as $one)
Derek Allard2067d1a2008-11-13 22:59:24 +0000115 {
116 $this->add_key($one, $primary);
117 }
Barry Mienydd671972010-10-04 16:33:58 +0200118
Derek Allard2067d1a2008-11-13 22:59:24 +0000119 return;
120 }
Barry Mienydd671972010-10-04 16:33:58 +0200121
Derek Allard2067d1a2008-11-13 22:59:24 +0000122 if ($key == '')
123 {
124 show_error('Key information is required for that operation.');
125 }
Barry Mienydd671972010-10-04 16:33:58 +0200126
Derek Allard2067d1a2008-11-13 22:59:24 +0000127 if ($primary === TRUE)
128 {
129 $this->primary_keys[] = $key;
130 }
131 else
132 {
133 $this->keys[] = $key;
134 }
135 }
136
137 // --------------------------------------------------------------------
138
139 /**
140 * Add Field
141 *
142 * @access public
143 * @param string collation
144 * @return void
145 */
146 function add_field($field = '')
147 {
148 if ($field == '')
149 {
150 show_error('Field information is required.');
151 }
Barry Mienydd671972010-10-04 16:33:58 +0200152
Derek Allard2067d1a2008-11-13 22:59:24 +0000153 if (is_string($field))
154 {
155 if ($field == 'id')
156 {
157 $this->add_field(array(
158 'id' => array(
159 'type' => 'INT',
160 'constraint' => 9,
161 'auto_increment' => TRUE
162 )
163 ));
164 $this->add_key('id', TRUE);
165 }
166 else
167 {
168 if (strpos($field, ' ') === FALSE)
169 {
170 show_error('Field information is required for that operation.');
171 }
Barry Mienydd671972010-10-04 16:33:58 +0200172
Derek Allard2067d1a2008-11-13 22:59:24 +0000173 $this->fields[] = $field;
174 }
175 }
Barry Mienydd671972010-10-04 16:33:58 +0200176
Derek Allard2067d1a2008-11-13 22:59:24 +0000177 if (is_array($field))
178 {
179 $this->fields = array_merge($this->fields, $field);
180 }
Barry Mienydd671972010-10-04 16:33:58 +0200181
Derek Allard2067d1a2008-11-13 22:59:24 +0000182 }
183
184 // --------------------------------------------------------------------
185
186 /**
187 * Create Table
188 *
189 * @access public
190 * @param string the table name
191 * @return bool
192 */
193 function create_table($table = '', $if_not_exists = FALSE)
Barry Mienydd671972010-10-04 16:33:58 +0200194 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000195 if ($table == '')
196 {
197 show_error('A table name is required for that operation.');
198 }
Barry Mienydd671972010-10-04 16:33:58 +0200199
Derek Allard2067d1a2008-11-13 22:59:24 +0000200 if (count($this->fields) == 0)
Barry Mienydd671972010-10-04 16:33:58 +0200201 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000202 show_error('Field information is required.');
203 }
204
205 $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 +0200206
Derek Allard2067d1a2008-11-13 22:59:24 +0000207 $this->_reset();
208 return $this->db->query($sql);
209 }
210
211 // --------------------------------------------------------------------
212
213 /**
214 * Drop Table
215 *
216 * @access public
217 * @param string the table name
218 * @return bool
219 */
220 function drop_table($table_name)
221 {
222 $sql = $this->_drop_table($this->db->dbprefix.$table_name);
Barry Mienydd671972010-10-04 16:33:58 +0200223
Derek Allard2067d1a2008-11-13 22:59:24 +0000224 if (is_bool($sql))
225 {
226 return $sql;
227 }
Barry Mienydd671972010-10-04 16:33:58 +0200228
Derek Allard2067d1a2008-11-13 22:59:24 +0000229 return $this->db->query($sql);
230 }
231
232 // --------------------------------------------------------------------
233
234 /**
235 * Rename Table
236 *
237 * @access public
238 * @param string the old table name
239 * @param string the new table name
240 * @return bool
241 */
242 function rename_table($table_name, $new_table_name)
243 {
244 if ($table_name == '' OR $new_table_name == '')
245 {
246 show_error('A table name is required for that operation.');
247 }
Barry Mienydd671972010-10-04 16:33:58 +0200248
Zac Wasielewski0acf65a2011-07-15 22:23:18 -0400249 $sql = $this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name);
Derek Allard2067d1a2008-11-13 22:59:24 +0000250 return $this->db->query($sql);
251 }
252
253 // --------------------------------------------------------------------
254
255 /**
256 * Column Add
257 *
258 * @access public
259 * @param string the table name
260 * @param string the column name
261 * @param string the column definition
262 * @return bool
263 */
264 function add_column($table = '', $field = array(), $after_field = '')
265 {
266 if ($table == '')
267 {
268 show_error('A table name is required for that operation.');
269 }
270
271 // add field info into field array, but we can only do one at a time
Robin Sowell8a54ef22009-03-04 14:49:53 +0000272 // so we cycle through
Derek Allard2067d1a2008-11-13 22:59:24 +0000273
Barry Mienydd671972010-10-04 16:33:58 +0200274 foreach ($field as $k => $v)
275 {
276 $this->add_field(array($k => $field[$k]));
Robin Sowell8a54ef22009-03-04 14:49:53 +0000277
278 if (count($this->fields) == 0)
Barry Mienydd671972010-10-04 16:33:58 +0200279 {
Robin Sowell8a54ef22009-03-04 14:49:53 +0000280 show_error('Field information is required.');
281 }
Barry Mienydd671972010-10-04 16:33:58 +0200282
Robin Sowell8a54ef22009-03-04 14:49:53 +0000283 $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);
284
285 $this->_reset();
Barry Mienydd671972010-10-04 16:33:58 +0200286
Robin Sowell8a54ef22009-03-04 14:49:53 +0000287 if ($this->db->query($sql) === FALSE)
288 {
289 return FALSE;
290 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000291 }
Barry Mienydd671972010-10-04 16:33:58 +0200292
Robin Sowell8a54ef22009-03-04 14:49:53 +0000293 return TRUE;
Derek Jones30b35eb2010-03-02 17:25:41 -0600294
Derek Allard2067d1a2008-11-13 22:59:24 +0000295 }
296
297 // --------------------------------------------------------------------
298
299 /**
300 * Column Drop
301 *
302 * @access public
303 * @param string the table name
304 * @param string the column name
305 * @return bool
306 */
307 function drop_column($table = '', $column_name = '')
308 {
Barry Mienydd671972010-10-04 16:33:58 +0200309
Derek Allard2067d1a2008-11-13 22:59:24 +0000310 if ($table == '')
311 {
312 show_error('A table name is required for that operation.');
313 }
314
315 if ($column_name == '')
316 {
317 show_error('A column name is required for that operation.');
318 }
319
320 $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);
Barry Mienydd671972010-10-04 16:33:58 +0200321
Derek Allard2067d1a2008-11-13 22:59:24 +0000322 return $this->db->query($sql);
323 }
324
325 // --------------------------------------------------------------------
326
327 /**
328 * Column Modify
329 *
330 * @access public
331 * @param string the table name
332 * @param string the column name
333 * @param string the column definition
334 * @return bool
335 */
336 function modify_column($table = '', $field = array())
337 {
338 if ($table == '')
339 {
340 show_error('A table name is required for that operation.');
341 }
342
343 // add field info into field array, but we can only do one at a time
Robin Sowell8a54ef22009-03-04 14:49:53 +0000344 // so we cycle through
Derek Allard2067d1a2008-11-13 22:59:24 +0000345
Robin Sowell8a54ef22009-03-04 14:49:53 +0000346 foreach ($field as $k => $v)
347 {
Phil Sturgeona58ecae2010-12-15 10:32:10 +0000348 // If no name provided, use the current name
349 if ( ! isset($field[$k]['name']))
350 {
351 $field[$k]['name'] = $k;
352 }
353
Robin Sowell8a54ef22009-03-04 14:49:53 +0000354 $this->add_field(array($k => $field[$k]));
355
356 if (count($this->fields) == 0)
Barry Mienydd671972010-10-04 16:33:58 +0200357 {
Robin Sowell8a54ef22009-03-04 14:49:53 +0000358 show_error('Field information is required.');
359 }
Barry Mienydd671972010-10-04 16:33:58 +0200360
Robin Sowell8a54ef22009-03-04 14:49:53 +0000361 $sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);
362
363 $this->_reset();
Barry Mienydd671972010-10-04 16:33:58 +0200364
Robin Sowell8a54ef22009-03-04 14:49:53 +0000365 if ($this->db->query($sql) === FALSE)
366 {
367 return FALSE;
368 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000369 }
Barry Mienydd671972010-10-04 16:33:58 +0200370
Robin Sowell8a54ef22009-03-04 14:49:53 +0000371 return TRUE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000372 }
373
374 // --------------------------------------------------------------------
375
376 /**
377 * Reset
378 *
379 * Resets table creation vars
380 *
381 * @access private
382 * @return void
383 */
384 function _reset()
385 {
Barry Mienydd671972010-10-04 16:33:58 +0200386 $this->fields = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000387 $this->keys = array();
Barry Mienydd671972010-10-04 16:33:58 +0200388 $this->primary_keys = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000389 }
390
391}
392
393/* End of file DB_forge.php */
Derek Jonesa3ffbbb2008-05-11 18:18:29 +0000394/* Location: ./system/database/DB_forge.php */