Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > sql > mysql4-rollback


Автор: awers 14.11.2009, 15:25
Собственно с rollback`ом дела обстоят немного хуже чем с install and upgrade. Разработчики Magento видимо планировали написать rollback и идея заглохла либо эту идею реализовали только в Enterprise версии системы. Но это не беда. Собственно я предлагаю немножко модифицировать файл /app/code/core/Mage/Core/Model/Resource/Setup.php:

Находим функцию "_getModifySqlFiles" 
Код

protected function _getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrFiles)
    {
        $arrRes = array();

        switch ($actionType) {
            case 'install':
                uksort($arrFiles, 'version_compare');
                foreach ($arrFiles as $version => $file) {
                    if (version_compare($version, $toVersion)!==self::VERSION_COMPARE_GREATER) {
                        $arrRes[0] = array('toVersion'=>$version, 'fileName'=>$file);
                    }
                }
                break;

            case 'upgrade':
                uksort($arrFiles, 'version_compare');
                foreach ($arrFiles as $version => $file) {
                    $version_info = explode('-', $version);

                    // In array must be 2 elements: 0 => version from, 1 => version to
                    if (count($version_info)!=2) {
                        break;
                    }
                    $infoFrom = $version_info[0];
                    $infoTo   = $version_info[1];
                    if (version_compare($infoFrom, $fromVersion)!==self::VERSION_COMPARE_LOWER
                        && version_compare($infoTo, $toVersion)!==self::VERSION_COMPARE_GREATER) {
                        $arrRes[] = array('toVersion'=>$infoTo, 'fileName'=>$file);
                    }
                }
                break;
            case 'rollback':
            case 'uninstall':
                break;
        }
        return $arrRes;
    }


И заменяем case 'rollback' на следующее:
Код

        /**
         * Added case for follback action
         * @author Awers
         * @date 05/11/2009
         */
            case 'rollback':
        uksort($arrFiles, 'version_compare');
        krsort($arrFiles);
        foreach ($arrFiles as $version => $file) {
            $version_info = explode('-', $version);
            if (count($version_info)!=2) {
                break;
            }
            $infoFrom = $version_info[0];
            $infoTo   = $version_info[1];
            if (version_compare($infoFrom, $fromVersion)!==self::VERSION_COMPARE_LOWER
                && version_compare($infoTo, $toVersion)!==self::VERSION_COMPARE_GREATER) {
                    $arrRes[] = array('toVersion'=>$infoTo, 'fileName'=>$file);
                }
        }
                break;


Далее, всё что нам остаётся - юзать файлы mysql4-rollback-major-minor.php где major это версия с какой хотим откатиться и minor это на какую. 
Rollback работает по аналогии с upgrade, т.е. строит массив файлов и поочерёдно выполняет их. Для того что бы всё это выполнялось в нужном порядке, я добавил krsort($arrFiles);

Добавлено через 10 минут и 55 секунд
Список функций можно найти тут: http://forum.vingrad.ru/forum/topic-280106.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)