first commit
This commit is contained in:
181
wp-content/plugins/brizy/admin/migrations.php
Normal file
181
wp-content/plugins/brizy/admin/migrations.php
Normal file
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
|
||||
class Brizy_Admin_Migrations {
|
||||
|
||||
const BRIZY_MIGRATIONS = 'brizy_migrations';
|
||||
|
||||
/**
|
||||
* @var Brizy_Admin_Migrations_GlobalStorage
|
||||
*/
|
||||
private $globalStorage;
|
||||
|
||||
/**
|
||||
* @var Brizy_Admin_Migrations_MigrationInterface[]
|
||||
*/
|
||||
private $existinMigrations;
|
||||
|
||||
/**
|
||||
* Brizy_Admin_Migrations constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->existinMigrations = array();
|
||||
$this->globalStorage = new Brizy_Admin_Migrations_GlobalStorage();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $version
|
||||
*/
|
||||
public function runMigrations( $version ) {
|
||||
|
||||
$migrations = $this->getExistingMigrations();
|
||||
|
||||
$latestExecutedMigration = $this->getLatestRunMigration();
|
||||
$latestExecutedVersion = $latestExecutedMigration->getVersion();
|
||||
$latestMigrationVersion = end( $migrations );
|
||||
|
||||
$version_compare = version_compare( $version, $latestExecutedVersion );
|
||||
|
||||
if ( $version_compare === 1 && $latestMigrationVersion->getVersion() != $latestExecutedMigration->getVersion() ) {
|
||||
$this->upgradeTo( $version );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Brizy_Admin_Migrations_MigrationInterface[]
|
||||
*/
|
||||
private function getExistingMigrations() {
|
||||
|
||||
if ( count( $this->existinMigrations ) ) {
|
||||
return $this->existinMigrations;
|
||||
}
|
||||
|
||||
$migrations = array(
|
||||
new Brizy_Admin_Migrations_BlockPostTitleMigration,
|
||||
new Brizy_Admin_Migrations_CleanInvalidBlocksMigration,
|
||||
new Brizy_Admin_Migrations_CleanLogsMigration,
|
||||
new Brizy_Admin_Migrations_FormSerializationMigration,
|
||||
new Brizy_Admin_Migrations_GlobalBlocksToCustomPostMigration,
|
||||
new Brizy_Admin_Migrations_GlobalVersionsMigration,
|
||||
new Brizy_Admin_Migrations_GlobalsToDataMigration,
|
||||
new Brizy_Admin_Migrations_NullMigration,
|
||||
new Brizy_Admin_Migrations_ProjectToCustomPostMigration,
|
||||
new Brizy_Admin_Migrations_RulesMigration,
|
||||
new Brizy_Admin_Migrations_ShortcodesMobileOneMigration,
|
||||
new Brizy_Admin_Migrations_FixGlobalsToDataMigration,
|
||||
new Brizy_Admin_Migrations_ScreenshotMigration,
|
||||
new Brizy_Admin_Migrations_UseEditorMigration,
|
||||
new Brizy_Admin_Migrations_AttachmentUidMigration,
|
||||
);
|
||||
|
||||
usort( $migrations, function ( $a, $b ) {
|
||||
return version_compare( $a->getVersion(), $b->getVersion() );
|
||||
} );
|
||||
|
||||
$migrations = array_filter( $migrations, function ( $migration ) {
|
||||
return in_array( version_compare( $migration->getVersion(), BRIZY_VERSION ), array( - 1, 0 ) );
|
||||
} );
|
||||
|
||||
return $this->existinMigrations = $migrations;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Brizy_Admin_Migrations_MigrationInterface|mixed
|
||||
*/
|
||||
private function getLatestRunMigration() {
|
||||
|
||||
$latest = $this->globalStorage->latestMigration();
|
||||
|
||||
if ( ! $latest instanceof Brizy_Admin_Migrations_MigrationInterface ) {
|
||||
$latest = new Brizy_Admin_Migrations_NullMigration();
|
||||
}
|
||||
|
||||
return $latest;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $version
|
||||
*/
|
||||
private function upgradeTo( $version ) {
|
||||
global $wpdb;
|
||||
|
||||
wp_raise_memory_limit( 'image' );
|
||||
|
||||
Brizy_Logger::instance()->debug( 'Starting migration process: [upgrading]' );
|
||||
|
||||
/**
|
||||
* @var Brizy_Admin_Migrations_MigrationInterface
|
||||
*/
|
||||
$latestExecutedVersion = BRIZY_VERSION;
|
||||
$latestExecutedMigration = $this->getLatestRunMigration();
|
||||
if ( $latestExecutedMigration ) {
|
||||
$latestExecutedVersion = $latestExecutedMigration->getVersion();
|
||||
}
|
||||
Brizy_Logger::instance()->debug( "Upgrading to version [{$version}] from version: [{$latestExecutedVersion}]: ", array( $version ) );
|
||||
|
||||
/**
|
||||
* @var Brizy_Admin_Migrations_MigrationInterface[]
|
||||
*/
|
||||
$migrationsToRun = $this->getExistingMigrations();
|
||||
|
||||
if ( $latestExecutedMigration ) {
|
||||
$migrationsToRun = array_filter( $migrationsToRun, function ( $migration ) use ( $latestExecutedMigration, $version ) {
|
||||
$version_compare1 = version_compare( $latestExecutedMigration->getVersion(), $migration->getVersion() );
|
||||
$version_compare2 = version_compare( $migration->getVersion(), $version );
|
||||
|
||||
return $version_compare1 == - 1 && ( $version_compare2 == - 1 || $version_compare2 == 0 );
|
||||
} );
|
||||
}
|
||||
|
||||
$migrations = array();
|
||||
|
||||
foreach ( $migrationsToRun as $m ) {
|
||||
$migrations[ $m->getVersion() ][] = $m;
|
||||
}
|
||||
|
||||
foreach ( $migrations as $v => $m ) {
|
||||
//prioritise migrations
|
||||
usort( $migrations[ $v ], function ( $a, $b ) {
|
||||
$p1 = $a->getPriority();
|
||||
$p2 = $b->getPriority();
|
||||
|
||||
if ( $p1 == $p2 ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ( $p1 < $p2 ) ? - 1 : 1;
|
||||
} );
|
||||
}
|
||||
|
||||
// run migrations
|
||||
foreach ( $migrations as $versionMigrations ) {
|
||||
try {
|
||||
$wpdb->query( 'START TRANSACTION ' );
|
||||
|
||||
foreach ( $versionMigrations as $migration ) {
|
||||
$migrationClass = get_class( $migration );
|
||||
|
||||
$migration->execute();
|
||||
|
||||
Brizy_Logger::instance()->debug( 'Run migration: ' . $migrationClass, array( $migrationClass ) );
|
||||
|
||||
$this->globalStorage->addMigration( $migration )->save();
|
||||
|
||||
Brizy_Editor_Project::cleanClassCache();
|
||||
Brizy_Editor_Post::cleanClassCache();
|
||||
Brizy_Editor_Block::cleanClassCache();
|
||||
}
|
||||
|
||||
$wpdb->query( 'COMMIT' );
|
||||
} catch ( Exception $e ) {
|
||||
$wpdb->query( 'ROLLBACK' );
|
||||
Brizy_Logger::instance()->critical( 'Migration process ERROR', [ $migrationClass, $e->getTraceAsString() ] );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Brizy_Logger::instance()->debug( 'Migration process successful' );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user