From 0861fd73d29d572ecade3480a76128179a3cb297 Mon Sep 17 00:00:00 2001 From: Dmitriy Simushev Date: Fri, 7 Sep 2012 13:27:40 +0000 Subject: [PATCH] Removed global variables from the Database class constructor and updated tests for the Database class --- .../webim/classes/DatabaseTest.php | 54 +++---- src/messenger/webim/libs/classes/database.php | 134 ++++++++++-------- src/messenger/webim/libs/common.php | 12 ++ 3 files changed, 117 insertions(+), 83 deletions(-) diff --git a/src/messenger/tests/server_side/webim/classes/DatabaseTest.php b/src/messenger/tests/server_side/webim/classes/DatabaseTest.php index d3de1f4e..ad05dfde 100644 --- a/src/messenger/tests/server_side/webim/classes/DatabaseTest.php +++ b/src/messenger/tests/server_side/webim/classes/DatabaseTest.php @@ -22,16 +22,19 @@ class DatabaseTest extends PHPUnit_Framework_TestCase { $this->object = Database::getInstance(); } - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() { - $this->object->__destruct(); - } - public static function setUpBeforeClass() { - global $mysqlhost, $mysqllogin, $mysqlpass, $mysqldb; + global $mysqlhost, $mysqllogin, $mysqlpass, $mysqldb, $dbencoding, + $mysqlprefix, $use_persistent_connection, $force_charset_in_connection; + Database::initialize( + $mysqlhost, + $mysqllogin, + $mysqlpass, + $use_persistent_connection, + $mysqldb, + $mysqlprefix, + $force_charset_in_connection, + $dbencoding + ); $dbh = new PDO( "mysql:host={$mysqlhost};dbname={$mysqldb}", $mysqllogin, @@ -53,6 +56,7 @@ class DatabaseTest extends PHPUnit_Framework_TestCase { ); $dbh->exec("DROP TABLE phpunit_test_only"); $dbh = NULL; + Database::destroy(); } public function testGetInstance() { @@ -61,6 +65,22 @@ class DatabaseTest extends PHPUnit_Framework_TestCase { $anotherDatabaseInstance = NULL; } + public function testErrorInfo() { + $this->object->throwExeptions(true); + $this->assertFalse($this->object->errorInfo()); + try{ + $this->object->query("SOME_FAKE_QUERY"); + $this->fail('Exception must be thrown!'); + } catch(Exception $e) { + $errorInfo = $this->object->errorInfo(); + $this->assertEquals('42000', $errorInfo[0]); + $this->assertEquals(1064, $errorInfo[1]); + } + $this->object->query("SELECT 'test_value'"); + $errorInfo = $this->object->errorInfo(); + $this->assertEquals('00000', $errorInfo[0]); + } + public function testQuery() { global $mysqlprefix; @@ -141,22 +161,6 @@ class DatabaseTest extends PHPUnit_Framework_TestCase { $this->assertEquals($mysqlprefix.'test', $result['field_name']); } - public function testErrorInfo() { - $this->object->throwExeptions(true); - $this->assertFalse($this->object->errorInfo()); - try{ - $this->object->query("SOME_FAKE_QUERY"); - $this->fail('Exception must be thrown!'); - } catch(Exception $e) { - $errorInfo = $this->object->errorInfo(); - $this->assertEquals('42000', $errorInfo[0]); - $this->assertEquals(1064, $errorInfo[1]); - } - $this->object->query("SELECT 'test_value'"); - $errorInfo = $this->object->errorInfo(); - $this->assertEquals('00000', $errorInfo[0]); - } - public function testInsertedId() { $this->object->query("INSERT INTO phpunit_test_only (id) VALUES (NULL)"); $actual_id = $this->object->insertedId(); diff --git a/src/messenger/webim/libs/classes/database.php b/src/messenger/webim/libs/classes/database.php index 35194b22..c838e6f9 100644 --- a/src/messenger/webim/libs/classes/database.php +++ b/src/messenger/webim/libs/classes/database.php @@ -111,80 +111,98 @@ Class Database{ protected $throwExceptions = false; /** - * Get instance of Database class. If no instance exists, creates new instance. + * Get instance of Database class. + * + * If no instance exists, creates new instance. + * Use Database::initialize() before try to get an instance. If database was not initilize coorectly triggers an + * error with E_USER_ERROR level. * * @return Database + * @see Database::initialize() */ public static function getInstance(){ if (is_null(self::$instance)) { - self::$instance = new Database(); + trigger_error('Database was not initialized correctly', E_USER_ERROR); } return self::$instance; } + /** + * Destroy internal database object + */ + public static function destroy(){ + if (! is_null(self::$instance)) { + self::$instance->__destruct(); + self::$instance = NULL; + } + } + + /** + * Initialize database. + * + * Set internal database and connectionproperties. Create Database object. Create PDO object and store it in the + * Database object. + * + * @param string $host Database host. + * @param string $user Database user name. + * @param string $pass Database for user with $name password. + * @param boolean $use_pconn Control use persistent connection to the database or not. + * @param string $db Database name. + * @param string $prefix Database tables prefix + * @param boolean $force_charset Control force charset in conection or not. + * @param string $encoding Contains connection encoding. Using only if $force_charset = true. + */ + public static function initialize($host, $user, $pass, $use_pconn, $db, $prefix, $force_charset = false, $encoding = 'utf8') { + // Check PDO + if (! extension_loaded('PDO')) { + throw new Exception('PDO extension is not loaded'); + } + + if (! extension_loaded('pdo_mysql')) { + throw new Exception('pdo_mysql extension is not loaded'); + } + + // Check if initialization + if (! is_null(self::$instance)) { + throw new Exception('Database already initialized'); + } + + // Create database instance + $instance = new Database(); + // Set database and connection properties + $instance->dbHost = $host; + $instance->dbLogin = $user; + $instance->dbPass = $pass; + $instance->dbName = $db; + $instance->dbEncoding = $encoding; + $instance->tablesPrefix = $prefix; + $instance->forceCharsetInConnection = $force_charset; + $instance->usePersistentConnection = $use_pconn; + + // Create PDO object + $instance->dbh = new PDO( + "mysql:host={$instance->dbHost};dbname={$instance->dbName}", + $instance->dbLogin, + $instance->dbPass + ); + + if ($instance->forceCharsetInConnection) { + $instance->dbh->exec("SET NAMES ".$instance->dbh->quote($instance->dbEncoding)); + } + + // Store instance + self::$instance = $instance; + } + /** * Forbid clone objects */ private final function __clone() {} /** - * Database class constructor. Set internal database and connection - * properties. Create PDO object and store it in the Database object. - * - * @global string $mysqlhost Contains mysql host. defined in - * libs/config.php - * @global string $mysqllogin Contains mysql login. Defined in - * libs/config.php - * @global string $mysqlpass Contains mysql password. Defined in - * libs/config.php - * @global string $mysqldb Contains mysql database name. Defined in - * libs/config.php - * @global string $dbencoding Contains connection encoding. Defined in - * libs/config.php - * @global string $mysqlprefix Contains mysql tables prefix. Defined in - * libs/config.php - * @global boolean $force_charset_in_connection Control force charset in - * conection or not. Defined in libs/config.php - * @global boolean $use_persistent_connection Control use persistent - * connection to the database or not. Defined in libs/config.php + * Forbid external object creation */ - protected function __construct(){ - global $mysqlhost, $mysqllogin, $mysqlpass, $mysqldb, $dbencoding, - $mysqlprefix, $force_charset_in_connection, $use_persistent_connection; - try{ - if (! extension_loaded('PDO')) { - throw new Exception('PDO extension is not loaded'); - } - - if (! extension_loaded('pdo_mysql')) { - throw new Exception('pdo_mysql extension is not loaded'); - } - - // Set database and connection properties - $this->dbHost = $mysqlhost; - $this->dbLogin = $mysqllogin; - $this->dbPass = $mysqlpass; - $this->dbName = $mysqldb; - $this->dbEncoding = $dbencoding; - $this->tablesPrefix = $mysqlprefix; - $this->forceCharsetInConnection = $force_charset_in_connection; - $this->usePersistentConnection = $use_persistent_connection; - - // Create PDO object - $this->dbh = new PDO( - "mysql:host={$this->dbHost};dbname={$this->dbName}", - $this->dbLogin, - $this->dbPass - ); - - if ($this->forceCharsetInConnection) { - $this->dbh->exec("SET NAMES ".$this->dbh->quote($this->dbEncoding)); - } - - } catch(Exception $e) { - $this->handleError($e); - } - } + protected function __construct() {} /** * Handles errors diff --git a/src/messenger/webim/libs/common.php b/src/messenger/webim/libs/common.php index 2467efe3..2278c7d8 100644 --- a/src/messenger/webim/libs/common.php +++ b/src/messenger/webim/libs/common.php @@ -26,6 +26,18 @@ require_once(dirname(__FILE__) . '/classes/settings.php'); $version = '1.6.5'; $jsver = "165"; +// Initialize the database +Database::initialize( + $mysqlhost, + $mysqllogin, + $mysqlpass, + $use_persistent_connection, + $mysqldb, + $mysqlprefix, + $force_charset_in_connection, + $dbencoding +); + function myiconv($in_enc, $out_enc, $string) { global $_utf8win1251, $_win1251utf8;