diff --git a/bootstrap.php b/bootstrap.php
index a74f2dfd..628eb8de 100644
--- a/bootstrap.php
+++ b/bootstrap.php
@@ -1,27 +1,27 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/B8Framework/Database.php b/src/B8Framework/Database.php
index eef6c2b9..600dd093 100644
--- a/src/B8Framework/Database.php
+++ b/src/B8Framework/Database.php
@@ -4,11 +4,13 @@ namespace b8;
class Database extends \PDO
{
+ const MYSQL_TYPE = 'mysql';
+ const POSTGRESQL_TYPE = 'pgsql';
+
protected static $initialised = false;
protected static $servers = ['read' => [], 'write' => []];
protected static $connections = ['read' => null, 'write' => null];
protected static $details = [];
- protected static $lastUsed = ['read' => null, 'write' => null];
/**
* @param string $table
@@ -17,7 +19,7 @@ class Database extends \PDO
*/
public function lastInsertIdExtended($table = null)
{
- if ($table && $this->getAttribute(self::ATTR_DRIVER_NAME) == 'pgsql') {
+ if ($table && self::POSTGRESQL_TYPE === $this->getAttribute(self::ATTR_DRIVER_NAME)) {
return parent::lastInsertId($table . '_id_seq');
}
@@ -31,10 +33,11 @@ class Database extends \PDO
self::$servers['read'] = $settings['servers']['read'];
self::$servers['write'] = $settings['servers']['write'];
- self::$details['type'] = $settings['type'];
- self::$details['db'] = $settings['name'];
- self::$details['user'] = $settings['username'];
- self::$details['pass'] = $settings['password'];
+
+ self::$details['type'] = $settings['type'];
+ self::$details['db'] = $settings['name'];
+ self::$details['user'] = $settings['username'];
+ self::$details['pass'] = $settings['password'];
self::$initialised = true;
}
@@ -52,11 +55,6 @@ class Database extends \PDO
self::init();
}
- // If the connection hasn't been used for 5 minutes, force a reconnection:
- if (!is_null(self::$lastUsed[$type]) && (time() - self::$lastUsed[$type]) > 300) {
- self::$connections[$type] = null;
- }
-
if (is_null(self::$connections[$type])) {
// Shuffle, so we pick a random server:
$servers = self::$servers[$type];
@@ -80,7 +78,7 @@ class Database extends \PDO
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_TIMEOUT => 2,
];
- if ('mysql' === self::$details['type']) {
+ if (self::MYSQL_TYPE === self::$details['type']) {
$pdoOptions[\PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES 'UTF8'";
}
@@ -110,11 +108,12 @@ class Database extends \PDO
self::$connections[$type] = $connection;
}
- self::$lastUsed[$type] = time();
-
return self::$connections[$type];
}
+ /**
+ * @return array
+ */
public function getDetails()
{
return self::$details;
@@ -123,21 +122,34 @@ class Database extends \PDO
public static function reset()
{
self::$connections = ['read' => null, 'write' => null];
- self::$lastUsed = ['read' => null, 'write' => null];
self::$initialised = false;
}
- public function prepareCommon($statement, array $driver_options = [])
+ /**
+ * @param string $statement
+ *
+ * @return string
+ */
+ protected function quoteNames($statement)
{
$quote = '';
- if ('mysql' === self::$details['type']) {
+ if (self::MYSQL_TYPE === self::$details['type']) {
$quote = '`';
- } elseif ('pgsql' === self::$details['type']) {
+ } elseif (self::POSTGRESQL_TYPE === self::$details['type']) {
$quote = '"';
}
- $statement = preg_replace('/{{(.*?)}}/', ($quote . '\1' . $quote), $statement);
+ return preg_replace('/{{(.*?)}}/', ($quote . '\1' . $quote), $statement);
+ }
- return parent::prepare($statement, $driver_options);
+ /**
+ * @param string $statement
+ * @param array $driver_options
+ *
+ * @return \PDOStatement
+ */
+ public function prepareCommon($statement, array $driver_options = [])
+ {
+ return parent::prepare($this->quoteNames($statement), $driver_options);
}
}
diff --git a/tests/B8Framework/DatabaseMysqlTest.php b/tests/B8Framework/DatabaseMysqlTest.php
index be649d9f..9802abab 100755
--- a/tests/B8Framework/DatabaseMysqlTest.php
+++ b/tests/B8Framework/DatabaseMysqlTest.php
@@ -21,7 +21,7 @@ class DatabaseMysqlTest extends TestCase
['host' => 'localhost'],
],
],
- 'type' => 'mysql',
+ 'type' => Database::MYSQL_TYPE,
'name' => MYSQL_DBNAME,
'username' => MYSQL_USER,
'password' => MYSQL_PASSWORD,
@@ -33,6 +33,10 @@ class DatabaseMysqlTest extends TestCase
protected function checkDatabaseConnection()
{
+ if (!extension_loaded('mysqli')) {
+ $this->markTestSkipped('Test skipped because Mysqli extension doesn`t exist.');
+ }
+
try {
$connection = Database::getConnection('read');
} catch (\Exception $e) {
@@ -44,23 +48,66 @@ class DatabaseMysqlTest extends TestCase
}
}
- public function testGetWriteConnection()
+ public function testGetConnection()
{
$this->checkDatabaseConnection();
- $connection = Database::getConnection('write');
- self::assertInstanceOf('\b8\Database', $connection);
+ $writeConnection = Database::getConnection('write');
+ $readConnection = Database::getConnection('read');
+
+ self::assertInstanceOf('\b8\Database', $writeConnection);
+ self::assertInstanceOf('\b8\Database', $readConnection);
+
+ $writeDetails = Database::getConnection('write')->getDetails();
+
+ self::assertTrue(is_array($writeDetails));
+ self::assertEquals(MYSQL_DBNAME, $writeDetails['db']);
+ self::assertEquals(MYSQL_USER, $writeDetails['user']);
+ self::assertEquals(MYSQL_PASSWORD, $writeDetails['pass']);
+
+ $readDetails = Database::getConnection('read')->getDetails();
+
+ self::assertTrue(is_array($readDetails));
+ self::assertEquals(MYSQL_DBNAME, $readDetails['db']);
+ self::assertEquals(MYSQL_USER, $readDetails['user']);
+ self::assertEquals(MYSQL_PASSWORD, $readDetails['pass']);
}
- public function testGetDetails()
+ public function testGetWriteConnectionWithPort()
{
+ $config = new Config([
+ 'b8' => [
+ 'database' => [
+ 'servers' => [
+ 'read' => [
+ [
+ 'host' => 'localhost',
+ 'port' => 3306,
+ ],
+ ],
+ 'write' => [
+ [
+ 'host' => 'localhost',
+ 'port' => 3306,
+ ],
+ ],
+ ],
+ 'type' => Database::MYSQL_TYPE,
+ 'name' => MYSQL_DBNAME,
+ 'username' => MYSQL_USER,
+ 'password' => MYSQL_PASSWORD,
+ ],
+ ],
+ ]);
+ Database::reset();
+
$this->checkDatabaseConnection();
- $details = Database::getConnection('read')->getDetails();
- self::assertTrue(is_array($details));
- self::assertTrue(($details['db'] === MYSQL_DBNAME));
- self::assertTrue(($details['user'] === MYSQL_USER));
- self::assertTrue(($details['pass'] === MYSQL_PASSWORD));
+ $writeConnection = Database::getConnection('write');
+ $readConnection = Database::getConnection('read');
+
+ self::assertInstanceOf('\b8\Database', $writeConnection);
+ self::assertInstanceOf('\b8\Database', $readConnection);
}
/**
@@ -83,7 +130,7 @@ class DatabaseMysqlTest extends TestCase
['host' => 'localhost'],
],
],
- 'type' => 'mysql',
+ 'type' => Database::MYSQL_TYPE,
'name' => 'b8_test_2',
'username' => '',
'password' => '',
diff --git a/tests/B8Framework/DatabasePostgresqlTest.php b/tests/B8Framework/DatabasePostgresqlTest.php
index 5e7c1fde..b5c88166 100755
--- a/tests/B8Framework/DatabasePostgresqlTest.php
+++ b/tests/B8Framework/DatabasePostgresqlTest.php
@@ -21,7 +21,7 @@ class DatabasePostgresqlTest extends TestCase
['host' => 'localhost'],
],
],
- 'type' => 'pgsql',
+ 'type' => Database::POSTGRESQL_TYPE,
'name' => POSTGRESQL_DBNAME,
'username' => POSTGRESQL_USER,
'password' => POSTGRESQL_PASSWORD,
@@ -33,6 +33,10 @@ class DatabasePostgresqlTest extends TestCase
protected function checkDatabaseConnection()
{
+ if (!extension_loaded('pgsql')) {
+ $this->markTestSkipped('Test skipped because Pgsql extension doesn`t exist.');
+ }
+
try {
$connection = Database::getConnection('read');
} catch (\Exception $e) {
@@ -44,23 +48,66 @@ class DatabasePostgresqlTest extends TestCase
}
}
- public function testGetWriteConnection()
+ public function testGetConnection()
{
$this->checkDatabaseConnection();
- $connection = Database::getConnection('write');
- self::assertInstanceOf('\b8\Database', $connection);
+ $writeConnection = Database::getConnection('write');
+ $readConnection = Database::getConnection('read');
+
+ self::assertInstanceOf('\b8\Database', $writeConnection);
+ self::assertInstanceOf('\b8\Database', $readConnection);
+
+ $writeDetails = Database::getConnection('write')->getDetails();
+
+ self::assertTrue(is_array($writeDetails));
+ self::assertEquals(POSTGRESQL_DBNAME, $writeDetails['db']);
+ self::assertEquals(POSTGRESQL_USER, $writeDetails['user']);
+ self::assertEquals(POSTGRESQL_PASSWORD, $writeDetails['pass']);
+
+ $readDetails = Database::getConnection('read')->getDetails();
+
+ self::assertTrue(is_array($readDetails));
+ self::assertEquals(POSTGRESQL_DBNAME, $readDetails['db']);
+ self::assertEquals(POSTGRESQL_USER, $readDetails['user']);
+ self::assertEquals(POSTGRESQL_PASSWORD, $readDetails['pass']);
}
- public function testGetDetails()
+ public function testGetWriteConnectionWithPort()
{
+ $config = new Config([
+ 'b8' => [
+ 'database' => [
+ 'servers' => [
+ 'read' => [
+ [
+ 'host' => 'localhost',
+ 'port' => 5432,
+ ],
+ ],
+ 'write' => [
+ [
+ 'host' => 'localhost',
+ 'port' => 5432,
+ ],
+ ],
+ ],
+ 'type' => Database::POSTGRESQL_TYPE,
+ 'name' => POSTGRESQL_DBNAME,
+ 'username' => POSTGRESQL_USER,
+ 'password' => POSTGRESQL_PASSWORD,
+ ],
+ ],
+ ]);
+ Database::reset();
+
$this->checkDatabaseConnection();
- $details = Database::getConnection('read')->getDetails();
- self::assertTrue(is_array($details));
- self::assertTrue(($details['db'] === POSTGRESQL_DBNAME));
- self::assertTrue(($details['user'] === POSTGRESQL_USER));
- self::assertTrue(($details['pass'] === POSTGRESQL_PASSWORD));
+ $writeConnection = Database::getConnection('write');
+ $readConnection = Database::getConnection('read');
+
+ self::assertInstanceOf('\b8\Database', $writeConnection);
+ self::assertInstanceOf('\b8\Database', $readConnection);
}
/**
@@ -83,7 +130,7 @@ class DatabasePostgresqlTest extends TestCase
['host' => 'localhost'],
],
],
- 'type' => 'pgsql',
+ 'type' => Database::POSTGRESQL_TYPE,
'name' => 'b8_test_2',
'username' => '',
'password' => '',
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 85a5c392..113bf8bf 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,54 +1,42 @@
loadYaml($configFile);
-}
-
if (!defined('APP_URL') && !empty($config)) {
define('APP_URL', $config->get('php-censor.url', '') . '/');
}
-\PHPCensor\Helper\Lang::init($config, 'en');
-
-define('MYSQL_DBNAME', getenv('MYSQL_DBNAME'));
-define('MYSQL_USER', getenv('MYSQL_USER'));
-define('MYSQL_PASSWORD', getenv('MYSQL_PASSWORD'));
-
-define('POSTGRESQL_DBNAME', getenv('POSTGRESQL_DBNAME'));
-define('POSTGRESQL_USER', getenv('POSTGRESQL_USER'));
-define('POSTGRESQL_PASSWORD', getenv('POSTGRESQL_PASSWORD'));
+\PHPCensor\Helper\Lang::init($config);