diff options
author | Joas Schilling <coding@schilljs.com> | 2018-01-29 13:14:56 +0100 |
---|---|---|
committer | Morris Jobke <hey@morrisjobke.de> | 2018-01-29 15:47:37 +0100 |
commit | d971b104edc51ddf3819eded837de97357c3b395 (patch) | |
tree | 319d28bad58c1bd83c150950679fb4fa4a8369ef /lib/private/Settings | |
parent | 01482b32a171bb8529bc8baacbe764107e52e14c (diff) | |
download | nextcloud-server-d971b104edc51ddf3819eded837de97357c3b395.tar.gz nextcloud-server-d971b104edc51ddf3819eded837de97357c3b395.zip |
Do not cache the settings/sections in the database anymore
This caused more troubles then it had benefits, especially
when an app got disabled or was removed without being disabled.
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'lib/private/Settings')
-rw-r--r-- | lib/private/Settings/Manager.php | 452 | ||||
-rw-r--r-- | lib/private/Settings/Mapper.php | 217 | ||||
-rw-r--r-- | lib/private/Settings/RemoveOrphaned.php | 92 |
3 files changed, 151 insertions, 610 deletions
diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php index efeedbe6fcc..387460852ab 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -32,7 +32,6 @@ namespace OC\Settings; use OC\Accounts\AccountManager; use OCP\App\IAppManager; use OCP\AppFramework\QueryException; -use OCP\AutoloadNotAllowedException; use OCP\Encryption\IManager as EncryptionManager; use OCP\IConfig; use OCP\IDBConnection; @@ -54,8 +53,6 @@ class Manager implements IManager { private $log; /** @var IDBConnection */ private $dbc; - /** @var Mapper */ - private $mapper; /** @var IL10N */ private $l; /** @var IConfig */ @@ -76,8 +73,6 @@ class Manager implements IManager { private $groupManager; /** @var IFactory */ private $l10nFactory; - /** @var \OC_Defaults */ - private $defaults; /** @var IAppManager */ private $appManager; @@ -90,12 +85,11 @@ class Manager implements IManager { * @param IUserManager $userManager * @param ILockingProvider $lockingProvider * @param IRequest $request - * @param Mapper $mapper * @param IURLGenerator $url * @param AccountManager $accountManager * @param IGroupManager $groupManager * @param IFactory $l10nFactory - * @param \OC_Defaults $defaults + * @param IAppManager $appManager */ public function __construct( ILogger $log, @@ -106,17 +100,14 @@ class Manager implements IManager { IUserManager $userManager, ILockingProvider $lockingProvider, IRequest $request, - Mapper $mapper, IURLGenerator $url, AccountManager $accountManager, IGroupManager $groupManager, IFactory $l10nFactory, - \OC_Defaults $defaults, IAppManager $appManager ) { $this->log = $log; $this->dbc = $dbc; - $this->mapper = $mapper; $this->l = $l; $this->config = $config; $this->encryptionManager = $encryptionManager; @@ -127,233 +118,112 @@ class Manager implements IManager { $this->accountManager = $accountManager; $this->groupManager = $groupManager; $this->l10nFactory = $l10nFactory; - $this->defaults = $defaults; $this->appManager = $appManager; } + /** @var array */ + protected $sectionClasses = []; + + /** @var array */ + protected $sections = []; + /** - * @inheritdoc + * @param string $type 'admin' or 'personal' + * @param string $section Class must implement OCP\Settings\ISection + * @return void */ - public function setupSettings(array $settings) { - if (!empty($settings[IManager::KEY_ADMIN_SECTION])) { - foreach ($settings[IManager::KEY_ADMIN_SECTION] as $className) { - $this->setupSectionEntry($className, 'admin'); - } - } - if (!empty($settings[IManager::KEY_ADMIN_SETTINGS])) { - foreach ($settings[IManager::KEY_ADMIN_SETTINGS] as $className) { - $this->setupSettingsEntry($className, 'admin'); - } - } - - if (!empty($settings[IManager::KEY_PERSONAL_SECTION])) { - foreach ($settings[IManager::KEY_PERSONAL_SECTION] as $className) { - $this->setupSectionEntry($className, 'personal'); - } - } - if (!empty($settings[IManager::KEY_PERSONAL_SETTINGS])) { - foreach ($settings[IManager::KEY_PERSONAL_SETTINGS] as $className) { - $this->setupSettingsEntry($className, 'personal'); - } - } + public function registerSection(string $type, string $section) { + $this->sectionClasses[$section] = $type; } /** - * attempts to remove an apps section and/or settings entry. A listener is - * added centrally making sure that this method is called ones an app was - * disabled. - * - * @param string $appId - * @since 9.1.0 + * @param string $type 'admin' or 'personal' + * @return ISection[] */ - public function onAppDisabled($appId) { - $appInfo = \OC_App::getAppInfo($appId); // hello static legacy - - if (!empty($appInfo['settings'][IManager::KEY_ADMIN_SECTION])) { - foreach ($appInfo['settings'][IManager::KEY_ADMIN_SECTION] as $className) { - $this->mapper->remove(Mapper::TABLE_ADMIN_SECTIONS, trim($className, '\\')); - } - } - if (!empty($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS])) { - foreach ($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS] as $className) { - $this->mapper->remove(Mapper::TABLE_ADMIN_SETTINGS, trim($className, '\\')); - } + protected function getSections(string $type): array { + if (!isset($this->sections[$type])) { + $this->sections[$type] = []; } - if (!empty($appInfo['settings'][IManager::KEY_PERSONAL_SECTION])) { - foreach ($appInfo['settings'][IManager::KEY_PERSONAL_SECTION] as $className) { - $this->mapper->remove(Mapper::TABLE_PERSONAL_SECTIONS, trim($className, '\\')); - } - } - if (!empty($appInfo['settings'][IManager::KEY_PERSONAL_SETTINGS])) { - foreach ($appInfo['settings'][IManager::KEY_PERSONAL_SETTINGS] as $className) { - $this->mapper->remove(Mapper::TABLE_PERSONAL_SETTINGS, trim($className, '\\')); + foreach ($this->sectionClasses as $class => $sectionType) { + try { + /** @var ISection $section */ + $section = \OC::$server->query($class); + } catch (QueryException $e) { + $this->log->logException($e, ['level' => Util::INFO]); + continue; } - } - } - public function checkForOrphanedClassNames() { - $tables = [Mapper::TABLE_ADMIN_SECTIONS, Mapper::TABLE_ADMIN_SETTINGS, Mapper::TABLE_PERSONAL_SECTIONS, Mapper::TABLE_PERSONAL_SETTINGS]; - foreach ($tables as $table) { - $classes = $this->mapper->getClasses($table); - foreach ($classes as $className) { - try { - \OC::$server->query($className); - } catch (QueryException $e) { - $this->mapper->remove($table, $className); - } + if (!$section instanceof ISection) { + $this->log->logException(new \InvalidArgumentException('Invalid settings section registered'), ['level' => Util::INFO]); + continue; } - } - } - /** - * @param string $sectionClassName - * @param string $type either 'admin' or 'personal' - */ - private function setupSectionEntry($sectionClassName, $type) { - if (!class_exists($sectionClassName)) { - $this->log->debug('Could not find ' . ucfirst($type) . ' section class ' . $sectionClassName); - return; - } - try { - $section = $this->query($sectionClassName); - } catch (QueryException $e) { - // cancel - return; - } + $this->sections[$sectionType][$section->getID()] = $section; - if (!$section instanceof ISection) { - $this->log->error( - ucfirst($type) .' section instance must implement \OCP\ISection. Invalid class: {class}', - ['class' => $sectionClassName] - ); - return; - } - $table = $this->getSectionTableForType($type); - if(!$this->hasSection(get_class($section), $table)) { - $this->addSection($section, $table); - } else { - $this->updateSection($section, $table); + unset($this->sectionClasses[$class]); } - } - - private function addSection(ISection $section, $table) { - $this->mapper->add($table, [ - 'id' => $section->getID(), - 'class' => get_class($section), - 'priority' => $section->getPriority(), - ]); - } - private function addSettings(ISettings $settings, $table) { - $this->mapper->add($table, [ - 'class' => get_class($settings), - 'section' => $settings->getSection(), - 'priority' => $settings->getPriority(), - ]); + return $this->sections[$type]; } - private function updateSettings(ISettings $settings, $table) { - $this->mapper->update( - $table, - 'class', - get_class($settings), - [ - 'section' => $settings->getSection(), - 'priority' => $settings->getPriority(), - ] - ); - } + /** @var array */ + protected $settingClasses = []; - private function updateSection(ISection $section, $table) { - $this->mapper->update( - $table, - 'class', - get_class($section), - [ - 'id' => $section->getID(), - 'priority' => $section->getPriority(), - ] - ); - } + /** @var array */ + protected $settings = []; /** - * @param string $className - * @param string $table - * @return bool + * @param string $type 'admin' or 'personal' + * @param string $setting Class must implement OCP\Settings\ISetting + * @return void */ - private function hasSection($className, $table) { - return $this->mapper->has($table, $className); + public function registerSetting(string $type, string $setting) { + $this->settingClasses[$setting] = $type; } /** - * @param string $className - * @return bool + * @param string $type 'admin' or 'personal' + * @param string $section + * @return ISettings[] */ - private function hasSettings($className, $table) { - return $this->mapper->has($table, $className); - } - - private function setupSettingsEntry($settingsClassName, $type) { - if (!class_exists($settingsClassName)) { - $this->log->debug('Could not find ' . $type . ' section class ' . $settingsClassName); - return; + protected function getSettings(string $type, string $section): array { + if (!isset($this->settings[$type])) { + $this->settings[$type] = []; } - - try { - /** @var ISettings $settings */ - $settings = $this->query($settingsClassName); - } catch (QueryException $e) { - // cancel - return; + if (!isset($this->settings[$type][$section])) { + $this->settings[$type][$section] = []; } - if (!$settings instanceof ISettings) { - $this->log->error( - ucfirst($type) . ' section instance must implement \OCP\Settings\ISettings. Invalid class: {class}', - ['class' => $settingsClassName] - ); - return; - } - $table = $this->getSettingsTableForType($type); - if (!$this->hasSettings(get_class($settings), $table)) { - $this->addSettings($settings, $table); - } else { - $this->updateSettings($settings, $table); - } - } + foreach ($this->settingClasses as $class => $settingsType) { + try { + /** @var ISettings $setting */ + $setting = \OC::$server->query($class); + } catch (QueryException $e) { + $this->log->logException($e, ['level' => Util::INFO]); + continue; + } - private function getSectionTableForType($type) { - if($type === 'admin') { - return Mapper::TABLE_ADMIN_SECTIONS; - } else if($type === 'personal') { - return Mapper::TABLE_PERSONAL_SECTIONS; - } - throw new \InvalidArgumentException('"admin" or "personal" expected'); - } + if (!$setting instanceof ISettings) { + $this->log->logException(new \InvalidArgumentException('Invalid settings setting registered'), ['level' => Util::INFO]); + continue; + } - private function getSettingsTableForType($type) { - if($type === 'admin') { - return Mapper::TABLE_ADMIN_SETTINGS; - } else if($type === 'personal') { - return Mapper::TABLE_PERSONAL_SETTINGS; - } - throw new \InvalidArgumentException('"admin" or "personal" expected'); - } + if (!isset($this->settings[$settingsType][$setting->getSection()])) { + $this->settings[$settingsType][$setting->getSection()] = []; + } + $this->settings[$settingsType][$setting->getSection()][] = $setting; - private function query($className) { - try { - return \OC::$server->query($className); - } catch (QueryException $e) { - $this->log->logException($e, ['level' => Util::INFO]); - throw $e; + unset($this->settingClasses[$class]); } + + return $this->settings[$type][$section]; } /** * @inheritdoc */ - public function getAdminSections() { + public function getAdminSections(): array { // built-in sections $sections = [ 0 => [new Section('server', $this->l->t('Basic settings'), 0, $this->url->imagePath('settings', 'admin.svg'))], @@ -364,17 +234,15 @@ class Manager implements IManager { 99 => [new Section('tips-tricks', $this->l->t('Tips & tricks'), 0, $this->url->imagePath('settings', 'help.svg'))], ]; - $rows = $this->mapper->getAdminSectionsFromDB(); + $appSections = $this->getSections('admin'); - foreach ($rows as $row) { - if (!isset($sections[$row['priority']])) { - $sections[$row['priority']] = []; - } - try { - $sections[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip + foreach ($appSections as $section) { + /** @var ISection $section */ + if (!isset($sections[$section->getPriority()])) { + $sections[$section->getPriority()] = []; } + + $sections[$section->getPriority()][] = $section; } ksort($sections); @@ -386,39 +254,37 @@ class Manager implements IManager { * @param string $section * @return ISection[] */ - private function getBuiltInAdminSettings($section) { + private function getBuiltInAdminSettings($section): array { $forms = []; - try { - if ($section === 'server') { - /** @var ISettings $form */ - $form = new Admin\Server($this->dbc, $this->request, $this->config, $this->lockingProvider, $this->l); - $forms[$form->getPriority()] = [$form]; - $form = new Admin\ServerDevNotice(); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'encryption') { - /** @var ISettings $form */ - $form = new Admin\Encryption($this->encryptionManager, $this->userManager); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'sharing') { - /** @var ISettings $form */ - $form = new Admin\Sharing($this->config); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'additional') { - /** @var ISettings $form */ - $form = new Admin\Additional($this->config); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'tips-tricks') { - /** @var ISettings $form */ - $form = new Admin\TipsTricks($this->config); - $forms[$form->getPriority()] = [$form]; - } - } catch (QueryException $e) { - // skip + + if ($section === 'server') { + /** @var ISettings $form */ + $form = new Admin\Server($this->dbc, $this->request, $this->config, $this->lockingProvider, $this->l); + $forms[$form->getPriority()] = [$form]; + $form = new Admin\ServerDevNotice(); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'encryption') { + /** @var ISettings $form */ + $form = new Admin\Encryption($this->encryptionManager, $this->userManager); + $forms[$form->getPriority()] = [$form]; } + if ($section === 'sharing') { + /** @var ISettings $form */ + $form = new Admin\Sharing($this->config); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'additional') { + /** @var ISettings $form */ + $form = new Admin\Additional($this->config); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'tips-tricks') { + /** @var ISettings $form */ + $form = new Admin\TipsTricks($this->config); + $forms[$form->getPriority()] = [$form]; + } + return $forms; } @@ -426,58 +292,48 @@ class Manager implements IManager { * @param string $section * @return ISection[] */ - private function getBuiltInPersonalSettings($section) { + private function getBuiltInPersonalSettings($section): array { $forms = []; - try { - if ($section === 'personal-info') { - /** @var ISettings $form */ - $form = new Personal\PersonalInfo( - $this->config, - $this->userManager, - $this->groupManager, - $this->accountManager, - $this->appManager, - $this->l10nFactory, - $this->l - ); - $forms[$form->getPriority()] = [$form]; - } - if($section === 'security') { - /** @var ISettings $form */ - $form = new Personal\Security(); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'additional') { - /** @var ISettings $form */ - $form = new Personal\Additional($this->config); - $forms[$form->getPriority()] = [$form]; - } - } catch (QueryException $e) { - // skip + + if ($section === 'personal-info') { + /** @var ISettings $form */ + $form = new Personal\PersonalInfo( + $this->config, + $this->userManager, + $this->groupManager, + $this->accountManager, + $this->appManager, + $this->l10nFactory, + $this->l + ); + $forms[$form->getPriority()] = [$form]; + } + if($section === 'security') { + /** @var ISettings $form */ + $form = new Personal\Security(); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'additional') { + /** @var ISettings $form */ + $form = new Personal\Additional(); + $forms[$form->getPriority()] = [$form]; } + return $forms; } /** * @inheritdoc */ - public function getAdminSettings($section) { + public function getAdminSettings($section): array { $settings = $this->getBuiltInAdminSettings($section); - $dbRows = $this->mapper->getAdminSettingsFromDB($section); + $appSettings = $this->getSettings('admin', $section); - foreach ($dbRows as $row) { - if (!isset($settings[$row['priority']])) { - $settings[$row['priority']] = []; - } - try { - $settings[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip - } catch (AutoloadNotAllowedException $e) { - // skip error and remove remnant of disabled app - $this->log->warning('Orphan setting entry will be removed from admin_settings: ' . json_encode($row)); - $this->mapper->remove(Mapper::TABLE_ADMIN_SETTINGS, $row['class']); + foreach ($appSettings as $setting) { + if (!isset($settings[$setting->getPriority()])) { + $settings[$setting->getPriority()] = []; } + $settings[$setting->getPriority()][] = $setting; } ksort($settings); @@ -487,7 +343,7 @@ class Manager implements IManager { /** * @inheritdoc */ - public function getPersonalSections() { + public function getPersonalSections(): array { $sections = [ 0 => [new Section('personal-info', $this->l->t('Personal info'), 0, $this->url->imagePath('core', 'actions/info.svg'))], 5 => [new Section('security', $this->l->t('Security'), 0, $this->url->imagePath('settings', 'password.svg'))], @@ -495,21 +351,19 @@ class Manager implements IManager { ]; $legacyForms = \OC_App::getForms('personal'); - if(count($legacyForms) > 0 && $this->hasLegacyPersonalSettingsToRender($legacyForms)) { + if(!empty($legacyForms) && $this->hasLegacyPersonalSettingsToRender($legacyForms)) { $sections[98] = [new Section('additional', $this->l->t('Additional settings'), 0, $this->url->imagePath('core', 'actions/settings-dark.svg'))]; } - $rows = $this->mapper->getPersonalSectionsFromDB(); + $appSections = $this->getSections('personal'); - foreach ($rows as $row) { - if (!isset($sections[$row['priority']])) { - $sections[$row['priority']] = []; - } - try { - $sections[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip + foreach ($appSections as $section) { + /** @var ISection $section */ + if (!isset($sections[$section->getPriority()])) { + $sections[$section->getPriority()] = []; } + + $sections[$section->getPriority()][] = $section; } ksort($sections); @@ -518,10 +372,10 @@ class Manager implements IManager { } /** - * @param $forms + * @param string[] $forms * @return bool */ - private function hasLegacyPersonalSettingsToRender($forms) { + private function hasLegacyPersonalSettingsToRender(array $forms): bool { foreach ($forms as $form) { if(trim($form) !== '') { return true; @@ -533,19 +387,15 @@ class Manager implements IManager { /** * @inheritdoc */ - public function getPersonalSettings($section) { + public function getPersonalSettings($section): array { $settings = $this->getBuiltInPersonalSettings($section); - $dbRows = $this->mapper->getPersonalSettingsFromDB($section); + $appSettings = $this->getSettings('personal', $section); - foreach ($dbRows as $row) { - if (!isset($settings[$row['priority']])) { - $settings[$row['priority']] = []; - } - try { - $settings[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip + foreach ($appSettings as $setting) { + if (!isset($settings[$setting->getPriority()])) { + $settings[$setting->getPriority()] = []; } + $settings[$setting->getPriority()][] = $setting; } ksort($settings); diff --git a/lib/private/Settings/Mapper.php b/lib/private/Settings/Mapper.php deleted file mode 100644 index 1c05ea9fe30..00000000000 --- a/lib/private/Settings/Mapper.php +++ /dev/null @@ -1,217 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Robin Appelman <robin@icewind.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -namespace OC\Settings; - -use OCP\IDBConnection; - -class Mapper { - const TABLE_ADMIN_SETTINGS = 'admin_settings'; - const TABLE_ADMIN_SECTIONS = 'admin_sections'; - const TABLE_PERSONAL_SETTINGS = 'personal_settings'; - const TABLE_PERSONAL_SECTIONS = 'personal_sections'; - - /** @var IDBConnection */ - private $dbc; - - /** - * @param IDBConnection $dbc - */ - public function __construct(IDBConnection $dbc) { - $this->dbc = $dbc; - } - - /** - * Get the configured admin settings from the database for the provided section - * - * @param string $section - * @return array[] [['class' => string, 'priority' => int], ...] - */ - public function getAdminSettingsFromDB($section) { - return $this->getSettingsFromDB(self::TABLE_ADMIN_SETTINGS, $section); - } - - /** - * Get the configured personal settings from the database for the provided section - * - * @param string $section - * @return array[] [['class' => string, 'priority' => int], ...] - */ - public function getPersonalSettingsFromDB($section) { - return $this->getSettingsFromDB(self::TABLE_PERSONAL_SETTINGS, $section); - } - - /** - * Get the configured settings from the database for the provided table and section - * - * @param $table - * @param $section - * @return array - */ - private function getSettingsFromDB($table, $section) { - $query = $this->dbc->getQueryBuilder(); - $query->select(['class', 'priority']) - ->from($table) - ->where($query->expr()->eq('section', $this->dbc->getQueryBuilder()->createParameter('section'))) - ->setParameter('section', $section); - - $result = $query->execute(); - return $result->fetchAll(); - } - - /** - * Get the configured admin sections from the database - * - * @return array[] [['class' => string, 'priority' => int], ...] - */ - public function getAdminSectionsFromDB() { - return $this->getSectionsFromDB('admin'); - } - - /** - * Get the configured admin sections from the database - * - * @return array[] [['class' => string, 'priority' => int], ...] - */ - public function getPersonalSectionsFromDB() { - return $this->getSectionsFromDB('personal'); - } - - /** - * Get the configured sections from the database by table - * - * @param string $type either 'personal' or 'admin' - * @return array[] [['class' => string, 'priority' => int], ...] - */ - public function getSectionsFromDB($type) { - if($type === 'admin') { - $sectionsTable = self::TABLE_ADMIN_SECTIONS; - $settingsTable = self::TABLE_ADMIN_SETTINGS; - } else if($type === 'personal') { - $sectionsTable = self::TABLE_PERSONAL_SECTIONS; - $settingsTable = self::TABLE_PERSONAL_SETTINGS; - } else { - throw new \InvalidArgumentException('"admin" or "personal" expected'); - } - $query = $this->dbc->getQueryBuilder(); - $query->selectDistinct('s.class') - ->addSelect('s.priority') - ->from($sectionsTable, 's') - ->from($settingsTable, 'f') - ->where($query->expr()->eq('s.id', 'f.section')); - $result = $query->execute(); - return array_map(function ($row) { - $row['priority'] = (int)$row['priority']; - return $row; - }, $result->fetchAll()); - } - - /** - * @param string $table one of the Mapper::TABLE_* constants - * @param array $values - */ - public function add($table, array $values) { - $query = $this->dbc->getQueryBuilder(); - $values = array_map(function ($value) use ($query) { - return $query->createNamedParameter($value); - }, $values); - $query->insert($table)->values($values); - $query->execute(); - } - - /** - * returns the registered classes in the given table - * - * @param string $table one of the Mapper::TABLE_* constants - * @return string[] - */ - public function getClasses($table) { - $q = $this->dbc->getQueryBuilder(); - $resultStatement = $q->select('class') - ->from($table) - ->execute(); - $data = $resultStatement->fetchAll(); - $resultStatement->closeCursor(); - - return array_map(function ($row) { - return $row['class']; - }, $data); - } - - /** - * Check if a class is configured in the database - * - * @param string $table one of the Mapper::TABLE_* constants - * @param string $className - * @return bool - */ - public function has($table, $className) { - $query = $this->dbc->getQueryBuilder(); - $query->select('class') - ->from($table) - ->where($query->expr()->eq('class', $query->createNamedParameter($className))) - ->setMaxResults(1); - - $result = $query->execute(); - $row = $result->fetch(); - $result->closeCursor(); - - return (bool)$row; - } - - /** - * deletes an settings or admin entry from the given table - * - * @param string $table one of the Mapper::TABLE_* constants - * @param string $className - */ - public function remove($table, $className) { - $query = $this->dbc->getQueryBuilder(); - $query->delete($table) - ->where($query->expr()->eq('class', $query->createNamedParameter($className))); - - $query->execute(); - } - - /** - * @param string $table one of the Mapper::TABLE_* constants - * @param string $idCol - * @param string $id - * @param array $values - * @suppress SqlInjectionChecker - */ - public function update($table, $idCol, $id, $values) { - $query = $this->dbc->getQueryBuilder(); - $query->update($table); - foreach ($values as $key => $value) { - $query->set($key, $query->createNamedParameter($value)); - } - $query - ->where($query->expr()->eq($idCol, $query->createParameter($idCol))) - ->setParameter($idCol, $id) - ->execute(); - } - -} diff --git a/lib/private/Settings/RemoveOrphaned.php b/lib/private/Settings/RemoveOrphaned.php deleted file mode 100644 index 790ca060022..00000000000 --- a/lib/private/Settings/RemoveOrphaned.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -namespace OC\Settings; - -use OC\BackgroundJob\JobList; -use OC\BackgroundJob\TimedJob; -use OC\NeedsUpdateException; -use OCP\BackgroundJob\IJobList; -use OCP\ILogger; - -/** - * Class RemoveOrphaned - * - * @package OC\Settings - */ -class RemoveOrphaned extends TimedJob { - - /** @var IJobList */ - private $jobList; - - /** @var ILogger */ - private $logger; - - /** @var Manager */ - private $manager; - - public function __construct(Manager $manager = null) { - if($manager !== null) { - $this->manager = $manager; - } else { - // fix DI for Jobs - $this->manager = \OC::$server->getSettingsManager(); - } - } - - /** - * run the job, then remove it from the job list - * - * @param JobList $jobList - * @param ILogger|null $logger - */ - public function execute($jobList, ILogger $logger = null) { - // add an interval of 15 mins - $this->setInterval(15*60); - - $this->jobList = $jobList; - $this->logger = $logger; - parent::execute($jobList, $logger); - } - - /** - * @param array $argument - * @throws \Exception - * @throws \OC\NeedsUpdateException - */ - protected function run($argument) { - try { - \OC_App::loadApps(); - } catch (NeedsUpdateException $ex) { - // only run when apps are up to date - return; - } - - $this->manager->checkForOrphanedClassNames(); - - // remove the job once executed successfully - $this->jobList->remove($this); - } - -} |