Skip to content
Snippets Groups Projects
Select Git revision
  • 2189154988875c39b0a792aa335afaf27361ab1f
  • master default protected
  • bugfix/wordpress-review
  • bugfix/prevent-error-notice
  • remove-arrow
  • feature/update-message
  • feature/minimum-plugin-version-check-demo1
  • feature/plugin-name
  • 3.7.1
  • 3.7.0
  • 3.6.3
  • 3.6.2
  • 3.6.1
  • 3.6.0
  • 3.6.0-beta3
  • 3.6.0-beta2
  • 3.6.0-beta1
  • 3.5.2
  • 3.5.1
  • 3.5.0
  • 3.4.0
  • 3.3.0
  • 3.2.8
  • 3.2.7
  • 3.2.6
  • 3.2.5
  • 3.2.4
  • 3.2.3
28 results

README.md

Blame
  • WpdbMigrator.php 3.46 KiB
    <?php
    declare(strict_types=1);
    
    namespace WPDesk\Migrations;
    
    use Psr\Log\LoggerInterface;
    use WPDesk\Migrations\Finder\GlobFinder;
    use WPDesk\Migrations\Version\AlphabeticalComparator;
    use WPDesk\Migrations\Version\Comparator;
    use WPDesk\Migrations\Version\Version;
    use WPDesk\Migrations\Version\WpdbMigrationFactory;
    
    class WpdbMigrator implements Migrator {
    
    	/** @var \wpdb */
    	private $wpdb;
    
    	/** @var MigrationsRepository */
    	private $migrations_repository;
    
    	/** @var Comparator */
    	private $comparator;
    
    	/** @var LoggerInterface */
    	private $logger;
    
    	/** @var string */
    	private $option_name;
    
    	/** @param string[] $migration_directories */
    	public static function from_directories( array $migration_directories, string $option_name ): self {
    		global $wpdb;
    		$logger = new WpdbLogger( $option_name . '_log' );
    
    		return new self(
    			$wpdb,
    			$option_name,
    			new FilesystemMigrationsRepository(
    				$migration_directories,
    				new GlobFinder(),
    				new WpdbMigrationFactory(
    					$wpdb,
    					$logger
    				),
    				new AlphabeticalComparator()
    			),
    			new AlphabeticalComparator(),
    			$logger
    		);
    	}
    
    	/** @param class-string<AbstractMigration>[] $migration_class_names */
    	public static function from_classes( array $migration_class_names, string $option_name ): self {
    		global $wpdb;
    		$logger = new WpdbLogger( $option_name . '_log' );
    
    		return new self(
    			$wpdb,
    			$option_name,
    			new ArrayMigrationsRepository(
    				$migration_class_names,
    				new WpdbMigrationFactory(
    					$wpdb,
    					$logger
    				),
    				new AlphabeticalComparator()
    			),
    			new AlphabeticalComparator(),
    			$logger
    		);
    	}
    
    	public function __construct(
    		\wpdb $wpdb,
    		string $option_name,
    		MigrationsRepository $migrations_repository,
    		Comparator $comparator,
    		LoggerInterface $logger
    	) {
    		$this->wpdb                  = $wpdb;
    		$this->option_name           = $option_name;
    		$this->migrations_repository = $migrations_repository;
    		$this->comparator            = $comparator;
    		$this->logger                = $logger;
    	}
    
    	private function get_current_version(): Version {
    		return new Version( get_option( $this->option_name, '' ) );
    	}
    
    	private function needs_migration(): bool {
    		$migrations     = $this->migrations_repository->get_migrations();
    		$last_migration = end( $migrations );
    		if ( $last_migration === false ) {
    			return false;
    		}
    		if ( $this->comparator->compare( $last_migration->get_version(), $this->get_current_version() ) ) {
    			return true;
    		}
    		return false;
    	}
    
    	public function migrate(): void {
    		require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    
    		if ( ! $this->needs_migration() ) {
    			return;
    		}
    
    		$this->logger->info( 'DB update start' );
    		$current_version = $this->get_current_version();
    
    		foreach ( $this->migrations_repository->get_migrations() as $migration ) {
    			if ( $this->comparator->compare( $migration->get_version(), $this->get_current_version() ) ) {
    				$this->logger->info( sprintf( 'DB update %s:%s', $current_version, $migration->get_version() ) );
    				try {
    					$migration->get_migration()->up();
    					$this->logger->info( sprintf( 'DB update %s:%s -> ', $current_version, $migration->get_version() ) . 'OK' );
    					update_option( $this->option_name, (string) $migration->get_version(), true );
    				} catch ( \Throwable $e ) {
    					$error_msg = sprintf( 'Error while upgrading a database: %s', $this->wpdb->last_error );
    					$this->logger->error( $error_msg );
    					trigger_error( $error_msg, E_USER_WARNING );
    				}
    			}
    		}
    
    		$this->logger->info( 'DB update finished' );
    	}
    
    }