128 lines
3.9 KiB
PHP
128 lines
3.9 KiB
PHP
<?php
|
|
/**
|
|
* @package FrameworkOnFramework
|
|
* @subpackage database
|
|
* @copyright Copyright (C) 2010-2016 Nicholas K. Dionysopoulos / Akeeba Ltd. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*
|
|
* This file is adapted from the Joomla! Platform. It is used to iterate a database cursor returning F0FTable objects
|
|
* instead of plain stdClass objects
|
|
*/
|
|
|
|
// Protect from unauthorized access
|
|
defined('F0F_INCLUDED') or die;
|
|
|
|
/**
|
|
* Joomla Platform Database Factory class
|
|
*
|
|
* @since 12.1
|
|
*/
|
|
class F0FDatabaseFactory
|
|
{
|
|
/**
|
|
* Contains the current F0FDatabaseFactory instance
|
|
*
|
|
* @var F0FDatabaseFactory
|
|
* @since 12.1
|
|
*/
|
|
private static $_instance = null;
|
|
|
|
/**
|
|
* Method to return a F0FDatabaseDriver instance based on the given options. There are three global options and then
|
|
* the rest are specific to the database driver. The 'database' option determines which database is to
|
|
* be used for the connection. The 'select' option determines whether the connector should automatically select
|
|
* the chosen database.
|
|
*
|
|
* 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 string $name Name of the database driver you'd like to instantiate
|
|
* @param array $options Parameters to be passed to the database driver.
|
|
*
|
|
* @return F0FDatabaseDriver A database driver object.
|
|
*
|
|
* @since 12.1
|
|
* @throws RuntimeException
|
|
*/
|
|
public function getDriver($name = 'joomla', $options = array())
|
|
{
|
|
// Sanitize the database connector options.
|
|
$options['driver'] = preg_replace('/[^A-Z0-9_\.-]/i', '', $name);
|
|
$options['database'] = (isset($options['database'])) ? $options['database'] : null;
|
|
$options['select'] = (isset($options['select'])) ? $options['select'] : true;
|
|
|
|
// Derive the class name from the driver.
|
|
$class = 'F0FDatabaseDriver' . 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.
|
|
if (!class_exists($class))
|
|
{
|
|
throw new RuntimeException(sprintf('Unable to load Database Driver: %s', $options['driver']));
|
|
}
|
|
|
|
// Create our new F0FDatabaseDriver connector based on the options given.
|
|
try
|
|
{
|
|
$instance = new $class($options);
|
|
}
|
|
catch (RuntimeException $e)
|
|
{
|
|
throw new RuntimeException(sprintf('Unable to connect to the Database: %s', $e->getMessage()), $e->getCode(), $e);
|
|
}
|
|
|
|
return $instance;
|
|
}
|
|
|
|
/**
|
|
* Gets an instance of the factory object.
|
|
*
|
|
* @return F0FDatabaseFactory
|
|
*
|
|
* @since 12.1
|
|
*/
|
|
public static function getInstance()
|
|
{
|
|
return self::$_instance ? self::$_instance : new F0FDatabaseFactory;
|
|
}
|
|
|
|
/**
|
|
* Get the current query object or a new F0FDatabaseQuery object.
|
|
*
|
|
* @param string $name Name of the driver you want an query object for.
|
|
* @param F0FDatabaseDriver $db Optional F0FDatabaseDriver instance
|
|
*
|
|
* @return F0FDatabaseQuery The current query object or a new object extending the F0FDatabaseQuery class.
|
|
*
|
|
* @since 12.1
|
|
* @throws RuntimeException
|
|
*/
|
|
public function getQuery($name, F0FDatabaseDriver $db = null)
|
|
{
|
|
// Derive the class name from the driver.
|
|
$class = 'F0FDatabaseQuery' . ucfirst(strtolower($name));
|
|
|
|
// Make sure we have a query class for this driver.
|
|
if (!class_exists($class))
|
|
{
|
|
// 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($db);
|
|
}
|
|
|
|
/**
|
|
* Gets an instance of a factory object to return on subsequent calls of getInstance.
|
|
*
|
|
* @param F0FDatabaseFactory $instance A F0FDatabaseFactory object.
|
|
*
|
|
* @return void
|
|
*
|
|
* @since 12.1
|
|
*/
|
|
public static function setInstance(F0FDatabaseFactory $instance = null)
|
|
{
|
|
self::$_instance = $instance;
|
|
}
|
|
}
|