/
20180831_0002_upgrade_from_adrenth_redirect.php
112 lines (90 loc) · 3.43 KB
/
20180831_0002_upgrade_from_adrenth_redirect.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
declare(strict_types=1);
namespace Vdlp\Redirect\Updates;
use Exception;
use Illuminate\Database\DatabaseManager;
use October\Rain\Database\Updates\Migration;
use Psr\Log\LoggerInterface;
use Throwable;
class UpgradeFromAdrenthRedirect extends Migration
{
/**
* @throws Exception
*/
public function up(): void
{
/** @var DatabaseManager $database */
$database = resolve('db');
/** @var LoggerInterface $log */
$log = resolve(LoggerInterface::class);
$schema = $database->getSchemaBuilder();
if (!$schema->hasTable('adrenth_redirect_redirects')) {
// Skip upgrade migration.
$log->info('No upgrade of Vdlp.Redirect needed. Fresh installation.');
return;
}
try {
$database->transaction(function () use ($database): void {
$this->disableForeignKeyCheck($database);
$mapping = [
'adrenth_redirect_categories' => 'vdlp_redirect_categories',
'adrenth_redirect_redirects' => 'vdlp_redirect_redirects',
'adrenth_redirect_redirect_logs' => 'vdlp_redirect_redirect_logs',
'adrenth_redirect_clients' => 'vdlp_redirect_clients',
];
// language=ignore
foreach ($mapping as $from => $to) {
// Make sure newly created tables are empty.
$database->table($to)->delete();
// Move data from old tables to new ones.
$database->statement("INSERT INTO `$to` SELECT * FROM `$from`;");
}
// Migrate plugin settings.
$database->table('system_settings')
->where('item', '=', 'vdlp_redirect_settings')
->delete();
// language=ignore
$database->statement(
'INSERT INTO `system_settings` '
. "SELECT NULL, 'vdlp_redirect_settings', `value` "
. 'FROM `system_settings` '
. "WHERE `item` = 'adrenth_redirect_settings';"
);
$this->enableForeignKeyCheck($database);
});
} catch (Throwable $e) {
$log->error(sprintf(
'Vdlp.Redirect: Could not upgrade plugin Vdlp.Redirect from Adrenth.Redirect: %s',
$e->getMessage()
));
}
}
public function down(): void
{
// No migrations to reverse.
}
private function disableForeignKeyCheck(DatabaseManager $database): void
{
if ($database->getDriverName() === 'sqlite') {
$database->raw('PRAGMA foreign_keys = OFF;');
}
if ($database->getDriverName() === 'mysql') {
$database->raw('SET FOREIGN_KEY_CHECKS = 0;');
}
if ($database->getDriverName() === 'pgsql') {
$database->raw('SET CONSTRAINTS ALL DEFERRED;');
}
}
private function enableForeignKeyCheck(DatabaseManager $database): void
{
if ($database->getDriverName() === 'sqlite') {
$database->raw('PRAGMA foreign_keys = ON;');
}
if ($database->getDriverName() === 'mysql') {
$database->raw('SET FOREIGN_KEY_CHECKS = 1;');
}
if ($database->getDriverName() === 'pgsql') {
$database->raw('PRAGMA foreign_keys = ON;');
}
}
}