PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.27.2
GiveWP – Donation Plugin and Fundraising Platform v2.27.2
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Framework / Migrations / MigrationsRunner.php
give / src / Framework / Migrations Last commit date
Actions 4 years ago Contracts 4 years ago Controllers 4 years ago Exceptions 4 years ago MigrationsRegister.php 4 years ago MigrationsRunner.php 4 years ago MigrationsServiceProvider.php 4 years ago
MigrationsRunner.php
171 lines
1 <?php
2
3 namespace Give\Framework\Migrations;
4
5 use Exception;
6 use Give\Framework\Database\Exceptions\DatabaseQueryException;
7 use Give\Framework\Migrations\Contracts\Migration;
8 use Give\Log\Log;
9 use Give\MigrationLog\MigrationLogFactory;
10 use Give\MigrationLog\MigrationLogRepository;
11 use Give\MigrationLog\MigrationLogStatus;
12
13 /**
14 * Class MigrationsRunner
15 *
16 * @since 2.9.0
17 */
18 class MigrationsRunner
19 {
20 /**
21 * List of completed migrations.
22 *
23 * @since 2.9.0
24 *
25 * @var array
26 */
27 private $completedMigrations;
28
29 /**
30 * @since 2.9.0
31 *
32 * @var MigrationsRegister
33 */
34 private $migrationRegister;
35
36 /**
37 * @since 2.10.0
38 *
39 * @var MigrationLogFactory
40 */
41 private $migrationLogFactory;
42
43 /**
44 * @since 2.10.0
45 * @var MigrationLogRepository
46 */
47 private $migrationLogRepository;
48
49 /**
50 * MigrationsRunner constructor.
51 *
52 * @param MigrationsRegister $migrationRegister
53 * @param MigrationLogFactory $migrationLogFactory
54 * @param MigrationLogRepository $migrationLogRepository
55 */
56 public function __construct(
57 MigrationsRegister $migrationRegister,
58 MigrationLogFactory $migrationLogFactory,
59 MigrationLogRepository $migrationLogRepository
60 ) {
61 $this->migrationRegister = $migrationRegister;
62 $this->migrationLogFactory = $migrationLogFactory;
63 $this->migrationLogRepository = $migrationLogRepository;
64 $this->completedMigrations = $this->migrationLogRepository->getCompletedMigrationsIDs();
65 }
66
67 /**
68 * Run database migrations.
69 *
70 * @since 2.9.0
71 */
72 public function run()
73 {
74 global $wpdb;
75
76 if ( ! $this->hasMigrationToRun()) {
77 return;
78 }
79
80 // Stop Migration Runner if there are failed migrations
81 if ($this->migrationLogRepository->getFailedMigrationsCountByIds(
82 $this->migrationRegister->getRegisteredIds()
83 )) {
84 return;
85 }
86
87 // Store and sort migrations by timestamp
88 $migrations = [];
89
90 foreach ($this->migrationRegister->getMigrations() as $migrationClass) {
91 /* @var Migration $migrationClass */
92 $migrations[$migrationClass::timestamp() . '_' . $migrationClass::id()] = $migrationClass;
93 }
94
95 ksort($migrations);
96
97 foreach ($migrations as $key => $migrationClass) {
98 $migrationId = $migrationClass::id();
99
100 if (in_array($migrationId, $this->completedMigrations, true)) {
101 continue;
102 }
103
104 $migrationLog = $this->migrationLogFactory->make($migrationId);
105
106 // Begin transaction
107 $wpdb->query('START TRANSACTION');
108
109 try {
110 /** @var Migration $migration */
111 $migration = give($migrationClass);
112
113 $migration->run();
114
115 // Save migration status
116 $migrationLog->setStatus(MigrationLogStatus::SUCCESS);
117 } catch (Exception $exception) {
118 $wpdb->query('ROLLBACK');
119
120 $migrationLog->setStatus(MigrationLogStatus::FAILED);
121 $migrationLog->setError($exception);
122
123 give()->notices->register_notice(
124 [
125 'id' => 'migration-failure',
126 'description' => sprintf(
127 '%1$s <a href="https://givewp.com/support/">https://givewp.com/support</a>',
128 esc_html__(
129 'There was a problem running the migrations. Please reach out to GiveWP support for assistance:',
130 'give'
131 )
132 ),
133 ]
134 );
135 }
136
137 try {
138 $migrationLog->save();
139 } catch (DatabaseQueryException $e) {
140 Log::error(
141 'Failed to save migration log',
142 [
143 'Error Message' => $e->getMessage(),
144 'Query Errors' => $e->getQueryErrors(),
145 ]
146 );
147 }
148
149 // Stop Migration Runner if migration has failed
150 if ($migrationLog->getStatus() === MigrationLogStatus::FAILED) {
151 break;
152 }
153
154 // Commit transaction if successful
155 $wpdb->query('COMMIT');
156 }
157 }
158
159 /**
160 * Return whether or not all migrations completed.
161 *
162 * @since 2.9.0
163 *
164 * @return bool
165 */
166 public function hasMigrationToRun()
167 {
168 return (bool)array_diff($this->migrationRegister->getRegisteredIds(), $this->completedMigrations);
169 }
170 }
171