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
|
<?php
class WebMigrateController extends StudipController
{
public function __construct($dispatcher)
{
if (basename($dispatcher->trails_uri, '.php') !== 'web_migrate') {
throw new Exception('Web Migrator cannot be invoked via standard dispatcher.');
}
parent::__construct($dispatcher);
}
public function before_filter(&$action, &$args)
{
$GLOBALS['perm']->check('root');
parent::before_filter($action, $args);
$this->target = Request::int('target');
$this->branch = Request::get('branch', '0');
$this->version = new DBSchemaVersion('studip', $this->branch);
$this->migrator = new Migrator(
"{$GLOBALS['STUDIP_BASE_PATH']}/db/migrations",
$this->version,
true
);
$this->setupSidebar($action);
PageLayout::setTitle(_('Stud.IP Web-Migrator'));
}
public function index_action()
{
$this->migrations = $this->migrator->relevantMigrations($this->target);
}
public function migrate_action()
{
$lock = new FileLock('web-migrate');
$lock_data = ['timestamp' => time(), 'user_id' => $GLOBALS['user']->id];
if ($lock->tryLock($lock_data)) {
ob_start();
set_time_limit(0);
$this->migrator->migrateTo($this->target);
$lock->release();
$announcements = ob_get_clean();
PageLayout::postSuccess(
_('Die Datenbank wurde erfolgreich migriert.'),
array_filter(explode("\n", $announcements))
);
$_SESSION['migration-check'] = [
'timestamp' => time(),
'count' => 0,
];
} else {
$user = User::find($lock_data['user_id']);
PageLayout::postError(sprintf(
_('Die Migration wurde %s von %s bereits angestossen und läuft noch.'),
reltime($lock_data['timestamp']),
htmlReady($user ? $user->getFullName() : _('unbekannt'))
));
}
$this->redirect('index');
}
public function history_action()
{
$this->migrations = $this->migrator->relevantMigrations(0);
$this->offset = -1;
$this->target = 0;
$this->render_action('index');
}
public function setupSidebar($action)
{
$views = Sidebar::get()->addWidget(new ViewsWidget());
$views->addLink(
_('Migrationen ausführen'),
$this->url_for('index', ['branch' => $this->branch])
)->setActive($action === 'index');
$views->addLink(
_('Migrationen zurücknehmen'),
$this->url_for('history', ['branch' => $this->branch])
)->setActive($action === 'history');
$widget = new SelectWidget(_('Branch'), $this->url_for($action), 'branch');
Sidebar::get()->addWidget($widget);
foreach ($this->version->getAllBranches() as $branch) {
$element = new SelectElement($branch, $branch ?: 'default', $branch == $this->branch);
$widget->addElement($element);
}
$widget = Sidebar::get()->addWidget(new SidebarWidget());
$widget->setTitle(_('Aktueller Versionsstand'));
$widget->addElement(new WidgetElement($this->version->get($this->branch)));
}
}
|