Commit 2e6f3542 authored by Benjamin Eberlei's avatar Benjamin Eberlei

Merge pull request #414 from easybiblabs/topics/DBAL-275

Enhancement: expose ping() on pingable-connections.
parents 81cc2a7f 99657f7f
......@@ -30,6 +30,7 @@ use Doctrine\DBAL\Cache\ResultCacheStatement;
use Doctrine\DBAL\Cache\QueryCacheProfile;
use Doctrine\DBAL\Cache\ArrayStatement;
use Doctrine\DBAL\Cache\CacheException;
use Doctrine\DBAL\Driver\PingableConnection;
/**
* A wrapper around a Doctrine\DBAL\Driver\Connection that adds features like
......@@ -1488,4 +1489,31 @@ class Connection implements DriverConnection
{
return new Query\QueryBuilder($this);
}
/**
* Ping the server!
*
* @return bool
*/
public function ping()
{
if ( ! $this->_isConnected) {
return false; // Don't connect if not done yet. It will be lazy on first use
}
if ($this->_conn instanceof PingableConnection) {
return $this->_conn->ping();
}
try {
$this->query($this->_platform->getDummySelectSQL());
return true;
} catch (DBALException $e) {
// As the underlying connection is unset, the next query will connect again thanks to the lazyness
$this->close();
}
return false;
}
}
......@@ -20,11 +20,13 @@
namespace Doctrine\DBAL\Driver\Mysqli;
use Doctrine\DBAL\Driver\Connection as Connection;
use \Doctrine\DBAL\Driver\PingableConnection;
/**
* @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
* @author Till Klampaeckel <till@php.net>
*/
class MysqliConnection implements Connection
class MysqliConnection implements Connection, PingableConnection
{
/**
* @var \mysqli
......@@ -207,4 +209,14 @@ class MysqliConnection implements Connection
);
}
}
/**
* Pings the server and re-connects when `mysqli.reconnect = 1`
*
* @return bool
*/
public function ping()
{
return $this->_conn->ping();
}
}
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\DBAL\Driver;
/**
* An interface for connections which support a "native" ping method.
*
* @link www.doctrine-project.org
* @since 2.5
* @author Till Klampaeckel <till@php.net>
* @author Benjamin Eberlei <kontakt@beberlei.de>
*/
interface PingableConnection
{
/**
* Pings the database server to determine if the connection is still
* available. Return true/false based on if that was successful or not.
*
* @return bool
*/
public function ping();
}
\ No newline at end of file
......@@ -193,6 +193,7 @@ class ConnectionTest extends \Doctrine\Tests\DbalFunctionalTestCase
{
try {
$this->_conn->transactional(function($conn) {
/* @var $conn \Doctrine\DBAL\Connection */
$conn->executeQuery($conn->getDatabasePlatform()->getDummySelectSQL());
throw new \RuntimeException("Ooops!");
});
......@@ -204,7 +205,7 @@ class ConnectionTest extends \Doctrine\Tests\DbalFunctionalTestCase
public function testTransactional()
{
$this->_conn->transactional(function($conn) {
/* @var $conn Connection */
/* @var $conn \Doctrine\DBAL\Connection */
$conn->executeQuery($conn->getDatabasePlatform()->getDummySelectSQL());
});
}
......@@ -216,4 +217,15 @@ class ConnectionTest extends \Doctrine\Tests\DbalFunctionalTestCase
{
$this->assertEquals($this->_conn->quote("foo", Type::STRING), $this->_conn->quote("foo", \PDO::PARAM_STR));
}
public function testPingDoesNotTriggerConnect()
{
$this->assertFalse($this->_conn->ping());
}
public function testPingReturnsTrueWhenConnectionIsPingedOrOpen()
{
$this->_conn->connect();
$this->assertTrue($this->_conn->ping());
}
}
......@@ -39,6 +39,12 @@ class ConnectionTest extends \Doctrine\Tests\DbalFunctionalTestCase
$this->getConnection(array('hello' => 'world')); // use local infile
}
public function testPing()
{
$conn = $this->getConnection(array());
$this->assertTrue($conn->ping());
}
private function getConnection(array $driverOptions)
{
return new \Doctrine\DBAL\Driver\Mysqli\MysqliConnection(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment