_utf = $this->hasUTF();
//Set charactersets (needed for MySQL 4.1.2+)
if ($this->_utf){
$this->setUTF();
}
$this->_table_prefix = $prefix;
$this->_ticker = 0;
$this->_errorNum = 0;
$this->_log = array();
$this->_quoted = array();
$this->_hasQuoted = false;
// Register faked "destructor" in PHP4 to close all connections we might have made
if (version_compare(PHP_VERSION, '5') == -1) {
register_shutdown_function(array(&$this, '__destruct'));
}
}
/**
* Returns a reference to the global Database object, only creating it
* if it doesn't already exist.
*
* @param string Database driver
* @param string Database host
* @param string Database user name
* @param string Database user password
* @param string Database name
* @param string Common prefix for all tables
* @return JDatabase A database object
* @since 1.5
*/
function &getInstance( $options = array() )
{
static $instances;
if (!isset( $instances )) {
$instances = array();
}
$signature = serialize( $options );
if (empty($instances[$signature]))
{
$driver = array_key_exists('driver', $options) ? $options['driver'] : 'mysql';
$select = array_key_exists('select', $options) ? $options['select'] : true;
$database = array_key_exists('database', $options) ? $options['database'] : null;
$driver = preg_replace('/[^A-Z0-9_\.-]/i', '', $driver);
$path = JPATH_LIBRARIES.DS.'joomla'.DS.'database'.DS.'database'.DS.$driver.'.php';
if (file_exists($path)) {
$path = "joomla.database.database.$driver";
jimport( $path );
} else {
$error = new JException( E_ERROR, 500, 'Unable to load Database Driver: '.$driver);
return $error;
//die('Unable to load Database Driver: '.$driver);
}
$adapter = 'JDatabase'.$driver;
$instance = new $adapter($options);
if ( $error = $instance->getErrorMsg() )
{
$error = new JException( E_ERROR, 500, 'Unable to connect to the database: '.$error);
return $error;
//die('Unable to connect to the database: '.$error);
}
$instances[$signature] = & $instance;
}
return $instances[$signature];
}
/**
* Database object destructor
*
* @abstract
* @access private
* @return boolean
* @since 1.5
*/
function __destruct()
{
return true;
}
/**
* Get the database connectors
*
* @access public
* @return array An array of available session handlers
*/
function getConnectors()
{
jimport('joomla.filesystem.folder');
$handlers = JFolder::files(dirname(__FILE__).DS.'database', '.php$');
$names = array();
foreach($handlers as $handler)
{
$name = substr($handler, 0, strrpos($handler, '.'));
jimport('joomla.database.database.'.$name);
$class = 'JDatabase'.ucfirst($name);
if(call_user_func_array( array( trim($class), 'test' ), null)) {
$names[] = $name;
}
}
return $names;
}
/**
* Test to see if the MySQLi connector is available
*
* @static
* @access public
* @return boolean True on success, false otherwise.
*/
function test()
{
return false;
}
/**
* Determines if the connection to the server is active.
*
* @access public
* @return boolean
* @since 1.5
*/
function connected()
{
return false;
}
/**
* Determines UTF support
*
* @abstract
* @access public
* @return boolean
* @since 1.5
*/
function hasUTF() {
return false;
}
/**
* Custom settings for UTF support
*
* @abstract
* @access public
* @since 1.5
*/
function setUTF() {
}
/**
* Adds a field or array of field names to the list that are to be quoted
*
* @access public
* @param mixed Field name or array of names
* @since 1.5
*/
function addQuoted( $quoted )
{
if (is_string( $quoted )) {
$this->_quoted[] = $quoted;
} else {
$this->_quoted = array_merge( $this->_quoted, (array)$quoted );
}
$this->_hasQuoted = true;
}
/**
* Checks if field name needs to be quoted
*
* @access public
* @param string The field name
* @return bool
*/
function isQuoted( $fieldName )
{
if ($this->_hasQuoted) {
return in_array( $fieldName, $this->_quoted );
} else {
return true;
}
}
/**
* Sets the debug level on or off
*
* @access public
* @param int 0 = off, 1 = on
*/
function debug( $level ) {
$this->_debug = intval( $level );
}
/**
* Get the database UTF-8 support
*
* @access public
* @return boolean
* @since 1.5
*/
function getUTFSupport() {
return $this->_utf;
}
/**
* Get the error number
*
* @access public
* @return int The error number for the most recent query
*/
function getErrorNum() {
return $this->_errorNum;
}
/**
* Get the error message
*
* @access public
* @return string The error message for the most recent query
*/
function getErrorMsg($escaped = false) {
if($escaped) {
return addslashes($this->_errorMsg);
} else {
return $this->_errorMsg;
}
}
/**
* Get a database escaped string
*
* @abstract
* @access public
* @return string
*/
function getEscaped( $text ) {
return;
}
/**
* Quote an identifier name (field, table, etc)
*
* @access public
* @param string The name
* @return string The quoted name
*/
function nameQuote( $s )
{
$q = $this->_nameQuote;
if (strlen( $q ) == 1) {
return $q . $s . $q;
} else {
return $q{0} . $s . $q{1};
}
}
/**
* Get the database table prefix
*
* @access public
* @return string The database prefix
*/
function getPrefix() {
return $this->_table_prefix;
}
/**
* Get the database null date
*
* @access public
* @return string Quoted null/zero date string
*/
function getNullDate() {
return $this->_nullDate;
}
/**
* Sets the SQL query string for later execution.
*
* This function replaces a string identifier $prefix with the
* string held is the _table_prefix class variable.
*
* @access public
* @param string The SQL query
* @param string The offset to start selection
* @param string The number of results to return
* @param string The common table prefix
*/
function setQuery( $sql, $offset = 0, $limit = 0, $prefix='#__' )
{
$this->_sql = $this->replacePrefix( $sql, $prefix );
$this->_limit = (int) $limit;
$this->_offset = (int) $offset;
}
/**
* This function replaces a string identifier $prefix with the
* string held is the _table_prefix class variable.
*
* @access public
* @param string The SQL query
* @param string The common table prefix
*/
function replacePrefix( $sql, $prefix='#__' )
{
$sql = trim( $sql );
$escaped = false;
$quoteChar = '';
$n = strlen( $sql );
$startPos = 0;
$literal = '';
while ($startPos < $n) {
$ip = strpos($sql, $prefix, $startPos);
if ($ip === false) {
break;
}
$j = strpos( $sql, "'", $startPos );
$k = strpos( $sql, '"', $startPos );
if (($k !== FALSE) && (($k < $j) || ($j === FALSE))) {
$quoteChar = '"';
$j = $k;
} else {
$quoteChar = "'";
}
if ($j === false) {
$j = $n;
}
$literal .= str_replace(