牛骨文教育服务平台(让学习变的简单)
<?php  if ( ! defined("BASEPATH")) exit("No direct script access allowed");
/**
 * CodeIgniter
 *
 * 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
 */

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

/**
 * Initialize the database
 * 初始化数据库类 
 *
 * @category	Database
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/database/
 * @param 	string
 * @param 	bool	Determines if active record should be used or not
 */
function &DB($params = "", $active_record_override = NULL)
{
	// Load the DB config file if a DSN string wasn"t passed
	// 如果没有传递过来DSN参数的话,载入DB配置文件
	if (is_string($params) AND strpos($params, "://") === FALSE)
	{
		// Is the config file in the environment folder?
		// 是否配置文件在配置的环境文件夹中
		if ( ! defined("ENVIRONMENT") OR ! file_exists($file_path = APPPATH."config/".ENVIRONMENT."/database.php"))
		{
			// 如果环境变量中没有database.php 则报错
			if ( ! file_exists($file_path = APPPATH."config/database.php"))
			{
				show_error("The configuration file database.php does not exist.");
			}
		}

		include($file_path);

		// 不存在数据库的配置
		if ( ! isset($db) OR count($db) == 0)
		{
			show_error("No database connection settings were found in the database config file.");
		}

		if ($params != "")
		{
			$active_group = $params;
		}

		if ( ! isset($active_group) OR ! isset($db[$active_group]))
		{
			show_error("You have specified an invalid database connection group.");
		}

		$params = $db[$active_group];
	}
	elseif (is_string($params))
	{

		/*  parse the URL from the DSN string
		 *  使用parse_url解析DSN
		 *  Database settings can be passed as discreet
		 *  parameters or as a data source name in the first
		 *  数据库配置可以作为参数或者是在第一个参数中作为数据源名称传递过来
		 *  parameter. DSNs must have this prototype:
		 *  DSN必须有这个原型:
		 *  $dsn = "driver://username:password@hostname/database";
		 */
		
		// parse_url() 解析 URL,返回其组成部分
		if (($dns = @parse_url($params)) === FALSE)
		{
			show_error("Invalid DB Connection String");
		}

		// rawurldecode()已编码的 URL 字符串进行解码
		$params = array(
							"dbdriver"	=> $dns["scheme"],
							"hostname"	=> (isset($dns["host"])) ? rawurldecode($dns["host"]) : "",
							"username"	=> (isset($dns["user"])) ? rawurldecode($dns["user"]) : "",
							"password"	=> (isset($dns["pass"])) ? rawurldecode($dns["pass"]) : "",
							"database"	=> (isset($dns["path"])) ? rawurldecode(substr($dns["path"], 1)) : ""
						);

		// were additional config items set?
		// 是否设置了额外的配置项
		if (isset($dns["query"]))
		{
			// parse_str()解析查询字符串到变量中
			parse_str($dns["query"], $extra);

			foreach ($extra as $key => $val)
			{
				// booleans please
				// 把字符串转换true,false转换为真正boolean值
				if (strtoupper($val) == "TRUE")
				{
					$val = TRUE;
				}
				elseif (strtoupper($val) == "FALSE")
				{
					$val = FALSE;
				}

				$params[$key] = $val;
			}
		}
	}

	// No DB specified yet?  Beat them senseless...
	// 没有指定要连接的数据库驱动
	if ( ! isset($params["dbdriver"]) OR $params["dbdriver"] == "")
	{
		show_error("You have not selected a database type to connect to.");
	}

	// Load the DB classes.  Note: Since the active record class is optional
	// we need to dynamically create a class that extends proper parent class
	// based on whether we"re using the active record class or not.
	// Kudos to Paul for discovering this clever use of eval()
	// 载入DB类。 注意: 因为active record类是可选的,我们需要动态的去
	// 创建一个继承适当的父类(基于我们是否使用active record类)

	if ($active_record_override !== NULL)
	{
		$active_record = $active_record_override;
	}

	require_once(BASEPATH."database/DB_driver.php");

	// 启用active_record
	if ( ! isset($active_record) OR $active_record == TRUE)
	{
		require_once(BASEPATH."database/DB_active_rec.php");

		// 动态创建CI_DB类继承自CI_DB_active_record类
		if ( ! class_exists("CI_DB"))
		{
			eval("class CI_DB extends CI_DB_active_record { }");
		}
	}
	else
	{
		// 动态创建CI_DB直接继承自CI_DB_driver
		if ( ! class_exists("CI_DB"))
		{
			eval("class CI_DB extends CI_DB_driver { }");
		}
	}

	// 加载响应的数据库驱动
	require_once(BASEPATH."database/drivers/".$params["dbdriver"]."/".$params["dbdriver"]."_driver.php");

	// Instantiate the DB adapter
	// 实例化DB适配器
	$driver = "CI_DB_".$params["dbdriver"]."_driver";
	$DB = new $driver($params);

	// 在DB_driver中的字段,用于指定是否要对数据库驱动进行初始化操作
	if ($DB->autoinit == TRUE)
	{
		$DB->initialize();
	}

	if (isset($params["stricton"]) && $params["stricton"] == TRUE)
	{
		$DB->query("SET SESSION sql_mode="STRICT_ALL_TABLES"");
	}

	return $DB;
}

/* End of file DB.php */
/* Location: ./system/database/DB.php */