%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Migration/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Migration/Version20220102.php |
<?php
/*
* @copyright 2022 Passwords App
*
* @author Marius David Wieschollek
* @license AGPL-3.0
*
* This file is part of the Passwords App
* created by Marius David Wieschollek.
*/
declare(strict_types=1);
namespace OCA\Passwords\Migration;
use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version20220102
*
* @package OCA\Passwords\Migration
*/
class Version20220102 extends SimpleMigrationStep {
/**
* @var IDBConnection
*/
protected IDBConnection $db;
/**
* @var IConfig
*/
protected IConfig $config;
/**
* Version20220102 constructor.
*
* @param IDBConnection $db
* @param IConfig $config
*/
public function __construct(IDBConnection $db, IConfig $config) {
$this->db = $db;
$this->config = $config;
}
/**
* Human readable name of the migration step
*
* @return string
* @since 14.0.0
*/
public function name(): string {
return 'Update auto_increment';
}
/**
* Human readable description of the migration step
*
* @return string
* @since 14.0.0
*/
public function description(): string {
return 'Update auto_increment values of postgres tables';
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return null|ISchemaWrapper
* @throws \Doctrine\DBAL\Exception
* @throws \OCP\DB\Exception
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
return $schemaClosure();
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @throws \OCP\DB\Exception
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
if($this->config->getSystemValue('dbtype') !== 'pgsql') {
return;
}
$tableMap = [
'passwords_challenge' => 'passwords_challenge_id_seq',
'passwords_folder' => 'passwords_folder_id_seq',
'passwords_folder_rv' => 'passwords_folder_rv_id_seq',
'passwords_keychain' => 'passwords_keychain_id_seq',
'passwords_password' => 'passwords_password_id_seq',
'passwords_password_rv' => 'passwords_password_rv_id_seq',
'passwords_registration' => 'passwords_registration_id_seq',
'passwords_session' => 'passwords_session_id_seq',
'passwords_share' => 'passwords_share_id_seq',
'passwords_tag' => 'passwords_tag_id_seq',
'passwords_tag_rv' => 'passwords_tag_rv_id_seq',
'passwords_pw_tag_rel' => 'passwords_pw_tag_rel_id_seq'
];
foreach($tableMap as $table => $sequence) {
$queryBuilder = $this->db->getQueryBuilder();
$select = $queryBuilder->selectAlias($queryBuilder->createFunction('MAX(`a`.`id`)'), 'count')->from($table, 'a');
$result = $select->executeQuery();
$count = $result->fetch()['count'];
if($count === null) {
$output->info("Table {$table} seems to be empty, not updating auto_increment");
continue;
}
$count++;
$output->info("Setting auto_increment for {$sequence} to {$count}");
$statement = $this->db->prepare("ALTER SEQUENCE *PREFIX*{$sequence} RESTART WITH {$count}");
$statement->execute();
}
$output->info('Done');
}
}