Index: branches/unlabeled/unlabeled-1.1.2/core/install/upgrades.php =================================================================== diff -u --- branches/unlabeled/unlabeled-1.1.2/core/install/upgrades.php (revision 0) +++ branches/unlabeled/unlabeled-1.1.2/core/install/upgrades.php (revision 7779) @@ -0,0 +1,21 @@ + \ No newline at end of file Index: branches/unlabeled/unlabeled-1.6.2/core/install.php =================================================================== diff -u -r7755 -r7779 --- branches/unlabeled/unlabeled-1.6.2/core/install.php (.../install.php) (revision 7755) +++ branches/unlabeled/unlabeled-1.6.2/core/install.php (.../install.php) (revision 7779) @@ -11,7 +11,7 @@ * Upgrade sqls are located using this mask * */ - define('UPGRADES_FILE', FULL_PATH.'/%sinstall/upgrades.sql'); + define('UPGRADES_FILE', FULL_PATH.'/%sinstall/upgrades.%s'); /** * Format of version identificator in upgrade files @@ -426,15 +426,21 @@ foreach ($modules as $module_name) { $module_info = $upgrade_data[$module_name]; - $upgrades_file = sprintf(UPGRADES_FILE, $module_info['Path']); + $upgrades_file = sprintf(UPGRADES_FILE, $module_info['Path'], 'sql'); $sqls = file_get_contents($upgrades_file); $version_mark = preg_replace('/(\(.*?\))/', $module_info['FromVersion'], VERSION_MARK); + // get only sqls from next (relative to current) version to end of file $start_pos = strpos($sqls, $version_mark); $sqls = substr($sqls, $start_pos); + + preg_match_all('/'.VERSION_MARK.'/s', $sqls, $regs); + + $this->RunUpgrades($module_info['Path'], $regs[1], 'before'); $this->RunSQLText($sqls); - + $this->RunUpgrades($module_info['Path'], $regs[1], 'after'); + // after upgrade sqls are executed update version $this->SetModuleVersion($module_name, $module_info['ToVersion']); } @@ -478,6 +484,39 @@ } /** + * Run upgrade PHP scripts for module with specified path + * + * @param string $module_path + * @param Array $versions + * @param string $mode upgrade mode = {before,after} + */ + function RunUpgrades($module_path, $versions, $mode) + { + static $upgrade_classes = Array (); + + $upgrades_file = sprintf(UPGRADES_FILE, $module_path, 'php'); + if (!file_exists($upgrades_file) || !$versions) { + return ; + } + + if (!isset($upgrade_classes[$module_path])) { + // save class name, because 2nd time + // (in after call $upgrade_class variable will not be present) + include_once $upgrades_file; + $upgrade_classes[$module_path] = $upgrade_class; + } + + $upgrade_object = new $upgrade_classes[$module_path](); + + foreach ($versions as $version) { + $upgrade_method = 'Upgrade_'.str_replace('.', '_', $version); + if (method_exists($upgrade_object, $upgrade_method)) { + $upgrade_object->$upgrade_method($mode); + } + } + } + + /** * Sets module version to passed * * @param string $module_name @@ -553,7 +592,7 @@ function GetMaxModuleVersion($module_name) { - $upgrades_file = sprintf(UPGRADES_FILE, strtolower($module_name).'/'); + $upgrades_file = sprintf(UPGRADES_FILE, strtolower($module_name).'/', 'sql'); if (!file_exists($upgrades_file)) { // no upgrade file return '4.0.1'; @@ -806,7 +845,7 @@ $ret = Array (); foreach ($this->Application->ModuleInfo as $module_name => $module_info) { - $upgrades_file = sprintf(UPGRADES_FILE, $module_info['Path']); + $upgrades_file = sprintf(UPGRADES_FILE, $module_info['Path'], 'sql'); if (!file_exists($upgrades_file)) { // no upgrade file continue;