| 
<?phpnamespace Jackbooted\DB;
 
 use \Jackbooted\Config\Cfg;
 use \Jackbooted\Util\Log4PHP;
 use \Jackbooted\DB\DB;
 
 /**
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved.
 *
 * Written by Brett Dutton of Jackbooted Software
 * brett at brettdutton dot com
 *
 * This software is written and distributed under the GNU General Public
 * License which means that its source code is freely-distributed and
 * available to the general public.
 */
 class Migrations extends \Jackbooted\Html\WebPage {
 
 public static function init () {
 self::$log = Log4PHP::logFactory ( __CLASS__ );
 }
 
 public static function migrate () {
 $maxRun = 0;
 $runItems = [];
 foreach ( DBTable::factory( DB::DEF, 'SELECT * FROM tblMigration' ) as $row ) {
 if ( (int)$row['fldRun'] > $maxRun ) {
 $maxRun = (int)$row['fldRun'];
 }
 
 if ( ! isset( $runItems[$row['fldClass']] ) ) {
 $runItems[$row['fldClass']] = [];
 }
 
 $runItems[$row['fldClass']][] = $row['fldMethod'];
 }
 
 $maxRun += 1;
 $html = '';
 
 // Go through all the migration classes
 foreach ( Cfg::get( 'migration', [] ) as $migrationClass ) {
 $clazz = new \ReflectionClass( $migrationClass );
 
 // If new class then just add empty list
 if ( ! isset( $runItems[$migrationClass] ) ) {
 $runItems[$migrationClass] = [];
 }
 
 // get a list of methods to run
 $methodList = [];
 foreach ( $clazz->getMethods() as $method ) {
 if ( in_array( $method->name, $runItems[$migrationClass] ) ) continue;
 if ( strpos( $method->name, 'migrate' ) !== 0 ) continue;
 
 // Add the name to the list
 $methodList[] = $method->name;
 }
 
 // Sort so that it will be date ordered
 sort( $methodList );
 
 foreach ( $methodList as $method ) {
 if ( ( $result = call_user_func([ $migrationClass, $method ] ) ) === false ) {
 $html .= "There is a problem running {$migrationClass}::{$method}<br/>\n";
 }
 else {
 $html .= $result;
 DB::exec( DB::DEF,
 'INSERT INTO tblMigration (fldMigrationID,fldRun,fldClass,fldMethod) VALUES (?,?,?,?)',
 [ DBMaintenance::dbNextNumber( DB::DEF, 'tblMigration' ),
 $maxRun,
 $migrationClass,
 $method ] );
 }
 }
 }
 return $html;
 }
 }
 |