Skip to content

Commit

Permalink
FilesMetadata
Browse files Browse the repository at this point in the history
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
more

Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
  • Loading branch information
ArtificialOwl committed Oct 10, 2023
1 parent a149d4e commit 9289297
Show file tree
Hide file tree
Showing 22 changed files with 1,832 additions and 0 deletions.
123 changes: 123 additions & 0 deletions core/Command/FilesMetadata/Get.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Maxence Lange <maxence@artificial-owl.com>
*
* @author Maxence Lange <maxence@artificial-owl.com>
*
* @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\Core\Command\FilesMetadata;

use Doctrine\DBAL\Connection;
use OC\DB\ConnectionAdapter;
use OC\FilesMetadata\FilesMetadataQueryHelper;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\FilesMetadata\IFilesMetadataManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class Get extends Command {
public function __construct(
private IFilesMetadataManager $filesMetadataManager,
) {
parent::__construct();
}

protected function configure() {

Check notice

Code scanning / Psalm

MissingReturnType Note

Method OC\Core\Command\FilesMetadata\Get::configure does not have a return type, expecting void
$this->setName('metadata:get')
->setDescription('get stored metadata about a file, by its id')
->addArgument(
'fileId',
InputArgument::REQUIRED,
'id of the file document'
)
->addOption(
'refresh',
'',
InputOption::VALUE_NONE,
'refresh metadata'
)
->addOption(
'reset',
'',
InputOption::VALUE_NONE,
'refresh metadata from scratch'
)
->addOption(
'background',
'',
InputOption::VALUE_NONE,
'emulate background jobs when refreshing metadata'
);
}

protected function execute(InputInterface $input, OutputInterface $output): int {


// testing queryhelper.

// $queryHelper = \OCP\Server::get(FilesMetadataQueryHelper::class);
// /** @var Connection $conn */
// $conn = \OCP\Server::get(ConnectionAdapter::class);
// $qb = $conn->getQueryBuilder();
// $qb->select('file.path')->from('filecache', 'file');
//
// $queryHelper->limitToSingleMetadataInt(
// $qb,
// 'file',
// 'fileid',
// 'another',
// 44,
// true,
// 'lte'
// );
//
//
// $result = $qb->executeQuery();
// while ($data = $result->fetch()) {
// $output->writeln('- ' . json_encode($data));
// }
// $result->closeCursor();
//
//
//
//
// return 0;

$fileId = (int)$input->getArgument('fileId');
if ($input->getOption('refresh')) {
$metadata = $this->filesMetadataManager->refreshMetadata(
$fileId,
$input->getOption('background'),
$input->getOption('reset')
);
} else {
$metadata = $this->filesMetadataManager->getMetadata($fileId);
}

$output->writeln(json_encode($metadata, JSON_PRETTY_PRINT));

return 0;
}
}
80 changes: 80 additions & 0 deletions core/Migrations/Version28000Date20231004103301.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Maxence Lange <maxence@artificial-owl.com>
*
* @author Maxence Lange <maxence@artificial-owl.com>
*
* @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\Core\Migrations;

use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;

class Version28000Date20231004103301 extends SimpleMigrationStep {

public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();

if (!$schema->hasTable('files_metadata')) {
$table = $schema->createTable('files_metadata');
$table->addColumn('id', Types::BIGINT, [
'autoincrement' => true,
'notnull' => true,
'length' => 15,
'unsigned' => true,
]);
$table->addColumn('file_id', Types::BIGINT, ['notnull' => false, 'length' => 15,]);
$table->addColumn('json', Types::TEXT);
$table->addColumn('sync_token', Types::STRING, ['length' => 15]);
$table->addColumn('last_update', Types::DATETIME);

$table->setPrimaryKey(['id']);
$table->addUniqueIndex(['file_id'], 'files_meta_fileid');
}

if (!$schema->hasTable('files_metadata_index')) {
$table = $schema->createTable('files_metadata_index');
$table->addColumn('id', Types::BIGINT, [
'autoincrement' => true,
'notnull' => true,
'length' => 15,
'unsigned' => true,
]);
$table->addColumn('file_id', Types::BIGINT, ['notnull' => false, 'length' => 15]);
$table->addColumn('meta_key', Types::STRING, ['notnull' => false, 'length' => 31]);
$table->addColumn('meta_value', Types::STRING, ['notnull' => false, 'length' => 63]);
$table->addColumn('meta_value_int', Types::BIGINT, ['notnull' => false, 'length' => 11]);
// $table->addColumn('meta_value_float', Types::FLOAT, ['notnull' => false, 'length' => 11,5]);

$table->setPrimaryKey(['id']);
$table->addIndex(['file_id', 'meta_key', 'meta_value'], 'f_meta_index');
$table->addIndex(['file_id', 'meta_key', 'meta_value_int'], 'f_meta_index_i');
// $table->addIndex(['file_id', 'meta_key', 'meta_value_float'], 'f_meta_index_f');
}

return $schema;
}
}
2 changes: 2 additions & 0 deletions core/register_command.php
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@
$application->add(new OC\Core\Command\Security\RemoveCertificate(\OC::$server->getCertificateManager()));
$application->add(\OC::$server->get(\OC\Core\Command\Security\BruteforceAttempts::class));
$application->add(\OC::$server->get(\OC\Core\Command\Security\BruteforceResetAttempts::class));

$application->add(\OCP\Server::get(\OC\Core\Command\FilesMetadata\Get::class));
} else {
$application->add(\OC::$server->get(\OC\Core\Command\Maintenance\Install::class));
}
61 changes: 61 additions & 0 deletions lib/private/FilesMetadata/Event/MetadataEventBase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Maxence Lange <maxence@artificial-owl.com>
*
* @author Maxence Lange <maxence@artificial-owl.com>
*
* @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\FilesMetadata\Event;

use OCP\EventDispatcher\Event;
use OCP\FilesMetadata\Model\IFilesMetadata;

class MetadataEventBase extends Event {

public function __construct(
protected int $fileId,
protected IFilesMetadata $metadata
) {
parent::__construct();
}

/**
* returns id of the file
*
* @return int
* @since 28.0.0
*/
public function getFileId(): int {
return $this->fileId;
}

/**
* returns Metadata model linked to file id, with already known metadata from the database.
* If the object is modified using its setters, metadata are updated in database at the end of the event.
*
* @return IFilesMetadata
* @since 28.0.0
*/
public function getMetadata(): IFilesMetadata {
return $this->metadata;
}
}
Loading

0 comments on commit 9289297

Please sign in to comment.