aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/lib/Command/Object/ObjectUtil.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files/lib/Command/Object/ObjectUtil.php')
-rw-r--r--apps/files/lib/Command/Object/ObjectUtil.php78
1 files changed, 77 insertions, 1 deletions
diff --git a/apps/files/lib/Command/Object/ObjectUtil.php b/apps/files/lib/Command/Object/ObjectUtil.php
index c4ab59608fb..8460e225b61 100644
--- a/apps/files/lib/Command/Object/ObjectUtil.php
+++ b/apps/files/lib/Command/Object/ObjectUtil.php
@@ -8,13 +8,15 @@ declare(strict_types=1);
namespace OCA\Files\Command\Object;
+use OC\Core\Command\Base;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\ObjectStore\IObjectStore;
use OCP\IConfig;
use OCP\IDBConnection;
+use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
-class ObjectUtil {
+class ObjectUtil extends Base {
public function __construct(
private IConfig $config,
private IDBConnection $connection,
@@ -91,4 +93,78 @@ class ObjectUtil {
return $fileId;
}
+
+ public function writeIteratorToOutput(InputInterface $input, OutputInterface $output, \Iterator $objects, int $chunkSize): void {
+ $outputType = $input->getOption('output');
+ $humanOutput = $outputType === Base::OUTPUT_FORMAT_PLAIN;
+ $first = true;
+
+ if (!$humanOutput) {
+ $output->writeln('[');
+ }
+
+ foreach ($this->chunkIterator($objects, $chunkSize) as $chunk) {
+ if ($outputType === Base::OUTPUT_FORMAT_PLAIN) {
+ $this->outputChunk($input, $output, $chunk);
+ } else {
+ foreach ($chunk as $object) {
+ if (!$first) {
+ $output->writeln(',');
+ }
+ $row = $this->formatObject($object, $humanOutput);
+ if ($outputType === Base::OUTPUT_FORMAT_JSON_PRETTY) {
+ $output->write(json_encode($row, JSON_PRETTY_PRINT));
+ } else {
+ $output->write(json_encode($row));
+ }
+ $first = false;
+ }
+ }
+ }
+
+ if (!$humanOutput) {
+ $output->writeln("\n]");
+ }
+ }
+
+ private function formatObject(array $object, bool $humanOutput): array {
+ $row = array_merge([
+ 'urn' => $object['urn'],
+ ], ($object['metadata'] ?? []));
+
+ if ($humanOutput && isset($row['size'])) {
+ $row['size'] = \OC_Helper::humanFileSize($row['size']);
+ }
+ if (isset($row['mtime'])) {
+ $row['mtime'] = $row['mtime']->format(\DateTimeImmutable::ATOM);
+ }
+ return $row;
+ }
+
+ private function outputChunk(InputInterface $input, OutputInterface $output, iterable $chunk): void {
+ $result = [];
+ $humanOutput = $input->getOption('output') === 'plain';
+
+ foreach ($chunk as $object) {
+ $result[] = $this->formatObject($object, $humanOutput);
+ }
+ $this->writeTableInOutputFormat($input, $output, $result);
+ }
+
+ public function chunkIterator(\Iterator $iterator, int $count): \Iterator {
+ $chunk = [];
+
+ for ($i = 0; $iterator->valid(); $i++) {
+ $chunk[] = $iterator->current();
+ $iterator->next();
+ if (count($chunk) == $count) {
+ yield $chunk;
+ $chunk = [];
+ }
+ }
+
+ if (count($chunk)) {
+ yield $chunk;
+ }
+ }
}