From c6377e9125ed2a1b508dd1d2e12db8a82934f648 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 16 Dec 2013 17:22:44 +0100 Subject: [PATCH] Fixed apps loading order On SQLite the app order can be arbitrary and cause strange bugs. On MySQL, the app order seems to be always alphabetical. This fix enforces alphabetical order to make sure that all environments behave the same and to reduce bugs related to app loading order. Fixes #6442 --- lib/private/app.php | 10 ++++++---- lib/private/appconfig.php | 2 +- tests/lib/app.php | 13 +++++++++++++ tests/lib/appconfig.php | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/private/app.php b/lib/private/app.php index eca40a81cc1..34c00e97fb9 100644 --- a/lib/private/app.php +++ b/lib/private/app.php @@ -166,20 +166,22 @@ class OC_App{ * get all enabled apps */ private static $enabledAppsCache = array(); - public static function getEnabledApps() { + public static function getEnabledApps($forceRefresh = false) { if(!OC_Config::getValue('installed', false)) { return array(); } - if(!empty(self::$enabledAppsCache)) { + if(!$forceRefresh && !empty(self::$enabledAppsCache)) { return self::$enabledAppsCache; } $apps=array('files'); $sql = 'SELECT `appid` FROM `*PREFIX*appconfig`' - .' WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\''; + . ' WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\'' + . ' ORDER BY `appid`'; if (OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') { //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison $sql = 'SELECT `appid` FROM `*PREFIX*appconfig`' - .' WHERE `configkey` = \'enabled\' AND to_char(`configvalue`)=\'yes\''; + . ' WHERE `configkey` = \'enabled\' AND to_char(`configvalue`)=\'yes\'' + . ' ORDER BY `appid`'; } $query = OC_DB::prepare( $sql ); $result=$query->execute(); diff --git a/lib/private/appconfig.php b/lib/private/appconfig.php index dfe03698059..da0b2ff8604 100644 --- a/lib/private/appconfig.php +++ b/lib/private/appconfig.php @@ -52,7 +52,7 @@ class OC_Appconfig { */ public static function getApps() { // No magic in here! - $query = OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`'); + $query = OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig` ORDER BY `appid`'); $result = $query->execute(); $apps = array(); diff --git a/tests/lib/app.php b/tests/lib/app.php index 52eade90a6e..49f40f089bb 100644 --- a/tests/lib/app.php +++ b/tests/lib/app.php @@ -79,4 +79,17 @@ class Test_App extends PHPUnit_Framework_TestCase { $this->assertFalse(OC_App::isAppVersionCompatible($oc, $app)); } + /** + * Tests that the app order is correct + */ + public function testGetEnabledAppsIsSorted() { + $apps = \OC_App::getEnabledApps(true); + // copy array + $sortedApps = $apps; + sort($sortedApps); + // 'files' is always on top + unset($sortedApps[array_search('files', $sortedApps)]); + array_unshift($sortedApps, 'files'); + $this->assertEquals($sortedApps, $apps); + } } diff --git a/tests/lib/appconfig.php b/tests/lib/appconfig.php index 4d82cd5ba7b..23dd2549e32 100644 --- a/tests/lib/appconfig.php +++ b/tests/lib/appconfig.php @@ -35,7 +35,7 @@ class Test_Appconfig extends PHPUnit_Framework_TestCase { } public function testGetApps() { - $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`'); + $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig` ORDER BY `appid`'); $result = $query->execute(); $expected = array(); while ($row = $result->fetchRow()) { -- 2.39.5