* @copyright 2007-2014 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
$filePrefix = 'PREFIX_';
$engineType = 'ENGINE_TYPE';
// Set execution time and time_limit to infinite if available
@set_time_limit(0);
@ini_set('max_execution_time', '0');
// setting the memory limit to 128M only if current is lower
$memory_limit = ini_get('memory_limit');
if (substr($memory_limit,-1) != 'G'
AND ((substr($memory_limit,-1) == 'M' AND substr($memory_limit,0, -1) < 128)
OR is_numeric($memory_limit) AND (intval($memory_limit) < 131072) AND $memory_limit > 0)
)
@ini_set('memory_limit','128M');
// redefine REQUEST_URI if empty (on some webservers...)
if (!isset($_SERVER['REQUEST_URI']) || $_SERVER['REQUEST_URI'] == '')
{
if (!isset($_SERVER['SCRIPT_NAME']) && isset($_SERVER['SCRIPT_FILENAME']))
$_SERVER['SCRIPT_NAME'] = $_SERVER['SCRIPT_FILENAME'];
else
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
}
if ($tmp = strpos($_SERVER['REQUEST_URI'], '?'))
$_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $tmp);
$_SERVER['REQUEST_URI'] = str_replace('//', '/', $_SERVER['REQUEST_URI']);
// retrocompatibility (is present in some upgrade scripts)
define('INSTALL_PATH', dirname(dirname(__FILE__)).'/');
require_once(INSTALL_PATH . 'install_version.php');
define('SETTINGS_FILE', INSTALL_PATH . '/../config/settings.inc.php');
if (file_exists(SETTINGS_FILE))
include_once(SETTINGS_FILE);
else
die('settings.inc.php is missing (error code 30).');
// need for upgrade before 1.5
if (!defined('__PS_BASE_URI__'))
define('__PS_BASE_URI__', str_replace('//', '/', '/'.trim(preg_replace('#/(install(-dev)?/upgrade)$#', '/', str_replace('\\', '/', dirname($_SERVER['REQUEST_URI']))), '/').'/'));
// need for upgrade before 1.5
if (!defined('_THEME_NAME_'))
define('_THEME_NAME_', 'default');
require_once(dirname(__FILE__).'/../init.php');
// set logger
require_once(_PS_INSTALL_PATH_.'upgrade/classes/AbstractLogger.php');
eval('abstract class AbstractLogger extends AbstractLoggerCore{}');
require_once(_PS_INSTALL_PATH_.'upgrade/classes/FileLogger.php');
eval('class FileLogger extends FileLoggerCore{}');
$logger = new FileLogger();
$logger->setFilename(_PS_ROOT_DIR_.'/log/'.@date('Ymd').'_upgrade.log');
if (function_exists('date_default_timezone_set'))
date_default_timezone_set('Europe/Paris');
// if _PS_ROOT_DIR_ is defined, use it instead of "guessing" the module dir.
if (defined('_PS_ROOT_DIR_') AND !defined('_PS_MODULE_DIR_'))
define('_PS_MODULE_DIR_', _PS_ROOT_DIR_.'/modules/');
elseif (!defined('_PS_MODULE_DIR_'))
define('_PS_MODULE_DIR_', _PS_INSTALL_PATH_.'/../modules/');
if (!defined('_PS_INSTALLER_PHP_UPGRADE_DIR_'))
define('_PS_INSTALLER_PHP_UPGRADE_DIR_', _PS_INSTALL_PATH_.'upgrade/php/');
if (!defined('_PS_INSTALLER_SQL_UPGRADE_DIR_'))
define('_PS_INSTALLER_SQL_UPGRADE_DIR_', _PS_INSTALL_PATH_.'upgrade/sql/');
//old version detection
global $oldversion, $logger;
$oldversion = false;
//sql file execution
global $requests, $warningExist;
$requests = '';
$fail_result = '';
$warningExist = false;
if (!defined('_THEMES_DIR_'))
define('_THEMES_DIR_', __PS_BASE_URI__.'themes/');
if (!defined('_PS_IMG_'))
define('_PS_IMG_', __PS_BASE_URI__.'img/');
if (!defined('_PS_JS_DIR_'))
define('_PS_JS_DIR_', __PS_BASE_URI__.'js/');
if (!defined('_PS_CSS_DIR_'))
define('_PS_CSS_DIR_', __PS_BASE_URI__.'css/');
$oldversion = _PS_VERSION_;
$versionCompare = version_compare(_PS_INSTALL_VERSION_, $oldversion);
if ($versionCompare == '-1')
{
$logger->logError('This installer is too old.');
$requests .= ''."\n";
}
elseif ($versionCompare == 0)
{
$logger->logError(sprintf('You already have the %s version.',_PS_INSTALL_VERSION_));
$fail_result .= ''."\n";
}
elseif ($versionCompare === false)
{
$logger->logError('There is no older version. Did you delete or rename the config/settings.inc.php file?');
$fail_result .= ''."\n";
}
if((defined('_PS_CACHE_ENABLED_') && _PS_CACHE_ENABLED_))
{
$logger->logError('The cache is activated. Please deactivate it first before lauching this script.');
$fail_result .= ''."\n";
}
//check DB access
// include_once(_PS_INSTALL_PATH_.'/classes/ToolsInstall.php');
// $resultDB = ToolsInstall::checkDB(_DB_SERVER_, _DB_USER_, _DB_PASSWD_, _DB_NAME_, false);
/*
if ($resultDB !== true)
{
$logger->logError('Invalid database configuration.');
die("\n");
}
*/
//
//custom sql file creation
$upgradeFiles = array();
if (empty ($fail_result))
{
if ($handle = opendir(_PS_INSTALLER_SQL_UPGRADE_DIR_))
{
while (false !== ($file = readdir($handle)))
if ($file != '.' AND $file != '..')
$upgradeFiles[] = str_replace(".sql", "", $file);
closedir($handle);
}
if (empty($upgradeFiles))
{
$logger->logError('Can\'t find the sql upgrade files. Please verify that the /install/sql/upgrade folder is not empty)');
$fail_result .= ''."\n";
}
natcasesort($upgradeFiles);
}
// fix : complete version number if there is not all 4 numbers
// for example replace 1.4.3 by 1.4.3.0
// consequences : file 1.4.3.0.sql will be skipped if oldversion = 1.4.3
// @since 1.4.4.0
$arrayVersion = preg_split('#\.#', $oldversion);
$versionNumbers = sizeof($arrayVersion);
if ($versionNumbers != 4)
$arrayVersion = array_pad($arrayVersion, 4, '0');
$oldversion = implode('.', $arrayVersion);
// end of fix
$neededUpgradeFiles = array();
foreach ($upgradeFiles AS $version)
{
if (version_compare($version, $oldversion) == 1 AND version_compare(_PS_INSTALL_VERSION_, $version) != -1)
$neededUpgradeFiles[] = $version;
}
if (empty ($fail_result) && empty($neededUpgradeFiles))
{
$logger->logError('No upgrade is possible.');
$fail_result .= ''."\n";
}
// refresh conf file
require_once(_PS_INSTALL_PATH_.'upgrade/classes/AddConfToFile.php');
$oldLevel = error_reporting(E_ALL);
$mysqlEngine = (defined('_MYSQL_ENGINE_') ? _MYSQL_ENGINE_ : 'MyISAM');
if (defined('_PS_CACHING_SYSTEM_') AND _PS_CACHING_SYSTEM_ == 'CacheFS')
$cache_engine = 'CacheFs';
elseif (defined('_PS_CACHING_SYSTEM_') AND _PS_CACHING_SYSTEM_ != 'CacheMemcache')
$cache_engine = _PS_CACHING_SYSTEM_;
else
$cache_engine = 'CacheMemcache';
$datas = array(
array('_DB_SERVER_', _DB_SERVER_),
array('_DB_NAME_', _DB_NAME_),
array('_DB_USER_', _DB_USER_),
array('_DB_PASSWD_', _DB_PASSWD_),
array('_DB_PREFIX_', _DB_PREFIX_),
array('_MYSQL_ENGINE_', $mysqlEngine),
array('_PS_CACHING_SYSTEM_', $cache_engine),
array('_PS_CACHE_ENABLED_', defined('_PS_CACHE_ENABLED_') ? _PS_CACHE_ENABLED_ : '0'),
array('_MEDIA_SERVER_1_', defined('_MEDIA_SERVER_1_') ? _MEDIA_SERVER_1_ : ''),
array('_MEDIA_SERVER_2_', defined('_MEDIA_SERVER_2_') ? _MEDIA_SERVER_2_ : ''),
array('_MEDIA_SERVER_3_', defined('_MEDIA_SERVER_3_') ? _MEDIA_SERVER_3_ : ''),
// 1.4 only
// array('__PS_BASE_URI__', __PS_BASE_URI__),
// 1.4 only
// array('_THEME_NAME_', _THEME_NAME_),
array('_PS_DIRECTORY_', __PS_BASE_URI__),
array('_COOKIE_KEY_', _COOKIE_KEY_),
array('_COOKIE_IV_', _COOKIE_IV_),
array('_PS_CREATION_DATE_', defined("_PS_CREATION_DATE_") ? _PS_CREATION_DATE_ : date('Y-m-d')),
array('_PS_VERSION_', _PS_INSTALL_VERSION_)
);
if (defined('_RIJNDAEL_KEY_'))
$datas[] = array('_RIJNDAEL_KEY_', _RIJNDAEL_KEY_);
if (defined('_RIJNDAEL_IV_'))
$datas[] = array('_RIJNDAEL_IV_', _RIJNDAEL_IV_);
if(!defined('_PS_CACHE_ENABLED_'))
define('_PS_CACHE_ENABLED_', '0');
if(!defined('_MYSQL_ENGINE_'))
define('_MYSQL_ENGINE_', 'MyISAM');
global $smarty;
// Clean all cache values
Cache::clean('*');
Context::getContext()->shop = new Shop(1);
Shop::setContext(Shop::CONTEXT_SHOP, 1);
if (!isset(Context::getContext()->language) || !Validate::isLoadedObject(Context::getContext()->language))
if ($id_lang = (int)getConfValue('PS_LANG_DEFAULT'))
Context::getContext()->language = new Language($id_lang);
if (!isset(Context::getContext()->country) || !Validate::isLoadedObject(Context::getContext()->country))
if ($id_country = (int)getConfValue('PS_COUNTRY_DEFAULT'))
Context::getContext()->country = new Country((int)$id_country);
Context::getContext()->cart = new Cart();
Context::getContext()->employee = new Employee(1);
if (!defined('_PS_SMARTY_FAST_LOAD_'))
define('_PS_SMARTY_FAST_LOAD_', true);
require_once _PS_ROOT_DIR_.'/config/smarty.config.inc.php';
Context::getContext()->smarty = $smarty;
if(isset($_GET['customModule']) AND $_GET['customModule'] == 'desactivate')
{
require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'deactivate_custom_modules.php');
deactivate_custom_modules();
}
$sqlContentVersion = array();
if (empty($fail_result))
foreach($neededUpgradeFiles AS $version)
{
$file = _PS_INSTALLER_SQL_UPGRADE_DIR_.$version.'.sql';
if (!file_exists($file))
{
$logger->logError('Error while loading sql upgrade file.');
$fail_result .= ''."\n";
}
if (!$sqlContent = file_get_contents($file))
{
$logger->logError(sprintf('Error while loading sql upgrade file %s.', $version));
$fail_result .= ''."\n";
}
$sqlContent .= "\n";
$sqlContent = str_replace(array($filePrefix, $engineType), array(_DB_PREFIX_, $mysqlEngine), $sqlContent);
$sqlContent = preg_split("/;\s*[\r\n]+/", $sqlContent);
$sqlContentVersion[$version] = $sqlContent;
}
if (empty($fail_result))
{
error_reporting($oldLevel);
$confFile = new AddConfToFile(SETTINGS_FILE, 'w');
if ($confFile->error)
{
$logger->logError($confFile->error);
$fail_result .= ''."\n";
}
else
foreach ($datas AS $data)
$confFile->writeInFile($data[0], $data[1]);
if ($confFile->error != false)
{
$logger->logError($confFile->error);
$fail_result .= ''."\n";
}
}
if (empty($fail_result))
{
foreach ($sqlContentVersion as $version => $sqlContent)
foreach ($sqlContent as $query)
{
$query = trim($query);
if(!empty($query))
{
/* If php code have to be executed */
if (strpos($query, '/* PHP:') !== false)
{
/* Parsing php code */
$pos = strpos($query, '/* PHP:') + strlen('/* PHP:');
$phpString = substr($query, $pos, strlen($query) - $pos - strlen(' */;'));
$php = explode('::', $phpString);
preg_match('/\((.*)\)/', $phpString, $pattern);
$paramsString = trim($pattern[0], '()');
preg_match_all('/([^,]+),? ?/', $paramsString, $parameters);
if (isset($parameters[1]))
$parameters = $parameters[1];
else
$parameters = array();
if (is_array($parameters))
foreach ($parameters AS &$parameter)
$parameter = str_replace('\'', '', $parameter);
/* Call a simple function */
if (strpos($phpString, '::') === false)
{
$func_name = str_replace($pattern[0], '', $php[0]);
require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.Tools::strtolower($func_name).'.php');
$phpRes = call_user_func_array($func_name, $parameters);
}
/* Or an object method */
else
{
$func_name = array($php[0], str_replace($pattern[0], '', $php[1]));
$phpRes = call_user_func_array($func_name, $parameters);
}
if ((is_array($phpRes) AND !empty($phpRes['error'])) OR $phpRes === false )
{
$warningExist = true;
$logger->logError('PHP error: '.$query."\r\n".(empty($phpRes['msg'])?'':' - '.$phpRes['msg']));
$logger->logError(empty($phpRes['error'])?'':$phpRes['error']);
$requests .= '
'."\n";
}
else
$requests .=
'
'."\n";
}
elseif (!Db::getInstance()->execute($query))
{
$logger->logError('SQL query: '."\r\n".$query);
$logger->logError('SQL error: '."\r\n".Db::getInstance()->getMsgError());
$warningExist = true;
$requests .= '
getMsgError()).']]>
getNumberError()).']]>
'."\n";
}
else
$requests .='
'."\n";
}
}
Configuration::loadConfiguration();
// Settings updated, compile and cache directories must be emptied
$tools_dir = rtrim(_PS_INSTALL_PATH_, '\\/').DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'tools'.DIRECTORY_SEPARATOR;
$arrayToClean = array(
$tools_dir.'smarty'.DIRECTORY_SEPARATOR.'cache',
$tools_dir.'smarty'.DIRECTORY_SEPARATOR.'compile',
$tools_dir.'smarty_v2'.DIRECTORY_SEPARATOR.'cache',
$tools_dir.'smarty_v2'.DIRECTORY_SEPARATOR.'compile'
);
foreach ($arrayToClean as $dir)
if (file_exists($dir))
foreach (scandir($dir) as $file)
if ($file[0] != '.' AND $file != 'index.php' AND $file != '.htaccess')
unlink($dir.DIRECTORY_SEPARATOR.$file);
// delete cache filesystem if activated
$depth = getConfValue('PS_CACHEFS_DIRECTORY_DEPTH');
if (defined('_PS_CACHE_ENABLED_') && _PS_CACHE_ENABLED_ && $depth)
{
CacheFs::deleteCacheDirectory();
CacheFs::createCacheDirectories((int)$depth);
}
}
$result = '';
if (empty($fail_result))
{
Configuration::updateValue('PS_HIDE_OPTIMIZATION_TIPS', 0);
Configuration::updateValue('PS_NEED_REBUILD_INDEX', 1);
Configuration::updateValue('PS_VERSION_DB', _PS_INSTALL_VERSION_);
$result .= $warningExist ? ''."\n" : ''."\n";
$result .= $requests;
$result .= ''."\n";
}
else
$result = $fail_result;
if (!isset($return_type))
$return_type = 'xml';
// format available
// 1) output on screen
// - xml (default)
// - json
// 2) return value in php
// - include : variable $result available after inclusion
// 3) file_get_contents()
// - eval : $res = eval(file_get_contents());
if (empty($return_type) || $return_type == 'xml')
{
header('Content-Type: text/xml');
echo $result;
}
else
{
// result in xml to array
$result = simplexml_load_string($result);
if (!class_exists('ToolsInstall', false))
if(file_exists(_PS_INSTALL_PATH_.'/upgrade/classes/ToolsInstall.php'))
include_once(_PS_INSTALL_PATH_.'/upgrade/classes/ToolsInstall.php');
if (class_exists('ToolsInstall', false))
{
$result = ToolsInstall::simpleXMLToArray($result);
switch ($return_type)
{
case 'json':
header('Content-Type: application/json');
if (function_exists('json_encode'))
$result = json_encode($result);
else
{
include_once(INSTALL_PATH.'/../tools/json/json.php');
$pearJson = new Services_JSON();
$result = $pearJson->encode($result);
}
echo $result;
break;
case 'eval':
return $result;
case 'include':
break;
}
}
}
function getConfValue($name)
{
$full = version_compare('1.5.0.10', _PS_VERSION_) < 0;
$sql = 'SELECT IF(cl.`id_lang` IS NULL, c.`value`, cl.`value`) AS value
FROM `'._DB_PREFIX_.'configuration` c
LEFT JOIN `'._DB_PREFIX_.'configuration_lang` cl ON (c.`id_configuration` = cl.`id_configuration`)
WHERE c.`name` LIKE \''.pSQL($name).'\'';
if ($full)
{
$id_shop = Shop::getContextShopID(true);
$id_shop_group = Shop::getContextShopGroupID(true);
if ($id_shop)
$sql .= ' AND c.`id_shop` = '.(int)$id_shop;
if ($id_shop_group)
$sql .= ' AND c.`id_shop_group` = '.(int)$id_shop_group;
}
return Db::getInstance()->getValue($sql);
}