diff --git a/lib/Db/ExtMapper.php b/lib/Db/ExtMapper.php index c06cb3f69cc1076e92e1695a16442d224e4d68c6..f1cab3537ea412b2a038609788bf12ddbe0ae1a0 100644 --- a/lib/Db/ExtMapper.php +++ b/lib/Db/ExtMapper.php @@ -47,24 +47,6 @@ abstract class ExtMapper extends QBMapper { } } - protected function chunkedQueryArray(callable $callback, &$data, $users): void { - - $offset = 0; - $totalUsers = count($users); // Total number of users - - while ($offset < $totalUsers) { - $query = $this->getQueryBuilder(); - - $userChunk = array_slice($users, $offset, $this->chunkSize); - if (empty($userChunk)) { - break; - } - $callback($query, $userChunk, $data); - - $offset += $this->chunkSize; - } - } - protected function addChunkCondition(IQueryBuilder $query, string $field, int $offset, bool $firstWhereClause = false): void { if ($this->chunkSize > 0) { $expr = $query->expr()->gt($field, $query->createPositionalParameter($offset, IQueryBuilder::PARAM_INT)); diff --git a/lib/Db/OC/AccountsMapper.php b/lib/Db/OC/AccountsMapper.php index f7ef7ecc79af2f72b2e2aa1d8d3fb466b6d9f296..bd9f7c7d7fe247089b058e6909824ccfe3a7cd23 100644 --- a/lib/Db/OC/AccountsMapper.php +++ b/lib/Db/OC/AccountsMapper.php @@ -13,6 +13,7 @@ use PDO; class AccountsMapper extends ExtMapper { const PREFERENCES_TABLE = 'preferences'; + const ACCOUNTS_TABLE = 'accounts'; private ConfigService $configService; public function __construct(IDBConnection $db, int $chunkSize, ConfigService $configService ) { @@ -27,7 +28,7 @@ class AccountsMapper extends ExtMapper { } $qb = $this->db->getQueryBuilder(); $qb->selectAlias($qb->createFunction('COUNT(uid)'), 'c') - ->from('accounts'); + ->from(self::ACCOUNTS_TABLE); $stmt = $qb->execute(); $result = $stmt->fetch(); @@ -61,66 +62,58 @@ class AccountsMapper extends ExtMapper { $data = [ 'storages' => [] ]; - $this->chunkedQueryArray(function ($query, $userChunk, &$data) use ($activeUsers) { - return $this->queryUserStoragesCallback($query, $userChunk, $data); - }, $data, $activeUsers); - return $data['storages']; - } - - protected function queryUserStoragesCallback(IQueryBuilder $query, array $userChunk, &$data): string { - $storages = &$data['storages']; - if (empty($userChunk)) { - return '0'; + if (empty($activeUsers)) { + return $data['storages']; } + + $query = $this->getQueryBuilder(); + $query->selectAlias('fc.size', 's') ->selectAlias('a.uid', 'i') ->from('accounts', 'a') ->join('a', StoragesMapper::STORAGES_TABLE, 's', "s.id = CONCAT('home::', a.uid)") ->join('s', FilecacheMapper::FILECACHE_TABLE, 'fc', 'fc.storage = s.numeric_id') ->where($query->expr()->eq('fc.path', $query->createPositionalParameter('files'))) - ->andWhere($query->expr()->in('a.uid', $query->createPositionalParameter($userChunk, IQueryBuilder::PARAM_STR_ARRAY))); + ->andWhere($query->expr()->in('a.uid', $query->createPositionalParameter($activeUsers, IQueryBuilder::PARAM_STR_ARRAY))); foreach ($this->queryRows($query) as $row) { - $storages[] = intval($row['s']); + $data['storages'][] = intval($row['s']); } - return ''; + + return $data['storages']; } public function queryUserQuotas($defaultQuotas) { $activeUsers = $this->getActiveUsers(); $data = [ - 'defaultQuotas' => $defaultQuotas, 'quotas' => [] ]; - $this->chunkedQueryArray(function ($query, $userChunk, &$data) use ($activeUsers) { - return $this->queryUserQuotasCallback($query, $userChunk, $data); - }, $data, $activeUsers); - return $data['quotas']; - } - - protected function queryUserQuotasCallback(IQueryBuilder $query, $userChunk, &$data): string { - $defaultQuotas = $data['defaultQuotas']; - $quotas = &$data['quotas']; - if (empty($userChunk)) { - return '0'; + if (empty($activeUsers)) { + return $data['quotas']; } - $query->selectDistinct('p.userid') - ->selectAlias('p1.configvalue', 'quota') - ->from(self::PREFERENCES_TABLE, 'p') - ->join('p', self::PREFERENCES_TABLE, 'p1', 'p1.userid = p.userid') - ->andWhere($query->expr()->eq('p1.configkey', $query->createPositionalParameter('quota'))) - ->andWhere($query->expr()->in('p.userid', $query->createPositionalParameter($userChunk, IQueryBuilder::PARAM_STR_ARRAY))); + $query = $this->getQueryBuilder(); + + $query->selectDistinct('a.uid') + ->selectAlias('p.configvalue', 'quota') + ->from(self::ACCOUNTS_TABLE, 'a') + ->join('a', self::PREFERENCES_TABLE, 'p', 'a.uid = p.userid') + ->andWhere($query->expr()->eq('p.configkey', $query->createPositionalParameter('quota'))) + ->andWhere($query->expr()->in('a.uid', $query->createPositionalParameter($activeUsers, IQueryBuilder::PARAM_STR_ARRAY))); + // Execute query and process results foreach ($this->queryRows($query) as $row) { $defaultQuota = $this->findDefaultQuota($defaultQuotas, $row['quota']); - if (($quota = FileSize::ParseQuotaString($row['quota'], $defaultQuota)) !== false) { - $quotas[$row['userid']] = $quota; + $quota = FileSize::ParseQuotaString($row['quota'], $defaultQuota); + + if ($quota !== false) { + $data['quotas'][$row['uid']] = $quota; } } - return ''; + + return $data['quotas']; } private function findDefaultQuota($defaultQuotas, $backend) { @@ -137,7 +130,7 @@ class AccountsMapper extends ExtMapper { $deactivatedUsers = $this->configService->config()->getUsersForUserValue('core', 'enabled', 'false'); $qb = $this->db->getQueryBuilder(); $qb->select('uid') - ->from('accounts'); + ->from(self::ACCOUNTS_TABLE); $stmt = $qb->execute(); $result = $stmt->fetchAll(PDO::FETCH_COLUMN); diff --git a/lib/Db/OC/FilecacheMapper.php b/lib/Db/OC/FilecacheMapper.php index 72da56919dcf58d56fb21f5a667464776f2dfd2a..87156357f48f09c2426b95f763551c6601fbc82a 100644 --- a/lib/Db/OC/FilecacheMapper.php +++ b/lib/Db/OC/FilecacheMapper.php @@ -4,6 +4,7 @@ namespace OCA\SccuotNC\Db\OC; use OCA\SccuotNC\Db\ExtMapper; +use OCA\SccuotNC\Service\ConfigService; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; @@ -11,10 +12,11 @@ class FilecacheMapper extends ExtMapper { const FILECACHE_TABLE = 'filecache'; private string $accountsState = ''; + private ConfigService $configService; - public function __construct(IDBConnection $db, int $chunkSize, string $accountsState = '') { + public function __construct(IDBConnection $db, int $chunkSize, ConfigService $configService, string $accountsState = '') { parent::__construct($db, self::FILECACHE_TABLE, $chunkSize); - + $this->configService = $configService; $this->accountsState = $accountsState; } @@ -99,8 +101,7 @@ class FilecacheMapper extends ExtMapper { $values = $this->queryValues($query, ['c', 'm']); $data['totalCount'] += $values['c']; - - return $values['m'] == NULL ? $offset + $this->chunkSize : $values['m']; + return $values['m'] == NULL? 0 : $values['m']; } public function queryTotalFilesSize() { @@ -124,32 +125,20 @@ class FilecacheMapper extends ExtMapper { $values = $this->queryValues($query, ['s', 'm']); $data['totalSize'] += $values['s']; - return $values['m'] == NULL ? $offset + $this->chunkSize : $values['m']; + return $values['m'] == NULL? 0 : $values['m']; } private function joinUserAccounts(IQueryBuilder $query) { if ($this->accountsState != '') { $query->join('fc', StoragesMapper::STORAGES_TABLE, 's', 's.numeric_id = fc.storage') - ->join('s', AccountsMapper::PREFERENCES_TABLE, 'p', "CONCAT('home::', p.userid) = s.id"); + ->join('s', AccountsMapper::ACCOUNTS_TABLE, 'a', "CONCAT('home::', a.uid) = s.id"); } } private function addUserAccountsCondition(IQueryBuilder $query) { - if ($this->accountsState != '') { - - $qb = $this->getQueryBuilder(); - $qb->selectDistinct('userid') - ->from(AccountsMapper::PREFERENCES_TABLE) - ->where($qb->expr()->eq('configkey', $qb->expr()->literal('enabled'))) - ->andWhere($qb->expr()->eq('configvalue', $qb->expr()->literal('false'))); - - $query->andWhere($query->expr()->eq('configkey', $query->expr()->literal('%quota%'))); - if ($this->accountsState == 'true') { - $query->andWhere($query->expr()->notIn('p.userid', $query->createFunction($qb->getSQL()))); - } else { - $query->andWhere($query->expr()->in('p.userid', $query->createFunction($qb->getSQL()))); - } - + if ($this->accountsState === 'false') { + $deactivatedUsers = $this->configService->config()->getUsersForUserValue('core', 'enabled', 'false'); + $query->andWhere($query->expr()->in('a.uid', $query->createPositionalParameter($deactivatedUsers, IQueryBuilder::PARAM_STR_ARRAY))); } } diff --git a/lib/Stats/Collector/FileTypesCountsCollector.php b/lib/Stats/Collector/FileTypesCountsCollector.php index 4e4e9c0ced129d7c2c80b74e481a69af203fca22..f94fffe322fbd93c124a66d9cf192814afe19217 100644 --- a/lib/Stats/Collector/FileTypesCountsCollector.php +++ b/lib/Stats/Collector/FileTypesCountsCollector.php @@ -10,7 +10,7 @@ use OCP\IDBConnection; class FileTypesCountsCollector extends BaseCollector { protected function collectData(IDBConnection $db, int $timestamp, int $chunkSize, ConfigService $config) { $fileCounts = []; - $mapper = new FilecacheMapper($db, $chunkSize, $config->getSnapshotFiletypesFilterClosedAccounts() ? self::STATE_ENABLED : ''); + $mapper = new FilecacheMapper($db, $chunkSize, $config, $config->getSnapshotFiletypesFilterClosedAccounts() ? self::STATE_ENABLED : ''); $counts = $mapper->queryFiletypesCounts(); foreach ($config->getSnapshotFileTypes()->groups() as $groupName => $group) { if (!$group->isCollectEnabled()) { diff --git a/lib/Stats/Collector/FilesCountCollector.php b/lib/Stats/Collector/FilesCountCollector.php index 1ed2fbd58844ac7b8dca99b601eeee575407164a..adb2978b835e38a537d24a6559fd6cb42e04f745 100644 --- a/lib/Stats/Collector/FilesCountCollector.php +++ b/lib/Stats/Collector/FilesCountCollector.php @@ -11,7 +11,7 @@ use OCP\IDBConnection; class FilesCountCollector extends BaseCollector { protected function collectData(IDBConnection $db, int $timestamp, int $chunkSize, ConfigService $config) { - $mapper = new FilecacheMapper($db, $chunkSize); + $mapper = new FilecacheMapper($db, $chunkSize, $config); $totalCount = $mapper->queryTotalFilesCount(); $mapper->setAccountsState(self::STATE_DISABLED); $obsoleteCount = $mapper->queryTotalFilesCount(); diff --git a/lib/Stats/Collector/FilesSizeCollector.php b/lib/Stats/Collector/FilesSizeCollector.php index 62e065de22491e79e5d05b4ad8ae848e5f15f189..c65dcb1a4055e56d98a7c1256455768391bdb2db 100644 --- a/lib/Stats/Collector/FilesSizeCollector.php +++ b/lib/Stats/Collector/FilesSizeCollector.php @@ -11,7 +11,7 @@ use OCP\IDBConnection; class FilesSizeCollector extends BaseCollector { protected function collectData(IDBConnection $db, int $timestamp, int $chunkSize, ConfigService $config) { - $mapper = new FilecacheMapper($db, $chunkSize); + $mapper = new FilecacheMapper($db, $chunkSize, $config); $totalCount = $mapper->queryTotalFilesSize(); $mapper->setAccountsState(self::STATE_DISABLED); $obsoleteCount = $mapper->queryTotalFilesSize();