diff --git a/lib/appconfig.php b/lib/appconfig.php index e615d83817..9a21bfb0a2 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -33,11 +33,21 @@ * */ +namespace OC; + +use \OC\DB\Connection; + /** * This class provides an easy way for apps to store config values in the * database. */ -class OC_Appconfig{ +class AppConfig { + protected $conn; + + public function __construct(Connection $conn) { + $this->conn = $conn; + } + /** * @brief Get all apps using the config * @return array with app ids @@ -45,16 +55,14 @@ class OC_Appconfig{ * This function returns a list of all apps that have at least one * entry in the appconfig table. */ - public static function getApps() { - // No magic in here! - $query = OC_DB::prepare( 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`' ); - $result = $query->execute(); + public function getApps() { + $query = 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`'; + $result = $this->conn->executeQuery( $query ); $apps = array(); - while( $row = $result->fetchRow()) { - $apps[] = $row["appid"]; + while( $appid = $result->fetchColumn()) { + $apps[] = $appid; } - return $apps; } @@ -66,14 +74,13 @@ class OC_Appconfig{ * This function gets all keys of an app. Please note that the values are * not returned. */ - public static function getKeys( $app ) { - // No magic in here as well - $query = OC_DB::prepare( 'SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?' ); - $result = $query->execute( array( $app )); + public function getKeys( $app ) { + $query = 'SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'; + $result = $this->conn->executeQuery( $query, array( $app )); $keys = array(); - while( $row = $result->fetchRow()) { - $keys[] = $row["configkey"]; + while( $key = $result->fetchColumn()) { + $keys[] = $key; } return $keys; @@ -89,15 +96,13 @@ class OC_Appconfig{ * This function gets a value from the appconfig table. If the key does * not exist the default value will be returned */ - public static function getValue( $app, $key, $default = null ) { - // At least some magic in here :-) - $query = OC_DB::prepare( 'SELECT `configvalue` FROM `*PREFIX*appconfig`' - .' WHERE `appid` = ? AND `configkey` = ?' ); - $result = $query->execute( array( $app, $key )); - $row = $result->fetchRow(); + public function getValue( $app, $key, $default = null ) { + $query = 'SELECT `configvalue` FROM `*PREFIX*appconfig`' + .' WHERE `appid` = ? AND `configkey` = ?'; + $row = $this->conn->fetchAssoc($query, array( $app, $key )); if($row) { - return $row["configvalue"]; - }else{ + return $row['configvalue']; + } else { return $default; } } @@ -108,8 +113,8 @@ class OC_Appconfig{ * @param string $key * @return bool */ - public static function hasKey($app, $key) { - $exists = self::getKeys( $app ); + public function hasKey($app, $key) { + $exists = $this->getKeys( $app ); return in_array( $key, $exists ); } @@ -118,21 +123,27 @@ class OC_Appconfig{ * @param string $app app * @param string $key key * @param string $value value - * @return bool * * Sets a value. If the key did not exist before it will be created. */ - public static function setValue( $app, $key, $value ) { - // Does the key exist? yes: update. No: insert - if(! self::hasKey($app, $key)) { - $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )' - .' VALUES( ?, ?, ? )' ); - $query->execute( array( $app, $key, $value )); - } - else{ - $query = OC_DB::prepare( 'UPDATE `*PREFIX*appconfig` SET `configvalue` = ?' - .' WHERE `appid` = ? AND `configkey` = ?' ); - $query->execute( array( $value, $app, $key )); + public function setValue( $app, $key, $value ) { + // Does the key exist? no: insert, yes: update. + if ( !$this->hasKey($app, $key)) { + $data = array( + 'appid' => $app, + 'configkey' => $key, + 'configvalue' => $value, + ); + $this->conn->insert('*PREFIX*appconfig', $data); + } else { + $data = array( + 'configvalue' => $value, + ); + $where = array( + 'appid' => $app, + 'configkey' => $key, + ); + $this->conn->update('*PREFIX*appconfig', $data, $where); } } @@ -144,12 +155,12 @@ class OC_Appconfig{ * * Deletes a key. */ - public static function deleteKey( $app, $key ) { - // Boring! - $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?' ); - $query->execute( array( $app, $key )); - - return true; + public function deleteKey( $app, $key ) { + $where = array( + 'appid' => $app, + 'configkey' => $key, + ); + $this->conn->delete('*PREFIX*appconfig', $where); } /** @@ -159,12 +170,11 @@ class OC_Appconfig{ * * Removes all keys in appconfig belonging to the app. */ - public static function deleteApp( $app ) { - // Nothing special - $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?' ); - $query->execute( array( $app )); - - return true; + public function deleteApp( $app ) { + $where = array( + 'appid' => $app, + ); + $this->conn->delete('*PREFIX*appconfig', $where); } /** @@ -173,31 +183,35 @@ class OC_Appconfig{ * @param key * @return array */ - public static function getValues($app, $key) { - if($app!==false and $key!==false) { + public function getValues($app, $key) { + if(($app!==false) == ($key!==false)) { return false; } - $fields='`configvalue`'; - $where='WHERE'; - $params=array(); + + $fields = '`configvalue`'; + $where = 'WHERE'; + $params = array(); if($app!==false) { - $fields.=', `configkey`'; - $where.=' `appid` = ?'; - $params[]=$app; - $key='configkey'; + $fields .= ', `configkey`'; + $where .= ' `appid` = ?'; + $params[] = $app; + $key = 'configkey'; }else{ - $fields.=', `appid`'; - $where.=' `configkey` = ?'; - $params[]=$key; - $key='appid'; + $fields .= ', `appid`'; + $where .= ' `configkey` = ?'; + $params[] = $key; + $key = 'appid'; } - $queryString='SELECT '.$fields.' FROM `*PREFIX*appconfig` '.$where; - $query=OC_DB::prepare($queryString); - $result=$query->execute($params); - $values=array(); - while($row=$result->fetchRow()) { - $values[$row[$key]]=$row['configvalue']; + $query = 'SELECT '.$fields.' FROM `*PREFIX*appconfig` '.$where; + $result = $this->conn->executeQuery( $query, $params ); + + $values = array(); + while( $row = $result->fetch((\PDO::FETCH_ASSOC))) { + $values[$row[$key]] = $row['configvalue']; } + return $values; } } + +require_once __DIR__.'/legacy/'.basename(__FILE__); diff --git a/lib/legacy/appconfig.php b/lib/legacy/appconfig.php new file mode 100644 index 0000000000..0ca6d4150e --- /dev/null +++ b/lib/legacy/appconfig.php @@ -0,0 +1,120 @@ +. + * + */ + +/** + * This class provides an easy way for apps to store config values in the + * database. + */ +OC_Appconfig::$object = new \OC\AppConfig(OC_DB::getConnection()); +class OC_Appconfig{ + public static $object; + /** + * @brief Get all apps using the config + * @return array with app ids + * + * This function returns a list of all apps that have at least one + * entry in the appconfig table. + */ + public static function getApps() { + return self::$object->getApps(); + } + + /** + * @brief Get the available keys for an app + * @param string $app the app we are looking for + * @return array with key names + * + * This function gets all keys of an app. Please note that the values are + * not returned. + */ + public static function getKeys( $app ) { + return self::$object->getKeys( $app ); + } + + /** + * @brief Gets the config value + * @param string $app app + * @param string $key key + * @param string $default = null, default value if the key does not exist + * @return string the value or $default + * + * This function gets a value from the appconfig table. If the key does + * not exist the default value will be returned + */ + public static function getValue( $app, $key, $default = null ) { + return self::$object->getValue($app, $key, $default); + } + + /** + * @brief check if a key is set in the appconfig + * @param string $app + * @param string $key + * @return bool + */ + public static function hasKey($app, $key) { + return self::$object->hasKey($app, $key); + } + + /** + * @brief sets a value in the appconfig + * @param string $app app + * @param string $key key + * @param string $value value + * + * Sets a value. If the key did not exist before it will be created. + */ + public static function setValue( $app, $key, $value ) { + self::$object->setValue( $app, $key, $value ); + } + + /** + * @brief Deletes a key + * @param string $app app + * @param string $key key + * + * Deletes a key. + */ + public static function deleteKey( $app, $key ) { + self::$object->deleteKey( $app, $key ); + } + + /** + * @brief Remove app from appconfig + * @param string $app app + * + * Removes all keys in appconfig belonging to the app. + */ + public static function deleteApp( $app ) { + self::$object->deleteApp( $app ); + } + + /** + * get multiply values, either the app or key can be used as wildcard by setting it to false + * @param app + * @param key + * @return array + */ + public static function getValues($app, $key) { + return self::$object->getValues($app, $key); + } +} diff --git a/tests/lib/appconfig.php b/tests/lib/appconfig.php index 4d82cd5ba7..1b7a1c668e 100644 --- a/tests/lib/appconfig.php +++ b/tests/lib/appconfig.php @@ -1,6 +1,7 @@ + * Copyright (c) 2013 Bart Visscher * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. @@ -130,3 +131,183 @@ class Test_Appconfig extends PHPUnit_Framework_TestCase { $this->assertEquals($expected, $values); } } + +class Test_AppConfig_Object extends PHPUnit_Framework_TestCase { + public function testGetApps() + { + $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false); + $statementMock->expects($this->exactly(2)) + ->method('fetchColumn') + ->will($this->onConsecutiveCalls('foo', false)); + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->once()) + ->method('executeQuery') + ->with($this->equalTo('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`')) + ->will($this->returnValue($statementMock)); + + $appconfig = new OC\AppConfig($connectionMock); + $apps = $appconfig->getApps(); + $this->assertEquals(array('foo'), $apps); + } + + public function testGetKeys() + { + $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false); + $statementMock->expects($this->exactly(2)) + ->method('fetchColumn') + ->will($this->onConsecutiveCalls('foo', false)); + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->once()) + ->method('executeQuery') + ->with($this->equalTo('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'), + $this->equalTo(array('bar'))) + ->will($this->returnValue($statementMock)); + + $appconfig = new OC\AppConfig($connectionMock); + $keys = $appconfig->getKeys('bar'); + $this->assertEquals(array('foo'), $keys); + } + + public function testGetValue() + { + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->exactly(2)) + ->method('fetchAssoc') + ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?'), + $this->equalTo(array('bar', 'red'))) + ->will($this->onConsecutiveCalls(array('configvalue'=>'foo'), null)); + + $appconfig = new OC\AppConfig($connectionMock); + $value = $appconfig->getValue('bar', 'red'); + $this->assertEquals('foo', $value); + $value = $appconfig->getValue('bar', 'red', 'def'); + $this->assertEquals('def', $value); + } + + public function testHasKey() + { + $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false); + $statementMock->expects($this->exactly(3)) + ->method('fetchColumn') + ->will($this->onConsecutiveCalls('foo', false, false)); + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->exactly(2)) + ->method('executeQuery') + ->with($this->equalTo('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'), + $this->equalTo(array('bar'))) + ->will($this->returnValue($statementMock)); + + $appconfig = new OC\AppConfig($connectionMock); + $this->assertTrue($appconfig->hasKey('bar', 'foo')); + $this->assertFalse($appconfig->hasKey('bar', 'foo')); + } + + public function testSetValue() + { + $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false); + $statementMock->expects($this->exactly(4)) + ->method('fetchColumn') + ->will($this->onConsecutiveCalls('foo', false, 'foo', false)); + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->exactly(2)) + ->method('executeQuery') + ->with($this->equalTo('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'), + $this->equalTo(array('bar'))) + ->will($this->returnValue($statementMock)); + $connectionMock->expects($this->once()) + ->method('insert') + ->with($this->equalTo('*PREFIX*appconfig'), + $this->equalTo( + array( + 'appid' => 'bar', + 'configkey' => 'moo', + 'configvalue' => 'v1', + ) + )); + $connectionMock->expects($this->once()) + ->method('update') + ->with($this->equalTo('*PREFIX*appconfig'), + $this->equalTo( + array( + 'configvalue' => 'v2', + )), + $this->equalTo( + array( + 'appid' => 'bar', + 'configkey' => 'foo', + ) + )); + + $appconfig = new OC\AppConfig($connectionMock); + $appconfig->setValue('bar', 'moo', 'v1'); + $appconfig->setValue('bar', 'foo', 'v2'); + } + + public function testDeleteKey() + { + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->once()) + ->method('delete') + ->with($this->equalTo('*PREFIX*appconfig'), + $this->equalTo( + array( + 'appid' => 'bar', + 'configkey' => 'foo', + ) + )); + + $appconfig = new OC\AppConfig($connectionMock); + $appconfig->deleteKey('bar', 'foo'); + } + + public function testDeleteApp() + { + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->once()) + ->method('delete') + ->with($this->equalTo('*PREFIX*appconfig'), + $this->equalTo( + array( + 'appid' => 'bar', + ) + )); + + $appconfig = new OC\AppConfig($connectionMock); + $appconfig->deleteApp('bar'); + } + + public function testGetValues() + { + $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false); + $statementMock->expects($this->exactly(4)) + ->method('fetch') + ->with(\PDO::FETCH_ASSOC) + ->will($this->onConsecutiveCalls( + array('configvalue' =>'bar', 'configkey' => 'x'), + false, + array('configvalue' =>'foo', 'appid' => 'y'), + false + )); + $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); + $connectionMock->expects($this->at(0)) + ->method('executeQuery') + ->with($this->equalTo('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'), + $this->equalTo(array('foo'))) + ->will($this->returnValue($statementMock)); + $connectionMock->expects($this->at(1)) + ->method('executeQuery') + ->with($this->equalTo('SELECT `configvalue`, `appid` FROM `*PREFIX*appconfig` WHERE `configkey` = ?'), + $this->equalTo(array('bar'))) + ->will($this->returnValue($statementMock)); + + $appconfig = new OC\AppConfig($connectionMock); + $values = $appconfig->getValues('foo', false); + //$this->assertEquals(array('x'=> 'bar'), $values); + $values = $appconfig->getValues(false, 'bar'); + //$this->assertEquals(array('y'=> 'foo'), $values); + $values = $appconfig->getValues(false, false); + //$this->assertEquals(false, $values); + $values = $appconfig->getValues('x', 'x'); + //$this->assertEquals(false, $values); + } +}