Source for file driver.php
Documentation is available at driver.php
* @package Joomla.Platform
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
* Joomla Platform Database Interface
* @package Joomla.Platform
* Test to see if the connector is available.
* @return boolean True on success, false otherwise.
* Joomla Platform Database Driver Class
* @package Joomla.Platform
* @method string q() q($text, $escape = true) Alias for quote method
* @method string qn() qn($name, $as = null) Alias for quoteName method
* The name of the database.
* The name of the database driver.
* @var resource The database connection resource.
* @var integer The number of SQL statements executed by the database driver.
* @var resource The database connection cursor from the last query.
* @var boolean The database driver debugging state.
* @var integer The affected row limit for the current SQL statement.
* @var array The log of executed SQL statements by the database driver.
protected $log =
array();
* @var array The log of executed SQL statements timings (start and stop microtimes) by the database driver.
* @var array The log of executed SQL statements timings (start and stop microtimes) by the database driver.
* @var string The character(s) used to quote SQL statement names such as table names or field names,
* etc. The child classes should define this as necessary. If a single character string the
* same character is used for both sides of the quoted name, else the first character will be
* used for the opening quote and the second for the closing quote.
* @var string The null or zero representation of a timestamp for the database driver. This should be
* defined in child classes to hold the appropriate value for the engine.
* @var integer The affected row offset to apply for the current SQL statement.
* @var array Passed in upon instantiation and saved.
* @var mixed The current SQL statement to execute.
* @var string The common database table prefix.
* @var boolean True if the database engine supports UTF-8 character encoding.
* @var integer The database error number
* @var string The database error message
* @var array JDatabaseDriver instances container.
protected static $instances =
array();
* @var string The minimum supported database version.
protected static $dbMinimum;
* @var integer The depth of the current transaction.
* @var callable[] List of callables to call just before disconnecting database
* Get a list of available database connectors. The list will only be populated with connectors that both
* the class exists and the static test method returns true. This gives us the ability to have a multitude
* of connector classes that are self-aware as to whether or not they are able to be used on a given system.
* @return array An array of available database connectors.
// Get an iterator and loop trough the driver classes.
$iterator =
new DirectoryIterator(__DIR__ .
'/driver');
foreach ($iterator as $file)
$fileName =
$file->getFilename();
// Only load for php files.
// Note: DirectoryIterator::getExtension only available PHP >= 5.3.6
if (!$file->isFile() ||
substr($fileName, strrpos($fileName, '.') +
1) !=
'php')
// Derive the class name from the type.
// If the class doesn't exist we have nothing left to do but look at the next type. We did our best.
// Sweet! Our class exists, so now we just need to know if it passes its test method.
if ($class::isSupported())
// Connector names should not have file extensions.
* Method to return a JDatabaseDriver instance based on the given options. There are three global options and then
* the rest are specific to the database driver. The 'driver' option defines which JDatabaseDriver class is
* used for the connection -- the default is 'mysqli'. The 'database' option determines which database is to
* be used for the connection. The 'select' option determines whether the connector should automatically select
* Instances are unique to the given options and new objects are only created when a unique options array is
* passed into the method. This ensures that we don't end up with unnecessary database connection resources.
* @param array $options Parameters to be passed to the database driver.
* @return JDatabaseDriver A database object.
* @throws RuntimeException
// Sanitize the database connector options.
$options['driver'] =
(isset
($options['driver'])) ?
preg_replace('/[^A-Z0-9_\.-]/i', '', $options['driver']) :
'mysqli';
$options['database'] =
(isset
($options['database'])) ?
$options['database'] :
null;
$options['select'] =
(isset
($options['select'])) ?
$options['select'] :
true;
// Get the options signature for the database connector.
// If we already have a database connector instance for these options then just use that.
if (empty(self::$instances[$signature]))
// Derive the class name from the driver.
$class =
'JDatabaseDriver' .
ucfirst(strtolower($options['driver']));
// If the class still doesn't exist we have nothing left to do but throw an exception. We did our best.
throw
new RuntimeException(sprintf('Unable to load Database Driver: %s', $options['driver']));
// Create our new JDatabaseDriver connector based on the options given.
$instance =
new $class($options);
catch
(RuntimeException $e)
throw
new RuntimeException(sprintf('Unable to connect to the Database: %s', $e->getMessage()));
// Set the new connector to the global instances based on signature.
self::$instances[$signature] =
$instance;
return self::$instances[$signature];
* Splits a string of multiple queries into an array of individual queries.
* @param string $sql Input SQL string with which to split into individual queries.
* @return array The queries from the input string separated into an array.
for ($i =
0; $i <
$end; $i++
)
$current =
substr($sql, $i, 1);
if (($current ==
'"' ||
$current ==
'\''))
while (substr($sql, $i -
$n +
1, 1) ==
'\\' &&
$n <
$i)
if (($current ==
';' &&
!$open) ||
$i ==
$end -
1)
$queries[] =
substr($sql, $start, ($i -
$start +
1));
* Magic method to provide method alias support for quote() and quoteName().
* @param string $method The called method.
* @param array $args The array of arguments passed to the method.
* @return mixed The aliased method's return value or null.
public function __call($method, $args)
return $this->quote($args[0], isset
($args[1]) ?
$args[1] :
true);
return $this->quoteName($args[0], isset
($args[1]) ?
$args[1] :
null);
* @param array $options List of options used to configure the connection
// Initialise object variables.
$this->_database =
(isset
($options['database'])) ?
$options['database'] :
'';
$this->tablePrefix =
(isset
($options['prefix'])) ?
$options['prefix'] :
'jos_';
* Alter database's character set, obtaining query string from protected member.
* @param string $dbName The database name that will be altered
* @return string The query that alter the database query string
* @throws RuntimeException
throw
new RuntimeException('Database name must not be null.');
* Connects to the database if needed.
* @return void Returns void if the database connected successfully.
* @throws RuntimeException
abstract public function connect();
* Determines if the connection to the server is active.
* @return boolean True if connected to the database engine.
* Create a new database using information from $options object, obtaining query string
* @param stdClass $options Object used to pass user and database name to database driver.
* This object must have "db_name" and "db_user" set.
* @param boolean $utf True if the database supports the UTF-8 character set.
* @return string The query that creates database
* @throws RuntimeException
throw
new RuntimeException('$options object must not be null.');
elseif (empty($options->db_name))
throw
new RuntimeException('$options object must have db_name set.');
elseif (empty($options->db_user))
throw
new RuntimeException('$options object must have db_user set.');
* Disconnects the database.
* Adds a function callable just before disconnecting the database. Parameter of the callable is $this JDatabaseDriver
* @param callable $callable Function to call in disconnect() method just before disconnecting from database
* Drops a table from the database.
* @param string $table The name of the database table to drop.
* @param boolean $ifExists Optionally specify that the table must exist before it is dropped.
* @return JDatabaseDriver Returns this object to support chaining.
* @throws RuntimeException
public abstract function dropTable($table, $ifExists =
true);
* Escapes a string for usage in an SQL statement.
* @param string $text The string to be escaped.
* @param boolean $extra Optional parameter to provide extra escaping.
* @return string The escaped string.
abstract public function escape($text, $extra =
false);
* Method to fetch a row from the result set cursor as an array.
* @param mixed $cursor The optional result set cursor from which to fetch the row.
* @return mixed Either the next row from the result set or false if there are no more rows.
abstract protected function fetchArray($cursor =
null);
* Method to fetch a row from the result set cursor as an associative array.
* @param mixed $cursor The optional result set cursor from which to fetch the row.
* @return mixed Either the next row from the result set or false if there are no more rows.
abstract protected function fetchAssoc($cursor =
null);
* Method to fetch a row from the result set cursor as an object.
* @param mixed $cursor The optional result set cursor from which to fetch the row.
* @param string $class The class name to use for the returned row object.
* @return mixed Either the next row from the result set or false if there are no more rows.
abstract protected function fetchObject($cursor =
null, $class =
'stdClass');
* Method to free up the memory used for the result set.
* @param mixed $cursor The optional result set cursor from which to fetch the row.
abstract protected function freeResult($cursor =
null);
* Get the number of affected rows for the previous executed SQL statement.
* @return integer The number of affected rows.
* Return the query string to alter the database character set.
* @param string $dbName The database name
* @return string The query that alter the database query string
return 'ALTER DATABASE ' .
$this->quoteName($dbName) .
' CHARACTER SET `utf8`';
* Return the query string to create new Database.
* Each database driver, other than MySQL, need to override this member to return correct string.
* @param stdClass $options Object used to pass user and database name to database driver.
* This object must have "db_name" and "db_user" set.
* @param boolean $utf True if the database supports the UTF-8 character set.
* @return string The query that creates database
return 'CREATE DATABASE ' .
$this->quoteName($options->db_name) .
' CHARACTER SET `utf8`';
return 'CREATE DATABASE ' .
$this->quoteName($options->db_name);
* Method to get the database collation in use by sampling a text field of a table in the database.
* @return mixed The collation in use by the database or boolean false if not supported.
* Method that provides access to the underlying database connection. Useful for when you need to call a
* proprietary method such as postgresql's lo_* methods.
* @return resource The underlying database connection resource.
* Get the total number of SQL statements executed by the database driver.
* Gets the name of the database used by this conneciton.
* Returns a PHP date() function compliant date format for the database driver.
* @return string The format string.
* Get the database driver SQL statement log.
* @return array SQL statements executed by the database driver.
* Get the database driver SQL statement log.
* @return array SQL statements executed by the database driver.
* Get the database driver SQL statement log.
* @return array SQL statements executed by the database driver.
* Get the minimum supported database version.
* @return string The minimum version number for the database driver.
return static::$dbMinimum;
* Get the null or zero representation of a timestamp for the database driver.
* @return string Null or zero representation of a timestamp.
* Get the number of returned rows for the previous executed SQL statement.
* @param resource $cursor An optional database cursor resource to extract the row count from.
* @return integer The number of returned rows.
abstract public function getNumRows($cursor =
null);
* Get the common table prefix for the database driver.
* @return string The common database table prefix.
* Gets an exporter class object.
* @return JDatabaseExporter An exporter object.
* @throws RuntimeException
// Derive the class name from the driver.
// Make sure we have an exporter class for this driver.
// If it doesn't exist we are at an impasse so throw an exception.
throw
new RuntimeException('Database Exporter not found.');
* Gets an importer class object.
* @return JDatabaseImporter An importer object.
* @throws RuntimeException
// Derive the class name from the driver.
// Make sure we have an importer class for this driver.
// If it doesn't exist we are at an impasse so throw an exception.
throw
new RuntimeException('Database Importer not found');
* Get the current query object or a new JDatabaseQuery object.
* @param boolean $new False to return the current query object, True to return a new JDatabaseQuery object.
* @return JDatabaseQuery The current query object or a new object extending the JDatabaseQuery class.
* @throws RuntimeException
// Derive the class name from the driver.
// Make sure we have a query class for this driver.
// If it doesn't exist we are at an impasse so throw an exception.
throw
new RuntimeException('Database Query Class not found.');
return new $class($this);
* Get a new iterator on the current query.
* @param string $column An option column to use as the iterator key.
* @param string $class The class of object that is returned.
* @return JDatabaseIterator A new database iterator.
* @throws RuntimeException
public function getIterator($column =
null, $class =
'stdClass')
// Derive the class name from the driver.
$iteratorClass =
'JDatabaseIterator' .
ucfirst($this->name);
// Make sure we have an iterator class for this driver.
// If it doesn't exist we are at an impasse so throw an exception.
throw
new RuntimeException(sprintf('class *%s* is not defined', $iteratorClass));
return new $iteratorClass($this->execute(), $column, $class);
* Retrieves field information about the given tables.
* @param string $table The name of the database table.
* @param boolean $typeOnly True (default) to only return field types.
* @return array An array of fields by table.
* @throws RuntimeException
* Shows the table CREATE statement that creates the given tables.
* @param mixed $tables A table name or a list of table names.
* @return array A list of the create SQL for the tables.
* @throws RuntimeException
* Retrieves field information about the given tables.
* @param mixed $tables A table name or a list of table names.
* @return array An array of keys for the table(s).
* @throws RuntimeException
* Method to get an array of all tables in the database.
* @return array An array of all the tables in the database.
* @throws RuntimeException
* Determine whether or not the database engine supports UTF-8 character encoding.
* @return boolean True if the database engine supports UTF-8 character encoding.
* @deprecated 12.3 (Platform) & 4.0 (CMS) - Use hasUTFSupport() instead
JLog::add('JDatabaseDriver::getUTFSupport() is deprecated. Use JDatabaseDriver::hasUTFSupport() instead.', JLog::WARNING, 'deprecated');
* Determine whether or not the database engine supports UTF-8 character encoding.
* @return boolean True if the database engine supports UTF-8 character encoding.
* Get the version of the database connector
* @return string The database connector version.
* Method to get the auto-incremented value from the last INSERT statement.
* @return mixed The value of the auto-increment field from the last inserted row.
* Inserts a row into a table based on an object's properties.
* @param string $table The name of the database table to insert into.
* @param object &$object A reference to an object whose public properties match the table fields.
* @param string $key The name of the primary key. If provided the object property is updated.
* @return boolean True on success.
* @throws RuntimeException
// Iterate over the object variables to build the query fields and values.
// Only process non-null scalars.
// Ignore any internal fields.
// Prepare and sanitize the fields and values for the database query.
$values[] =
$this->quote($v);
// Create the base insert statement.
// Set the query and execute the insert.
// Update the primary key if it exists.
* Method to check whether the installed database version is supported by the database driver
* @return boolean True if the database version is supported
* Method to get the first row of the result set from the database query as an associative array
* of ['field_name' => 'row_value'].
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get the first row from the result set as an associative array.
// Free up system resources and return.
* Method to get an array of the result set rows from the database query where each row is an associative array
* of ['field_name' => 'row_value']. The array of rows can optionally be keyed by a field name, but defaults to
* a sequential numeric array.
* NOTE: Chosing to key the result array by a non-unique field name can result in unwanted
* behavior and should be avoided.
* @param string $key The name of a field on which to key the result array.
* @param string $column An optional column name. Instead of the whole row, only this column value will be in
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get all of the rows from the result set.
$value =
($column) ?
(isset
($row[$column]) ?
$row[$column] :
$row) :
$row;
$array[$row[$key]] =
$value;
// Free up system resources and return.
* Method to get an array of values from the <var>$offset</var> field in each row of the result set from
* @param integer $offset The row offset to use to build the result array.
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get all of the rows from the result set as arrays.
$array[] =
$row[$offset];
// Free up system resources and return.
* Method to get the next row in the result set from the database query as an object.
* @param string $class The class name to use for the returned row object.
* @return mixed The result of the query as an array, false if there are no more rows.
* @throws RuntimeException
JLog::add(__METHOD__ .
'() is deprecated. Use JDatabase::getIterator() instead.', JLog::WARNING, 'deprecated');
// Execute the query and get the result set cursor.
if (!($cursor =
$this->execute()))
return $this->errorNum ?
null :
false;
// Get the next row from the result set as an object of type $class.
if ($row =
$this->fetchObject($cursor, $class))
// Free up system resources and return.
* Method to get the next row in the result set from the database query as an array.
* @return mixed The result of the query as an array, false if there are no more rows.
* @throws RuntimeException
* @deprecated N/A (CMS) Use JDatabaseDriver::getIterator() instead
JLog::add('JDatabaseDriver::loadNextRow() is deprecated. Use JDatabaseDriver::getIterator() instead.', JLog::WARNING, 'deprecated');
// Execute the query and get the result set cursor.
if (!($cursor =
$this->execute()))
return $this->errorNum ?
null :
false;
// Get the next row from the result set as an object of type $class.
if ($row =
$this->fetchArray($cursor))
// Free up system resources and return.
$this->freeResult($cursor);
* Method to get the first row of the result set from the database query as an object.
* @param string $class The class name to use for the returned row object.
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get the first row from the result set as an object of type $class.
// Free up system resources and return.
* Method to get an array of the result set rows from the database query where each row is an object. The array
* of objects can optionally be keyed by a field name, but defaults to a sequential numeric array.
* NOTE: Choosing to key the result array by a non-unique field name can result in unwanted
* behavior and should be avoided.
* @param string $key The name of a field on which to key the result array.
* @param string $class The class name to use for the returned row objects.
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get all of the rows from the result set as objects of type $class.
$array[$row->$key] =
$row;
// Free up system resources and return.
* Method to get the first field of the first row of the result set from the database query.
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get the first row from the result set as an array.
// Free up system resources and return.
* Method to get the first row of the result set from the database query as an array. Columns are indexed
* numerically so the first column in the result set would be accessible via <var>$row[0]</var>, etc.
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get the first row from the result set as an array.
// Free up system resources and return.
* Method to get an array of the result set rows from the database query where each row is an array. The array
* of objects can optionally be keyed by a field offset, but defaults to a sequential numeric array.
* NOTE: Choosing to key the result array by a non-unique field can result in unwanted
* behavior and should be avoided.
* @param string $key The name of a field on which to key the result array.
* @return mixed The return value or null if the query failed.
* @throws RuntimeException
// Execute the query and get the result set cursor.
// Get all of the rows from the result set as arrays.
$array[$row[$key]] =
$row;
// Free up system resources and return.
* Locks a table in the database.
* @param string $tableName The name of the table to unlock.
* @return JDatabaseDriver Returns this object to support chaining.
* @throws RuntimeException
public abstract function lockTable($tableName);
* Quotes and optionally escapes a string to database requirements for use in database queries.
* @param mixed $text A string or an array of strings to quote.
* @param boolean $escape True (default) to escape the string, false to leave it unchanged.
* @return string The quoted input string.
* @note Accepting an array of strings was added in 12.3.
public function quote($text, $escape =
true)
foreach ($text as $k =>
$v)
$text[$k] =
$this->quote($v, $escape);
return '\'' .
($escape ?
$this->escape($text) :
$text) .
'\'';
* Wrap an SQL statement identifier name such as column, table or database names in quotes to prevent injection
* risks and reserved word conflicts.
* @param mixed $name The identifier name to wrap in quotes, or an array of identifier names to wrap in quotes.
* Each type supports dot-notation name.
* @param mixed $as The AS query part associated to $name. It can be string or array, in latter case it has to be
* same length of $name; if is null there will not be any AS part for string or array element.
* @return mixed The quote wrapped name, same type of $name.
return $quotedName .
$quotedAs;
for ($i =
0; $i <
$count; $i++
)
$fin[] =
$this->quoteName($name[$i], $as[$i]);
* Quote strings coming from quoteName call.
* @param array $strArr Array of strings coming from quoteName dot-explosion.
* @return string Dot-imploded string of quoted parts.
foreach ($strArr as $part)
$parts[] =
$q .
$part .
$q;
$parts[] =
$q{0} .
$part .
$q{1};
* This function replaces a string identifier <var>$prefix</var> with the string held is the
* <var>tablePrefix</var> class variable.
* @param string $sql The SQL statement to prepare.
* @param string $prefix The common table prefix.
* @return string The processed SQL statement.
* Pattern is: find any non-quoted (which is not including single or double quotes) string being the prefix
* in $sql possibly followed by a double or single quoted one:
* positive lookahead: (?=
* not including " or ': [^"\']+
* including exactly the prefix to replace: preg_quote( $prefix, '/' )
* Followed by a double-quoted: "(?:[^\\"]|\\.)*"
* single-quoted: \'(?:[^\\\']|\\.)*\'
* $pattern = '/((?=[^"\']+)' . preg_quote($prefix, '/') . ')("(?:[^\\"]|\\.)*"|\'(?:[^\\\']|\\.)*\')?/';
$pattern =
'/(?<=[^"\'])(' .
preg_quote($prefix, '/') .
')("(?:[^\\\\"]|\.)*"|\'(?:[^\\\\\']|\.)*\')?/';
* Renames a table in the database.
* @param string $oldTable The name of the table to be renamed
* @param string $newTable The new name for the table.
* @param string $backup Table prefix
* @param string $prefix For the table - used to rename constraints in non-mysql databases
* @return JDatabaseDriver Returns this object to support chaining.
* @throws RuntimeException
public abstract function renameTable($oldTable, $newTable, $backup =
null, $prefix =
null);
* Select a database for use.
* @param string $database The name of the database to select for use.
* @return boolean True if the database was successfully selected.
* @throws RuntimeException
abstract public function select($database);
* Sets the database debugging state for the driver.
* @param boolean $level True to enable debugging.
* @return boolean The old debugging level.
$previous =
$this->debug;
$this->debug = (bool)
$level;
* Sets the SQL statement string for later execution.
* @param mixed $query The SQL statement to set either as a JDatabaseQuery object or a string.
* @param integer $offset The affected row offset to set.
* @param integer $limit The maximum affected rows to set.
* @return JDatabaseDriver This object to support method chaining.
public function setQuery($query, $offset =
0, $limit =
0)
$query->setLimit($limit, $offset);
* Set the connection to use UTF-8 character encoding.
* @return boolean True on success.
abstract public function setUTF();
* Method to commit a transaction.
* @param boolean $toSavepoint If true, commit to the last savepoint.
* @throws RuntimeException
* Method to roll back a transaction.
* @param boolean $toSavepoint If true, rollback to the last savepoint.
* @throws RuntimeException
* Method to initialize a transaction.
* @param boolean $asSavepoint If true and a transaction is already active, a savepoint will be created.
* @throws RuntimeException
* Method to truncate a table.
* @param string $table The table to truncate
* @throws RuntimeException
* Updates a row in a table based on an object's properties.
* @param string $table The name of the database table to update.
* @param object &$object A reference to an object whose public properties match the table fields.
* @param array $key The name of the primary key.
* @param boolean $nulls True to update null fields or false to ignore them.
* @return boolean True on success.
* @throws RuntimeException
public function updateObject($table, &$object, $key, $nulls =
false)
// Create the base update statement.
$statement =
'UPDATE ' .
$this->quoteName($table) .
' SET %s WHERE %s';
// Iterate over the object variables to build the query fields/value pairs.
// Only process scalars that are not internal fields.
// Set the primary key to the WHERE clause instead of a field to update.
// Prepare and sanitize the fields and values for the database query.
// If the value is null and we want to update nulls then set it.
// If the value is null and we do not want to update nulls then ignore this field.
// The field is not null so we prep it for update.
// Add the field to be updated.
$fields[] =
$this->quoteName($k) .
'=' .
$val;
// We don't have any fields to update.
// Set the query and execute the update.
* Execute the SQL statement.
* @return mixed A database cursor resource on success, boolean false on failure.
* @throws RuntimeException
abstract public function execute();
* Unlocks tables in the database.
* @return JDatabaseDriver Returns this object to support chaining.
* @throws RuntimeException
Documentation generated on Tue, 19 Nov 2013 15:01:42 +0100 by phpDocumentor 1.4.3