<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**

 * Code Igniter

 *

 * An open source application development framework for PHP 5.1.6 or newer

 *

 * @package		CodeIgniter

 * @author		ExpressionEngine Dev Team

 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.

 * @license		http://codeigniter.com/user_guide/license.html

 * @link		http://codeigniter.com

 * @since		Version 1.0

 * @filesource

 */



// ------------------------------------------------------------------------



/**

 * Database Utility Class

 *

 * @category	Database

 * @author		ExpressionEngine Dev Team

 * @link		http://codeigniter.com/user_guide/database/

 */

class CI_DB_forge {



	var $fields			= array();

	var $keys			= array();

	var $primary_keys	= array();

	var $db_char_set	=	'';



	/**

	 * Constructor

	 *

	 * Grabs the CI super object instance so we can access it.

	 *

	 */

	function __construct()

	{

		// Assign the main database object to $this->db

		$CI =& get_instance();

		$this->db =& $CI->db;

		log_message('debug', "Database Forge Class Initialized");

	}



	// --------------------------------------------------------------------



	/**

	 * Create database

	 *

	 * @access	public

	 * @param	string	the database name

	 * @return	bool

	 */

	function create_database($db_name)

	{

		$sql = $this->_create_database($db_name);



		if (is_bool($sql))

		{

			return $sql;

		}



		return $this->db->query($sql);

	}



	// --------------------------------------------------------------------



	/**

	 * Drop database

	 *

	 * @access	public

	 * @param	string	the database name

	 * @return	bool

	 */

	function drop_database($db_name)

	{

		$sql = $this->_drop_database($db_name);



		if (is_bool($sql))

		{

			return $sql;

		}



		return $this->db->query($sql);

	}



	// --------------------------------------------------------------------



	/**

	 * Add Key

	 *

	 * @access	public

	 * @param	string	key

	 * @param	string	type

	 * @return	void

	 */

	function add_key($key = '', $primary = FALSE)

	{

		if (is_array($key))

		{

			foreach ($key as $one)

			{

				$this->add_key($one, $primary);

			}



			return;

		}



		if ($key == '')

		{

			show_error('Key information is required for that operation.');

		}



		if ($primary === TRUE)

		{

			$this->primary_keys[] = $key;

		}

		else

		{

			$this->keys[] = $key;

		}

	}



	// --------------------------------------------------------------------



	/**

	 * Add Field

	 *

	 * @access	public

	 * @param	string	collation

	 * @return	void

	 */

	function add_field($field = '')

	{

		if ($field == '')

		{

			show_error('Field information is required.');

		}



		if (is_string($field))

		{

			if ($field == 'id')

			{

				$this->add_field(array(

										'id' => array(

													'type' => 'INT',

													'constraint' => 9,

													'auto_increment' => TRUE

													)

								));

				$this->add_key('id', TRUE);

			}

			else

			{

				if (strpos($field, ' ') === FALSE)

				{

					show_error('Field information is required for that operation.');

				}



				$this->fields[] = $field;

			}

		}



		if (is_array($field))

		{

			$this->fields = array_merge($this->fields, $field);

		}



	}



	// --------------------------------------------------------------------



	/**

	 * Create Table

	 *

	 * @access	public

	 * @param	string	the table name

	 * @return	bool

	 */

	function create_table($table = '', $if_not_exists = FALSE)

	{

		if ($table == '')

		{

			show_error('A table name is required for that operation.');

		}



		if (count($this->fields) == 0)

		{

			show_error('Field information is required.');

		}



		$sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);



		$this->_reset();

		return $this->db->query($sql);

	}



	// --------------------------------------------------------------------



	/**

	 * Drop Table

	 *

	 * @access	public

	 * @param	string	the table name

	 * @return	bool

	 */

	function drop_table($table_name)

	{

		$sql = $this->_drop_table($this->db->dbprefix.$table_name);



		if (is_bool($sql))

		{

			return $sql;

		}



		return $this->db->query($sql);

	}



	// --------------------------------------------------------------------



	/**

	 * Rename Table

	 *

	 * @access	public

	 * @param	string	the old table name

	 * @param	string	the new table name

	 * @return	bool

	 */

	function rename_table($table_name, $new_table_name)

	{

		if ($table_name == '' OR $new_table_name == '')

		{

			show_error('A table name is required for that operation.');

		}



		$sql = $this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name);

		return $this->db->query($sql);

	}



	// --------------------------------------------------------------------



	/**

	 * Column Add

	 *

	 * @access	public

	 * @param	string	the table name

	 * @param	string	the column name

	 * @param	string	the column definition

	 * @return	bool

	 */

	function add_column($table = '', $field = array(), $after_field = '')

	{

		if ($table == '')

		{

			show_error('A table name is required for that operation.');

		}



		// add field info into field array, but we can only do one at a time

		// so we cycle through



		foreach ($field as $k => $v)

		{

			$this->add_field(array($k => $field[$k]));



			if (count($this->fields) == 0)

			{

				show_error('Field information is required.');

			}



			$sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);



			$this->_reset();



			if ($this->db->query($sql) === FALSE)

			{

				return FALSE;

			}

		}



		return TRUE;



	}



	// --------------------------------------------------------------------



	/**

	 * Column Drop

	 *

	 * @access	public

	 * @param	string	the table name

	 * @param	string	the column name

	 * @return	bool

	 */

	function drop_column($table = '', $column_name = '')

	{



		if ($table == '')

		{

			show_error('A table name is required for that operation.');

		}



		if ($column_name == '')

		{

			show_error('A column name is required for that operation.');

		}



		$sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);



		return $this->db->query($sql);

	}



	// --------------------------------------------------------------------



	/**

	 * Column Modify

	 *

	 * @access	public

	 * @param	string	the table name

	 * @param	string	the column name

	 * @param	string	the column definition

	 * @return	bool

	 */

	function modify_column($table = '', $field = array())

	{

		if ($table == '')

		{

			show_error('A table name is required for that operation.');

		}



		// add field info into field array, but we can only do one at a time

		// so we cycle through



		foreach ($field as $k => $v)

		{

			// If no name provided, use the current name

			if ( ! isset($field[$k]['name']))

			{

				$field[$k]['name'] = $k;

			}



			$this->add_field(array($k => $field[$k]));



			if (count($this->fields) == 0)

			{

				show_error('Field information is required.');

			}



			$sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);



			$this->_reset();



			if ($this->db->query($sql) === FALSE)

			{

				return FALSE;

			}

		}



		return TRUE;

	}



	// --------------------------------------------------------------------



	/**

	 * Reset

	 *

	 * Resets table creation vars

	 *

	 * @access	private

	 * @return	void

	 */

	function _reset()

	{

		$this->fields		= array();

		$this->keys			= array();

		$this->primary_keys	= array();

	}



}



/* End of file DB_forge.php */

/* Location: ./system/database/DB_forge.php */