Browse Source

Allow the registration of custom database drivers.

Taylor Otwell 12 years ago
parent
commit
7e33ec5f34
3 changed files with 43 additions and 3 deletions
  1. 28 0
      laravel/database.php
  2. 10 3
      laravel/database/connection.php
  3. 5 0
      laravel/database/schema.php

+ 28 - 0
laravel/database.php

@@ -12,6 +12,13 @@ class Database {
 	 */
 	public static $connections = array();
 
+	/**
+	 * The third-party driver registrar.
+	 *
+	 * @var array
+	 */
+	public static $registrar = array();
+
 	/**
 	 * Get a database connection.
 	 *
@@ -66,6 +73,11 @@ class Database {
 	 */
 	protected static function connector($driver)
 	{
+		if (isset(static::$registrar[$driver]))
+		{
+			return static::$registrar[$driver]['connector']();
+		}
+
 		switch ($driver)
 		{
 			case 'sqlite':
@@ -120,6 +132,22 @@ class Database {
 		return Database\Connection::$queries;
 	}
 
+	/**
+	 * Register a database connector and grammars.
+	 *
+	 * @param  string   $name
+	 * @param  Closure  $connector
+	 * @param  Closure  $query
+	 * @param  Closure  $schema
+	 * @return void
+	 */
+	public static function register($name, Closure $connector, $query = null, $schema = null)
+	{
+		if (is_null($query)) $query = '\Laravel\Database\Query\Grammars\Grammar';
+
+		static::$registrar[$name] = compact('connector', 'query', 'schema');
+	}
+
 	/**
 	 * Magic Method for calling methods on the default database connection.
 	 *

+ 10 - 3
laravel/database/connection.php

@@ -1,4 +1,6 @@
-<?php namespace Laravel\Database; use PDO, PDOStatement, Laravel\Config, Laravel\Event;
+<?php namespace Laravel\Database;
+
+use PDO, PDOStatement, Laravel\Config, Laravel\Event;
 
 class Connection {
 
@@ -71,7 +73,12 @@ class Connection {
 	{
 		if (isset($this->grammar)) return $this->grammar;
 
-		switch (isset($this->config['grammar']) ? $this->config['grammar'] : $this->driver())
+		if (isset(\Laravel\Database::$registrar[$this->driver()]))
+		{
+			\Laravel\Database::$registrar[$this->driver()]['query']();
+		}
+
+		switch ($this->driver())
 		{
 			case 'mysql':
 				return $this->grammar = new Query\Grammars\MySQL($this);
@@ -300,7 +307,7 @@ class Connection {
 	 */
 	public function driver()
 	{
-		return $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
+		return $this->config['driver'];
 	}
 
 	/**

+ 5 - 0
laravel/database/schema.php

@@ -148,6 +148,11 @@ class Schema {
 	{
 		$driver = $connection->driver();
 
+		if (isset(\Laravel\Database::$registrar[$driver]))
+		{
+			return \Laravel\Database::$registrar[$driver]['schema']();
+		}
+
 		switch ($driver)
 		{
 			case 'mysql':