migration-status.php
5.14 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<?php
namespace Yoast\WP\SEO\Config;
/**
* Migration_Status class.
*
* Used to validate whether or not migrations have been run and whether or not they should be run again.
*/
class Migration_Status {
/**
* The migration option key.
*
* @var string
*/
const MIGRATION_OPTION_KEY = 'yoast_migrations_';
/**
* The migration options.
*
* @var array
*/
protected $migration_options = [];
/**
* Checks if a given migration should be run.
*
* @param string $name The name of the migration.
* @param string $version The current version.
*
* @return bool Whether or not the migration should be run.
*/
public function should_run_migration( $name, $version = \WPSEO_VERSION ) {
$migration_status = $this->get_migration_status( $name );
// Check if we've attempted to run this migration in the past 10 minutes. If so, it may still be running.
if ( \array_key_exists( 'lock', $migration_status ) ) {
$timestamp = \strtotime( '-10 minutes' );
return $timestamp > $migration_status['lock'];
}
// Is the migration version less than the current version.
return \version_compare( $migration_status['version'], $version, '<' );
}
/**
* Checks whether or not the given migration is at least the given version, defaults to checking for the latest version.
*
* @param string $name The name of the migration.
* @param string $version The version to check, defaults to the latest version.
*
* @return bool Whether or not the requested migration is at least the requested version.
*/
public function is_version( $name, $version = \WPSEO_VERSION ) {
$migration_status = $this->get_migration_status( $name );
return \version_compare( $version, $migration_status['version'], '<=' );
}
/**
* Gets the error of a given migration if it exists.
*
* @param string $name The name of the migration.
*
* @return bool|array False if there is no error, otherwise the error.
*/
public function get_error( $name ) {
$migration_status = $this->get_migration_status( $name );
if ( ! isset( $migration_status['error'] ) ) {
return false;
}
return $migration_status['error'];
}
/**
* Sets an error for the migration.
*
* @param string $name The name of the migration.
* @param string $message Message explaining the reason for the error.
* @param string $version The current version.
*
* @return void
*/
public function set_error( $name, $message, $version = \WPSEO_VERSION ) {
$migration_status = $this->get_migration_status( $name );
$migration_status['error'] = [
'time' => \strtotime( 'now' ),
'version' => $version,
'message' => $message,
];
$this->set_migration_status( $name, $migration_status );
}
/**
* Updates the migration version to the latest version.
*
* @param string $name The name of the migration.
* @param string $version The current version.
*
* @return void
*/
public function set_success( $name, $version = \WPSEO_VERSION ) {
$migration_status = $this->get_migration_status( $name );
unset( $migration_status['lock'] );
unset( $migration_status['error'] );
$migration_status['version'] = $version;
$this->set_migration_status( $name, $migration_status );
}
/**
* Locks the migration status.
*
* @param string $name The name of the migration.
*
* @return bool Whether or not the migration was succesfully locked.
*/
public function lock_migration( $name ) {
$migration_status = $this->get_migration_status( $name );
$migration_status['lock'] = \strtotime( 'now' );
return $this->set_migration_status( $name, $migration_status );
}
/**
* Retrieves the migration option.
*
* @param string $name The name of the migration.
*
* @return bool|array The status of the migration, false if no status exists.
*/
protected function get_migration_status( $name ) {
$current_blog_id = \get_current_blog_id();
if ( ! isset( $this->migration_options[ $current_blog_id ][ $name ] ) ) {
$migration_status = \get_option( self::MIGRATION_OPTION_KEY . $name );
if ( ! \is_array( $migration_status ) || ! isset( $migration_status['version'] ) ) {
$migration_status = [ 'version' => '0.0' ];
}
if ( ! isset( $this->migration_options[ $current_blog_id ] ) ) {
$this->migration_options[ $current_blog_id ] = [];
}
$this->migration_options[ $current_blog_id ][ $name ] = $migration_status;
}
return $this->migration_options[ $current_blog_id ][ $name ];
}
/**
* Retrieves the migration option.
*
* @param string $name The name of the migration.
* @param array $migration_status The migration status.
*
* @return bool True if the status was succesfully updated, false otherwise.
*/
protected function set_migration_status( $name, $migration_status ) {
if ( ! \is_array( $migration_status ) || ! isset( $migration_status['version'] ) ) {
return false;
}
$current_blog_id = \get_current_blog_id();
if ( ! isset( $this->migration_options[ $current_blog_id ] ) ) {
$this->migration_options[ $current_blog_id ] = [];
}
$this->migration_options[ $current_blog_id ][ $name ] = $migration_status;
return \update_option( self::MIGRATION_OPTION_KEY . $name, $migration_status );
}
}