Skip to content

Commit 17c264f

Browse files
committed
feature: reset hashing in database
closes #114
1 parent b6768d1 commit 17c264f

File tree

2 files changed

+66
-32
lines changed

2 files changed

+66
-32
lines changed

src/Cli/ExecuteCommand.php

Lines changed: 62 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,68 +14,102 @@
1414

1515
class ExecuteCommand extends Command {
1616
public function run(?ArgumentValueList $arguments = null):void {
17-
$forced = $arguments->contains("force");
18-
1917
$repoBasePath = getcwd();
2018
$defaultPath = $this->getDefaultPath($repoBasePath);
21-
2219
$config = $this->getConfig($repoBasePath, $defaultPath);
2320

24-
$settings = new Settings(
21+
$settings = $this->buildSettingsFromConfig($config, $repoBasePath);
22+
[$migrationPath, $migrationTable] = $this->getMigrationLocation($config, $repoBasePath);
23+
24+
$migrator = new Migrator($settings, $migrationPath, $migrationTable);
25+
$migrator->setOutput(
26+
$this->stream->getOutStream(),
27+
$this->stream->getErrorStream()
28+
);
29+
30+
if($this->isForced($arguments)) {
31+
$migrator->deleteAndRecreateSchema();
32+
}
33+
34+
$migrator->selectSchema();
35+
$migrator->createMigrationTable();
36+
$migrationCount = $migrator->getMigrationCount();
37+
$migrationFileList = $migrator->getMigrationFileList();
38+
39+
$runFrom = $this->calculateResetNumber($arguments, $migrationFileList, $migrator, $migrationCount);
40+
41+
$this->executeMigrations($migrator, $migrationFileList, $runFrom);
42+
}
43+
44+
/** Determine whether the --force flag was provided. */
45+
private function isForced(?ArgumentValueList $arguments):bool {
46+
return $arguments?->contains("force") ?? false;
47+
}
48+
49+
/** Build Settings from config for the current repository. */
50+
private function buildSettingsFromConfig(\Gt\Config\Config $config, string $repoBasePath): Settings {
51+
return new Settings(
2552
implode(DIRECTORY_SEPARATOR, [
2653
$repoBasePath,
2754
$config->get("database.query_path")
2855
]),
29-
3056
$config->get("database.driver") ?? 'mysql',
3157
$config->get("database.schema"),
3258
$config->get("database.host") ?? "localhost",
3359
(int)($config->get("database.port") ?? "3306"),
3460
$config->get("database.username"),
3561
$config->get("database.password")
3662
);
63+
}
3764

65+
/**
66+
* Return [migrationPath, migrationTable] derived from config.
67+
*
68+
* @return list<string>
69+
*/
70+
private function getMigrationLocation(\Gt\Config\Config $config, string $repoBasePath): array {
3871
$migrationPath = implode(DIRECTORY_SEPARATOR, [
3972
$repoBasePath,
4073
$config->get("database.query_path") ?? "query",
4174
$config->get("database.migration_path") ?? "_migration",
4275
]);
4376
$migrationTable = $config->get("database.migration_table") ?? "_migration";
77+
return [$migrationPath, $migrationTable];
78+
}
4479

45-
$migrator = new Migrator($settings, $migrationPath, $migrationTable);
46-
$migrator->setOutput(
47-
$this->stream->getOutStream(),
48-
$this->stream->getErrorStream()
49-
);
50-
51-
if($forced) {
52-
$migrator->deleteAndRecreateSchema();
53-
}
54-
55-
$migrator->selectSchema();
56-
$migrator->createMigrationTable();
57-
$migrationCount = $migrator->getMigrationCount();
58-
$migrationFileList = $migrator->getMigrationFileList();
59-
60-
// TODO: Expected functionality is to provide a number to reset like --reset=15, OR leave it blank like --reset
61-
// If number is provided, ignore everything before this number.
62-
// If number is not provided, ignore everything other than the latest file in the directory.
80+
/**
81+
* Calculate the migration start point from --reset or current migration count.
82+
*
83+
* @param list<string> $migrationFileList
84+
*/
85+
private function calculateResetNumber(
86+
?ArgumentValueList $arguments,
87+
array $migrationFileList,
88+
Migrator $migrator,
89+
int $migrationCount
90+
): int {
6391
$resetNumber = null;
64-
if($arguments->contains("reset")) {
92+
if($arguments?->contains("reset")) {
6593
$resetNumber = $arguments->get("reset")->get();
6694
if(!$resetNumber) {
6795
$lastKey = array_key_last($migrationFileList);
6896
$lastNumber = $migrator->extractNumberFromFilename($migrationFileList[$lastKey]);
69-
// When no number provided, execute only the latest migration by
70-
// setting the reset point to one less than the latest number.
7197
$resetNumber = max(0, $lastNumber - 1);
7298
}
7399
$resetNumber = (int)$resetNumber;
74100
}
101+
return $resetNumber ?? $migrationCount;
102+
}
75103

104+
/**
105+
* Wrap integrity check and perform migration with error handling.
106+
*
107+
* @param list<string> $migrationFileList
108+
*/
109+
private function executeMigrations(Migrator $migrator, array $migrationFileList, int $runFrom): void {
76110
try {
77-
$migrator->checkIntegrity($migrationFileList, $resetNumber ?? $migrationCount);
78-
$migrator->performMigration($migrationFileList, $resetNumber ?? $migrationCount);
111+
$migrator->checkIntegrity($migrationFileList, $runFrom);
112+
$migrator->performMigration($migrationFileList, $runFrom);
79113
}
80114
catch(MigrationIntegrityException $exception) {
81115
$this->writeLine(

src/Migration/Migrator.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ public function checkIntegrity(
151151
?int $migrationStartFrom = null
152152
):int {
153153
$fileNumber = 0;
154-
155-
foreach($migrationFileList as $i => $file) {
154+
155+
foreach($migrationFileList as $file) {
156156
$fileNumber = $this->extractNumberFromFilename($file);
157157

158158
// If a start point is provided, skip files at or before that number
@@ -199,8 +199,8 @@ public function performMigration(
199199
):int {
200200
$fileNumber = 0;
201201
$numCompleted = 0;
202-
203-
foreach($migrationFileList as $i => $file) {
202+
203+
foreach($migrationFileList as $file) {
204204
$fileNumber = $this->extractNumberFromFilename($file);
205205

206206
if($fileNumber <= $existingFileNumber) {

0 commit comments

Comments
 (0)