119 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Zotlabs\Lib;
 | |
| 
 | |
| 
 | |
| class DB_Upgrade {
 | |
| 
 | |
| 	public $config_name = '';
 | |
| 	public $func_prefix = '';
 | |
| 
 | |
| 	function __construct($db_revision) {
 | |
| 
 | |
| 		$update_file = 'install/' . PLATFORM_NAME . '/update.php';
 | |
| 		if(! file_exists($update_file)) {
 | |
| 			$update_file = 'install/update.php';
 | |
| 			$this->config_name = 'db_version';
 | |
| 			$this->func_prefix = 'update_r';
 | |
| 		}
 | |
| 		else {
 | |
| 			$this->config_name = PLATFORM_NAME . '_db_version';
 | |
| 			$this->func_prefix = PLATFORM_NAME . '_update_';
 | |
| 		}
 | |
| 
 | |
| 		$build = get_config('system', $this->config_name, 0);
 | |
| 		if(! intval($build))
 | |
| 			$build = set_config('system', $this->config_name, $db_revision);
 | |
| 
 | |
| 		if($build == $db_revision) {
 | |
| 			// Nothing to be done.
 | |
| 			return;
 | |
| 		}
 | |
| 		else {
 | |
| 			$stored = intval($build);
 | |
| 			if(! $stored) {
 | |
| 				logger('Critical: check_config unable to determine database schema version');
 | |
| 				return;
 | |
| 			}
 | |
| 		
 | |
| 			$current = intval($db_revision);
 | |
| 
 | |
| 			if(($stored < $current) && file_exists($update_file)) {
 | |
| 
 | |
| 				Config::Load('database');
 | |
| 
 | |
| 				// We're reporting a different version than what is currently installed.
 | |
| 				// Run any existing update scripts to bring the database up to current.
 | |
| 				
 | |
| 				require_once($update_file);
 | |
| 
 | |
| 				// make sure that boot.php and update.php are the same release, we might be
 | |
| 				// updating from git right this very second and the correct version of the update.php
 | |
| 				// file may not be here yet. This can happen on a very busy site.
 | |
| 
 | |
| 				if($db_revision == UPDATE_VERSION) {
 | |
| 					for($x = $stored; $x < $current; $x ++) {
 | |
| 						$func = $this->func_prefix . $x;
 | |
| 						if(function_exists($func)) {
 | |
| 							// There could be a lot of processes running or about to run.
 | |
| 							// We want exactly one process to run the update command.
 | |
| 							// So store the fact that we're taking responsibility
 | |
| 							// after first checking to see if somebody else already has.
 | |
| 
 | |
| 							// If the update fails or times-out completely you may need to
 | |
| 							// delete the config entry to try again.
 | |
| 
 | |
| 							if(get_config('database', $func))
 | |
| 								break;
 | |
| 							set_config('database',$func, '1');
 | |
| 							// call the specific update
 | |
| 
 | |
| 							$retval = $func();
 | |
| 							if($retval) {
 | |
| 
 | |
| 								// Prevent sending hundreds of thousands of emails by creating
 | |
| 								// a lockfile.  
 | |
| 
 | |
| 								$lockfile = 'store/[data]/mailsent';
 | |
| 
 | |
| 								if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400)))
 | |
| 									return;
 | |
| 								@unlink($lockfile);
 | |
| 								//send the administrator an e-mail
 | |
| 								file_put_contents($lockfile, $x);
 | |
| 							
 | |
| 								$r = q("select account_language from account where account_email = '%s' limit 1",
 | |
| 									dbesc(App::$config['system']['admin_email'])
 | |
| 								);
 | |
| 								push_lang(($r) ? $r[0]['account_language'] : 'en');
 | |
| 
 | |
| 								z_mail(
 | |
| 									[
 | |
| 										'toEmail'        => \App::$config['system']['admin_email'],
 | |
| 										'messageSubject' => sprintf( t('Update Error at %s'), z_root()),
 | |
| 										'textVersion'    => replace_macros(get_intltext_template('update_fail_eml.tpl'), 
 | |
| 											[
 | |
| 												'$sitename' => \App::$config['system']['sitename'],
 | |
| 												'$siteurl' =>  z_root(),
 | |
| 												'$update' => $x,
 | |
| 												'$error' => sprintf( t('Update %s failed. See error logs.'), $x)
 | |
| 											]
 | |
| 										)
 | |
| 									]
 | |
| 								);
 | |
| 
 | |
| 								//try the logger
 | |
| 								logger('CRITICAL: Update Failed: ' . $x);
 | |
| 								pop_lang();
 | |
| 							}
 | |
| 							else {
 | |
| 								set_config('database',$func, 'success');
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					set_config('system', $this->config_name, $db_revision);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| } |