diff --git a/src/Cleaner/Logs.php b/src/Cleaner/Logs.php new file mode 100644 index 0000000..e2d3ef4 --- /dev/null +++ b/src/Cleaner/Logs.php @@ -0,0 +1,103 @@ + 'logs', + 'name' => __('Logs'), + 'desc' => __('Logs in Dotclear logs table'), + ]; + } + + protected function actions(): array + { + return [ + new ActionDescriptor([ + 'id' => 'delete_all', + 'select' => __('delete selected logs table'), + 'query' => __('delete "%s" logs table'), + 'success' => __('"%s" logs table deleted'), + 'error' => __('Failed to delete "%s" logs table'), + ]), + ]; + } + + public function distributed(): array + { + return [ + 'maintenance' + ]; + } + + public function values(): array + { + $sql = new SelectStatement(); + $sql->from(dcCore::app()->prefix . dcLog::LOG_TABLE_NAME) + ->columns(['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()) { + 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++; + } + + return $rs; + } + + public function execute(string $action, string $ns): bool + { + if ($action == 'delete_all') { + $sql->from(dcCore::app()->prefix . dcLog::LOG_TABLE_NAME) + ->where('log_table = ' . $sql->quote((string) $ns)) + ->and($sql->orGroup(['blog_id IS NULL', 'blog_id IS NOT NULL'])) + ->delete(); + + return true; + } + + return false; + } +} diff --git a/src/Prepend.php b/src/Prepend.php index 3aa86ac..482475e 100644 --- a/src/Prepend.php +++ b/src/Prepend.php @@ -38,6 +38,7 @@ class Prepend extends dcNsProcess dcCore::app()->addBehavior('UninstallerAddCleaner', [Cleaner\Settings::class, 'create']); dcCore::app()->addBehavior('UninstallerAddCleaner', [Cleaner\Tables::class, 'create']); dcCore::app()->addBehavior('UninstallerAddCleaner', [Cleaner\Versions::class, 'create']); + dcCore::app()->addBehavior('UninstallerAddCleaner', [Cleaner\Logs::class, 'create']); dcCore::app()->addBehavior('UninstallerAddCleaner', [Cleaner\Caches::class, 'create']); dcCore::app()->addBehavior('UninstallerAddCleaner', [Cleaner\Vars::class, 'create']); dcCore::app()->addBehavior('UninstallerAddCleaner', [Cleaner\Themes::class, 'create']);