From 3d404671e885d971e1e4d42bb4744bf016ba1368 Mon Sep 17 00:00:00 2001 From: Jean-Christian Denis Date: Mon, 24 Apr 2023 12:08:08 +0200 Subject: [PATCH] update cleaners with descriptor and related contents --- src/Cleaner/Caches.php | 14 +++++++-- src/Cleaner/Logs.php | 34 ++++++++++---------- src/Cleaner/Plugins.php | 16 ++++++++-- src/Cleaner/Preferences.php | 63 ++++++++++++++++++++++++++----------- src/Cleaner/Settings.php | 63 ++++++++++++++++++++++++++----------- src/Cleaner/Tables.php | 23 +++++++------- src/Cleaner/Themes.php | 16 ++++++++-- src/Cleaner/Vars.php | 14 +++++++-- src/Cleaner/Versions.php | 29 +++++++++++------ 9 files changed, 187 insertions(+), 85 deletions(-) diff --git a/src/Cleaner/Caches.php b/src/Cleaner/Caches.php index 7f5f639..ad140ca 100644 --- a/src/Cleaner/Caches.php +++ b/src/Cleaner/Caches.php @@ -17,7 +17,8 @@ namespace Dotclear\Plugin\Uninstaller\Cleaner; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, ActionDescriptor, - TraitCleanerDir + TraitCleanerDir, + ValueDescriptor }; class Caches extends AbstractCleaner @@ -60,7 +61,16 @@ class Caches extends AbstractCleaner public function values(): array { - return self::getDirs(DC_TPL_CACHE); + $res = []; + foreach(self::getDirs(DC_TPL_CACHE) as $dir) { + $res[] = new ValueDescriptor( + $dir['key'], + '', + (int) $dir['value'] + ); + } + + return $res; } public function execute(string $action, string $ns): bool diff --git a/src/Cleaner/Logs.php b/src/Cleaner/Logs.php index 9a4700a..70baab4 100644 --- a/src/Cleaner/Logs.php +++ b/src/Cleaner/Logs.php @@ -22,7 +22,8 @@ use Dotclear\Database\Statement\{ }; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, - ActionDescriptor + ActionDescriptor, + ValueDescriptor }; class Logs extends AbstractCleaner @@ -61,31 +62,28 @@ class Logs extends AbstractCleaner { $sql = new SelectStatement(); $sql->from(dcCore::app()->prefix . dcLog::LOG_TABLE_NAME) - ->columns(['log_table']) + ->columns([ + $sql->as($sql->count('*'), 'counter'), + 'log_table', + ]) ->where($sql->orGroup(['blog_id IS NULL', 'blog_id IS NOT NULL'])) ->group('log_table'); - $res = $sql->select(); - if ($res == null || $res->isEmpty()) { + $rs = $sql->select(); + if (is_null($rs) || $rs->isEmpty()) { return []; } - $rs = []; - $i = 0; - while ($res->fetch()) { - $sql = new SelectStatement(); - $sql->from(dcCore::app()->prefix . dcLog::LOG_TABLE_NAME) - ->fields([$sql->count('*')]) - ->where($sql->orGroup(['blog_id IS NULL', 'blog_id IS NOT NULL'])) - ->and('log_table = ' . $sql->quote($res->f('log_table'))) - ->group('log_table'); - - $rs[$i]['key'] = $res->f('log_table'); - $rs[$i]['value'] = (int) $sql->select()?->f(0); - $i++; + $res = []; + while ($rs->fetch()) { + $res[] = new ValueDescriptor( + $rs->f('log_table'), + '', + (int) $rs->f('counter') + ); } - return $rs; + return $res; } public function execute(string $action, string $ns): bool diff --git a/src/Cleaner/Plugins.php b/src/Cleaner/Plugins.php index e869811..163b82f 100644 --- a/src/Cleaner/Plugins.php +++ b/src/Cleaner/Plugins.php @@ -17,7 +17,8 @@ namespace Dotclear\Plugin\Uninstaller\Cleaner; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, ActionDescriptor, - TraitCleanerDir + TraitCleanerDir, + ValueDescriptor }; class Plugins extends AbstractCleaner @@ -53,8 +54,17 @@ class Plugins extends AbstractCleaner public function values(): array { - $res = self::getDirs(explode(PATH_SEPARATOR, DC_PLUGINS_ROOT)); - sort($res); + $dirs = self::getDirs(explode(PATH_SEPARATOR, DC_PLUGINS_ROOT)); + sort($dirs); + + $res = []; + foreach($dirs as $dir) { + $res[] = new ValueDescriptor( + $dir['key'], + '', + (int) $dir['value'] + ); + } return $res; } diff --git a/src/Cleaner/Preferences.php b/src/Cleaner/Preferences.php index 6fb897e..5b165da 100644 --- a/src/Cleaner/Preferences.php +++ b/src/Cleaner/Preferences.php @@ -22,7 +22,8 @@ use Dotclear\Database\Statement\{ }; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, - ActionDescriptor + ActionDescriptor, + ValueDescriptor }; /** @@ -93,31 +94,57 @@ class Preferences extends AbstractCleaner { $sql = new SelectStatement(); $sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME) - ->columns(['pref_ws']) + ->columns([ + $sql->as($sql->count('*'), 'counter'), + 'pref_ws' + ]) ->where($sql->orGroup(['user_id IS NULL', 'user_id IS NOT NULL'])) ->group('pref_ws'); - $res = $sql->select(); - if ($res == null || $res->isEmpty()) { + $rs = $sql->select(); + if (is_null($rs) || $rs->isEmpty()) { return []; } - $rs = []; - $i = 0; - while ($res->fetch()) { - $sql = new SelectStatement(); - $sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME) - ->fields([$sql->count('*')]) - ->where($sql->orGroup(['user_id IS NULL', 'user_id IS NOT NULL'])) - ->and('pref_ws = ' . $sql->quote($res->f('pref_ws'))) - ->group('pref_ws'); - - $rs[$i]['key'] = $res->f('pref_ws'); - $rs[$i]['value'] = (int) $sql->select()?->f(0); - $i++; + $res = []; + while ($rs->fetch()) { + $res[] = new ValueDescriptor( + $rs->f('pref_ws'), + '', + (int) $rs->f('counter') + ); } - return $rs; + return $res; + } + + public function related(string $ns): array + { + $sql = new SelectStatement(); + $sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME) + ->columns([ + $sql->as($sql->count('*'), 'counter'), + 'pref_id' + ]) + ->where($sql->orGroup(['user_id IS NULL', 'user_id IS NOT NULL'])) + ->and('pref_ws = ' . $sql->quote($ns)) + ->group('pref_id'); + + $rs = $sql->select(); + if (is_null($rs) || $rs->isEmpty()) { + return []; + } + + $res = []; + while ($rs->fetch()) { + $res[] = new ValueDescriptor( + $rs->f('pref_ws'), + $rs->f('pref_id'), + (int) $rs->f('counter') + ); + } + + return $res; } public function execute(string $action, string $ns): bool diff --git a/src/Cleaner/Settings.php b/src/Cleaner/Settings.php index f7feff5..9f93c33 100644 --- a/src/Cleaner/Settings.php +++ b/src/Cleaner/Settings.php @@ -22,7 +22,8 @@ use Dotclear\Database\Statement\{ }; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, - ActionDescriptor + ActionDescriptor, + ValueDescriptor }; /** @@ -97,31 +98,57 @@ class Settings extends AbstractCleaner { $sql = new SelectStatement(); $sql->from(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME) - ->columns(['setting_ns']) + ->columns([ + $sql->as($sql->count('*'), 'counter'), + 'setting_ns' + ]) ->where($sql->orGroup(['blog_id IS NULL', 'blog_id IS NOT NULL'])) ->group('setting_ns'); - $res = $sql->select(); - if ($res == null || $res->isEmpty()) { + $rs = $sql->select(); + if (is_null($rs) || $rs->isEmpty()) { return []; } - $rs = []; - $i = 0; - while ($res->fetch()) { - $sql = new SelectStatement(); - $sql->from(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME) - ->fields([$sql->count('*')]) - ->where($sql->orGroup(['blog_id IS NULL', 'blog_id IS NOT NULL'])) - ->and('setting_ns = ' . $sql->quote($res->f('setting_ns'))) - ->group('setting_ns'); - - $rs[$i]['key'] = $res->f('setting_ns'); - $rs[$i]['value'] = (int) $sql->select()?->f(0); - $i++; + $res = []; + while ($rs->fetch()) { + $res[] = new ValueDescriptor( + $rs->f('setting_ns'), + '', + (int) $rs->f('counter') + ); } - return $rs; + return $res; + } + + public function related(string $ns): array + { + $sql = new SelectStatement(); + $sql->from(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME) + ->columns([ + $sql->as($sql->count('*'), 'counter'), + 'setting_id' + ]) + ->where($sql->orGroup(['blog_id IS NULL', 'blog_id IS NOT NULL'])) + ->and('setting_ns = ' . $sql->quote($ns)) + ->group('setting_id'); + + $rs = $sql->select(); + if (is_null($rs) || $rs->isEmpty()) { + return []; + } + + $res = []; + while ($rs->fetch()) { + $res[] = new ValueDescriptor( + $ns, + $rs->f('setting_id'), + (int) $rs->f('counter') + ); + } + + return $res; } public function execute(string $action, string $ns): bool diff --git a/src/Cleaner/Tables.php b/src/Cleaner/Tables.php index 9b83948..55fe705 100644 --- a/src/Cleaner/Tables.php +++ b/src/Cleaner/Tables.php @@ -26,7 +26,8 @@ use Dotclear\Database\Statement\{ }; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, - ActionDescriptor + ActionDescriptor, + ValueDescriptor }; class Tables extends AbstractCleaner @@ -86,11 +87,10 @@ class Tables extends AbstractCleaner public function values(): array { $object = AbstractSchema::init(dcCore::app()->con); - $res = $object->getTables(); + $tables = $object->getTables(); - $rs = []; - $i = 0; - foreach ($res as $k => $v) { + $res = []; + foreach ($tables as $k => $v) { // get only tables with dotclear prefix if ('' != dcCore::app()->prefix) { if (!preg_match('/^' . preg_quote(dcCore::app()->prefix) . '(.*?)$/', $v, $m)) { @@ -100,16 +100,15 @@ class Tables extends AbstractCleaner } $sql = new SelectStatement(); - $sql->from($res[$k]) - ->fields([$sql->count('*')]); - $rs[$i]['key'] = $v; - $rs[$i]['value'] = (int) $sql->select()?->f(0); - ; - $i++; + $res[] = new ValueDescriptor( + $v, + '', + (int) $sql->from($tables[$k])->fields([$sql->count('*')])->select()?->f(0) + ); } - return $rs; + return $res; } public function execute(string $action, string $ns): bool diff --git a/src/Cleaner/Themes.php b/src/Cleaner/Themes.php index a6ff5c0..7b042a5 100644 --- a/src/Cleaner/Themes.php +++ b/src/Cleaner/Themes.php @@ -18,7 +18,8 @@ use dcCore; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, ActionDescriptor, - TraitCleanerDir + TraitCleanerDir, + ValueDescriptor }; class Themes extends AbstractCleaner @@ -58,8 +59,17 @@ class Themes extends AbstractCleaner return []; } - $res = self::getDirs($path); - sort($res); + $dirs = self::getDirs($path); + sort($dirs); + + $res = []; + foreach($dirs as $dir) { + $res[] = new ValueDescriptor( + $dir['key'], + '', + (int) $dir['value'] + ); + } return $res; } diff --git a/src/Cleaner/Vars.php b/src/Cleaner/Vars.php index 6562d39..cd57032 100644 --- a/src/Cleaner/Vars.php +++ b/src/Cleaner/Vars.php @@ -17,7 +17,8 @@ namespace Dotclear\Plugin\Uninstaller\Cleaner; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, ActionDescriptor, - TraitCleanerDir + TraitCleanerDir, + ValueDescriptor }; class Vars extends AbstractCleaner @@ -53,7 +54,16 @@ class Vars extends AbstractCleaner public function values(): array { - return self::getDirs(DC_VAR); + $res = []; + foreach(self::getDirs(DC_VAR) as $dir) { + $res[] = new ValueDescriptor( + $dir['key'], + '', + (int) $dir['value'] + ); + } + + return $res; } public function execute(string $action, string $ns): bool diff --git a/src/Cleaner/Versions.php b/src/Cleaner/Versions.php index 5faf1ab..7fd4ec4 100644 --- a/src/Cleaner/Versions.php +++ b/src/Cleaner/Versions.php @@ -15,9 +15,11 @@ declare(strict_types=1); namespace Dotclear\Plugin\Uninstaller\Cleaner; use dcCore; +use Dotclear\Database\Statement\SelectStatement; use Dotclear\Plugin\Uninstaller\{ AbstractCleaner, - ActionDescriptor + ActionDescriptor, + ValueDescriptor }; class Versions extends AbstractCleaner @@ -63,17 +65,26 @@ class Versions extends AbstractCleaner public function values(): array { - $res = dcCore::app()->con->select('SELECT * FROM ' . dcCore::app()->prefix . dcCore::VERSION_TABLE_NAME); + $sql = new SelectStatement(); + $rs = $sql + ->from(dcCore::app()->prefix . dcCore::VERSION_TABLE_NAME) + ->columns(['module', 'version']) + ->select(); - $rs = []; - $i = 0; - while ($res->fetch()) { - $rs[$i]['key'] = $res->f('module'); - $rs[$i]['value'] = $res->f('version'); - $i++; + if (is_null($rs) || $rs->isEmpty()) { + return []; } - return $rs; + $res = []; + while ($rs->fetch()) { + $res[] = new ValueDescriptor( + $rs->f('module'), + $rs->f('version'), + 1 + ); + } + + return $res; } public function execute(string $action, string $ns): bool