ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
MoveTestSettingsMigration.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
21namespace ILIAS\Test\Setup;
22
23use ILIAS\Setup;
27
29{
31
32 private \ilDBInterface $db;
33 private IOWrapper $io;
34
35 public function getLabel(): string
36 {
37 return 'Migrate test settings from tst_tests to tst_test_settings';
38 }
39
41 {
42 return 100;
43 }
44
45 public function getPreconditions(Environment $environment): array
46 {
47 return [new \ilDatabaseInitializedObjective()];
48 }
49
50 public function prepare(Environment $environment): void
51 {
52 $this->db = $environment->getResource(Setup\Environment::RESOURCE_DATABASE);
54 }
55
56 public function step(Environment $environment): void
57 {
58 $columns = implode(',', array_keys(self::SETTINGS_COLUMNS));
59 $row = $this->db->fetchAssoc(
60 $this->db->query("SELECT test_id, {$columns} FROM tst_tests WHERE settings_id IS NULL LIMIT 1")
61 );
62
63 $settings_id = $this->db->nextId('tst_test_settings');
64 $setting_data = ['id' => [\ilDBConstants::T_INTEGER, $settings_id]];
65
66 foreach ($row as $column_name => $value) {
67 if (isset(self::SETTINGS_COLUMNS[$column_name])) {
68 [$column_def] = self::SETTINGS_COLUMNS[$column_name];
69
70 if ($column_name === 'reporting_date') {
71 $value = $this->convertLegacyDate($value);
72 }
73 if ($column_name === 'nr_of_tries' && $value > 127) {
74 $this->io->inform(
75 "ID {$settings_id}: Tried to set nr_of_tries to {$value}, which is too high. Setting it to 127 instead."
76 );
77 $value = 127;
78 }
79
80 // Convert legacy null values to 0
81 if ($column_def['type'] === \ilDBConstants::T_INTEGER && !$this->columnIsNullable($column_def)) {
82 $value = (int) $value;
83 }
84
85 $setting_data[$column_name] = [$column_def['type'], $value];
86 }
87 }
88
89 $this->db->insert('tst_test_settings', $setting_data);
90 $this->db->update(
91 'tst_tests',
92 ['settings_id' => [\ilDBConstants::T_INTEGER, $settings_id]],
93 ['test_id' => [\ilDBConstants::T_INTEGER, $row['test_id']]]
94 );
95 }
96
97 public function getRemainingAmountOfSteps(): int
98 {
99 $result = $this->db->query("SELECT COUNT(test_id) AS cnt FROM tst_tests WHERE settings_id IS NULL");
100 return (int) $this->db->fetchObject($result)->cnt;
101 }
102}
Wrapper around symfonies input and output facilities to provide just the functionality required for t...
Definition: IOWrapper.php:33
prepare(Environment $environment)
Prepare the migration by means of some environment.
getRemainingAmountOfSteps()
Count up how many "things" need to be migrated.
getPreconditions(Environment $environment)
Objectives the migration depend on.
step(Environment $environment)
Run one step of the migration.
getDefaultAmountOfStepsPerRun()
Tell the default amount of steps to be executed for one run of the migration.
An environment holds resources to be used in the setup process.
Definition: Environment.php:28
getResource(string $id)
Consumers of this method should check if the result is what they expect, e.g.
A migration is a potentially long lasting operation that can be broken into discrete steps.
Definition: Migration.php:29
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
columnIsNullable(array $column_def)
convertLegacyDate(string|\DateTimeImmutable|null $date)