blob: c74fa40683a421e0159befc7d6f195d27980d9bd [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 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000105 * @param string key
106 * @param string type
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000107 * @return object
Derek Allard2067d1a2008-11-13 22:59:24 +0000108 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000109 public function add_key($key = '', $primary = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000110 {
111 if (is_array($key))
112 {
Pascal Krietec3a4a8d2011-02-14 13:40:08 -0500113 foreach ($key as $one)
Derek Allard2067d1a2008-11-13 22:59:24 +0000114 {
115 $this->add_key($one, $primary);
116 }
Barry Mienydd671972010-10-04 16:33:58 +0200117
Derek Allard2067d1a2008-11-13 22:59:24 +0000118 return;
119 }
Barry Mienydd671972010-10-04 16:33:58 +0200120
Derek Allard2067d1a2008-11-13 22:59:24 +0000121 if ($key == '')
122 {
123 show_error('Key information is required for that operation.');
124 }
Barry Mienydd671972010-10-04 16:33:58 +0200125
Derek Allard2067d1a2008-11-13 22:59:24 +0000126 if ($primary === TRUE)
127 {
128 $this->primary_keys[] = $key;
129 }
130 else
131 {
132 $this->keys[] = $key;
133 }
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000134
135 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000136 }
137
138 // --------------------------------------------------------------------
139
140 /**
141 * Add Field
142 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000143 * @param string collation
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000144 * @return object
Derek Allard2067d1a2008-11-13 22:59:24 +0000145 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000146 public function add_field($field = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000147 {
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(
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000158 'id' => array(
159 'type' => 'INT',
160 'constraint' => 9,
161 'auto_increment' => TRUE
162 )
163 ));
Derek Allard2067d1a2008-11-13 22:59:24 +0000164 $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 }
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000181
182 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000183 }
184
185 // --------------------------------------------------------------------
186
187 /**
188 * Create Table
189 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000190 * @param string the table name
191 * @return bool
192 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000193 public 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();
Tomasz Tb9ec4022011-12-05 15:28:33 +0100208
209 if (is_bool($sql))
210 {
211 return $sql;
212 }
213
Derek Allard2067d1a2008-11-13 22:59:24 +0000214 return $this->db->query($sql);
215 }
216
217 // --------------------------------------------------------------------
218
219 /**
220 * Drop Table
221 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000222 * @param string the table name
223 * @return bool
224 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000225 public function drop_table($table_name)
Derek Allard2067d1a2008-11-13 22:59:24 +0000226 {
227 $sql = $this->_drop_table($this->db->dbprefix.$table_name);
Barry Mienydd671972010-10-04 16:33:58 +0200228
Derek Allard2067d1a2008-11-13 22:59:24 +0000229 if (is_bool($sql))
230 {
231 return $sql;
232 }
Barry Mienydd671972010-10-04 16:33:58 +0200233
Derek Allard2067d1a2008-11-13 22:59:24 +0000234 return $this->db->query($sql);
235 }
236
237 // --------------------------------------------------------------------
238
239 /**
240 * Rename Table
241 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000242 * @param string the old table name
243 * @param string the new table name
244 * @return bool
245 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000246 public function rename_table($table_name, $new_table_name)
Derek Allard2067d1a2008-11-13 22:59:24 +0000247 {
248 if ($table_name == '' OR $new_table_name == '')
249 {
250 show_error('A table name is required for that operation.');
251 }
Barry Mienydd671972010-10-04 16:33:58 +0200252
Zac Wasielewski0acf65a2011-07-15 22:23:18 -0400253 $sql = $this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name);
Derek Allard2067d1a2008-11-13 22:59:24 +0000254 return $this->db->query($sql);
255 }
256
257 // --------------------------------------------------------------------
258
259 /**
260 * Column Add
261 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000262 * @param string the table name
263 * @param string the column name
264 * @param string the column definition
265 * @return bool
266 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000267 public function add_column($table = '', $field = array(), $after_field = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000268 {
269 if ($table == '')
270 {
271 show_error('A table name is required for that operation.');
272 }
273
274 // add field info into field array, but we can only do one at a time
Robin Sowell8a54ef22009-03-04 14:49:53 +0000275 // so we cycle through
Derek Allard2067d1a2008-11-13 22:59:24 +0000276
Barry Mienydd671972010-10-04 16:33:58 +0200277 foreach ($field as $k => $v)
278 {
279 $this->add_field(array($k => $field[$k]));
Robin Sowell8a54ef22009-03-04 14:49:53 +0000280
281 if (count($this->fields) == 0)
Barry Mienydd671972010-10-04 16:33:58 +0200282 {
Robin Sowell8a54ef22009-03-04 14:49:53 +0000283 show_error('Field information is required.');
284 }
Barry Mienydd671972010-10-04 16:33:58 +0200285
Robin Sowell8a54ef22009-03-04 14:49:53 +0000286 $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);
287
288 $this->_reset();
Barry Mienydd671972010-10-04 16:33:58 +0200289
Robin Sowell8a54ef22009-03-04 14:49:53 +0000290 if ($this->db->query($sql) === FALSE)
291 {
292 return FALSE;
293 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000294 }
Barry Mienydd671972010-10-04 16:33:58 +0200295
Robin Sowell8a54ef22009-03-04 14:49:53 +0000296 return TRUE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000297 }
298
299 // --------------------------------------------------------------------
300
301 /**
302 * Column Drop
303 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000304 * @param string the table name
305 * @param string the column name
306 * @return bool
307 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000308 public function drop_column($table = '', $column_name = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000309 {
Barry Mienydd671972010-10-04 16:33:58 +0200310
Derek Allard2067d1a2008-11-13 22:59:24 +0000311 if ($table == '')
312 {
313 show_error('A table name is required for that operation.');
314 }
315
316 if ($column_name == '')
317 {
318 show_error('A column name is required for that operation.');
319 }
320
321 $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);
Barry Mienydd671972010-10-04 16:33:58 +0200322
Derek Allard2067d1a2008-11-13 22:59:24 +0000323 return $this->db->query($sql);
324 }
325
326 // --------------------------------------------------------------------
327
328 /**
329 * Column Modify
330 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000331 * @param string the table name
332 * @param string the column name
333 * @param string the column definition
334 * @return bool
335 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000336 public function modify_column($table = '', $field = array())
Derek Allard2067d1a2008-11-13 22:59:24 +0000337 {
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 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000381 * @return void
382 */
Phil Sturgeona7de97e2011-12-31 18:41:08 +0000383 protected function _reset()
Derek Allard2067d1a2008-11-13 22:59:24 +0000384 {
Barry Mienydd671972010-10-04 16:33:58 +0200385 $this->fields = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000386 $this->keys = array();
Barry Mienydd671972010-10-04 16:33:58 +0200387 $this->primary_keys = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000388 }
389
390}
391
392/* End of file DB_forge.php */
Derek Jonesa3ffbbb2008-05-11 18:18:29 +0000393/* Location: ./system/database/DB_forge.php */