From dd181032e9da2bc0fe8b76ea7414eaa11b12fed7 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Tue, 20 Aug 2013 13:25:16 -0700 Subject: [PATCH] Added a getLazyConnectionRef() function to load balancer * This is useful for injecting dependencies without adding pointless traffic in some cases Change-Id: I755ed008c387a3e4555934c84a5dc013ee8c2392 --- includes/db/LoadBalancer.php | 39 +++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php index 60c283304a..3358488c25 100644 --- a/includes/db/LoadBalancer.php +++ b/includes/db/LoadBalancer.php @@ -561,6 +561,22 @@ class LoadBalancer { return new DBConnRef( $this, $this->getConnection( $db, $groups, $wiki ) ); } + /** + * Get a database connection handle reference without connecting yet + * + * The handle's methods wrap simply wrap those of a DatabaseBase handle + * + * @see LoadBalancer::getConnection() for parameter information + * + * @param integer $db + * @param mixed $groups + * @param string $wiki + * @return DBConnRef + */ + public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) { + return new DBConnRef( $this, array( $db, $groups, $wiki ) ); + } + /** * Open a connection to the server given by the specified index * Index must be an actual index into the array. @@ -1088,6 +1104,7 @@ class LoadBalancer { /** * Helper class to handle automatically marking connectons as reusable (via RAII pattern) + * as well handling deferring the actual network connection until the handle is used * * @ingroup Database * @since 1.22 @@ -1095,23 +1112,35 @@ class LoadBalancer { class DBConnRef implements IDatabase { /** @var LoadBalancer */ protected $lb; - /** @var DatabaseBase */ + /** @var DatabaseBase|null */ protected $conn; + /** @var Array|null */ + protected $params; /** * @param $lb LoadBalancer - * @param $conn DatabaseBase + * @param $conn DatabaseBase|array Connection or (server index, group, wiki ID) array */ - public function __construct( LoadBalancer $lb, DatabaseBase $conn ) { + public function __construct( LoadBalancer $lb, $conn ) { $this->lb = $lb; - $this->conn = $conn; + if ( $conn instanceof DatabaseBase ) { + $this->conn = $conn; + } else { + $this->params = $conn; + } } public function __call( $name, $arguments ) { + if ( $this->conn === null ) { + list( $db, $groups, $wiki ) = $this->params; + $this->conn = $this->lb->getConnection( $db, $groups, $wiki ); + } return call_user_func_array( array( $this->conn, $name ), $arguments ); } function __destruct() { - $this->lb->reuseConnection( $this->conn ); + if ( $this->conn !== null ) { + $this->lb->reuseConnection( $this->conn ); + } } } -- 2.20.1