JulienBreux
4/2/2012 - 10:12 PM

PrestaShop 1.5.x - Database Factory

PrestaShop 1.5.x - Database Factory

<?php
require dirname(__FILE__).'/config/config.inc.php';

// Add externals servers
DbFactory::addServer('primary', 'host_1', 'user_1', '****', 'database_1');
DbFactory::addServer('secondary', 'host_2', 'user_2', '****', 'database_2');
DbFactory::addServer('tertiary', 'host_3', 'user_3', '****', 'database_3');
DbFactory::addServer('quaternary', 'host_4', 'user_4', '****', 'database_4');
// ...

// Primary instance
$primary = DbFactory::getInstanceByServer('primary');

// Secondary instance
$secondary = DbFactory::getInstanceByServer('secondary');

// Tertiary instance
$tertiary = DbFactory::getInstanceByServer('tertiary');

// Quaternary instance
$quaternary = DbFactory::getInstanceByServer('quaternary');

// ...
<?php
/**
 * Database Factory
 * Use this factory for connections to external databases
 *
 * @version 1.0.0
 * @author Julien BREUX <julien.breux@prestashop.com>
 */
class DbFactoryCore
{
	/** @const string Default adapter */
	const DEFAULT_ADAPTER = 'MySQL';

	/** @var array Instances */
	protected static $_instances = array();

	/** @var array List of servers settings */
	protected static $_servers = array();

	/**
	 * Dynamic add server
	 *
	 * @static
	 * @param $server_name string Alias name of server
	 * @param $host string Host (e.g. localhost)
	 * @param $user string User (e.g. root)
	 * @param $password string Password
	 * @param $database string Database (e.g. prestashop)
	 * @param string $adapter Adapter (e.g. MySQL, MySQLi, PDO, etc.)
	 */
	public static function addServer($server_name, $host, $user, $password, $database, $adapter = self::DEFAULT_ADAPTER)
	{
		self::$_servers[$server_name] = (object)array(
			'host'		=> $host,
			'user'		=> $user,
			'password'	=> $password,
			'database'	=> $database,
			'adapter'	=> $adapter,
		);
	}

	/**
	 * Get Instance By Server
	 *
	 * @static
	 * @param $server_name string Alias name of server
	 * @return mixed
	 * @throws DbFactoryException
	 */
	public static function getInstanceByServer($server_name)
	{
		if (!array_key_exists($server_name, self::$_servers))
			throw new DbFactoryServerNotSetException(sprtinf('The server %s is not set', $server_name));

		$class = self::$_servers[$server_name]->adapter;

		if (!array_key_exists($server_name, self::$_instances))
			self::$_instances[$server_name] = new $class(
				self::$_servers[$server_name]->host,
				self::$_servers[$server_name]->user,
				self::$_servers[$server_name]->password,
				self::$_servers[$server_name]->database
			);

		return self::$_instances[$server_name];
	}
}

/**
 * Database Factory Exception
 * Server Not Set
 *
 * @author Julien Breux <julien.breux@prestashop.com>
 * @version 1.0.0
 */
class DbFactoryServerNotSetException extends Exception {}