diff --git a/application/utils.inc.php b/application/utils.inc.php index 07178ebf3..a94fd6fdb 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -464,7 +464,15 @@ class utils if (self::$oConfig == null) { $sConfigFile = self::GetConfigFilePath(); - self::$oConfig = new Config($sConfigFile); + if (file_exists($sConfigFile)) + { + self::$oConfig = new Config($sConfigFile); + } + else + { + // When executing the setup, the config file may be still missing + self::$oConfig = new Config(); + } } return self::$oConfig; } diff --git a/core/cmdbsource.class.inc.php b/core/cmdbsource.class.inc.php index e18ea6277..499c8054c 100644 --- a/core/cmdbsource.class.inc.php +++ b/core/cmdbsource.class.inc.php @@ -24,6 +24,7 @@ */ require_once('MyHelpers.class.inc.php'); +require_once(APPROOT.'core/kpi.class.inc.php'); class MySQLException extends CoreException { diff --git a/core/config.class.inc.php b/core/config.class.inc.php index b57f68034..3fe6b430d 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -1462,5 +1462,31 @@ class Config } } + /** + * Helper: for an array of string, change the prefix when found + */ + protected static function ChangePrefix(&$aStrings, $sSearchPrefix, $sNewPrefix) + { + foreach ($aStrings as &$sFile) + { + if (substr($sFile, 0, strlen($sSearchPrefix)) == $sSearchPrefix) + { + $sFile = $sNewPrefix.substr($sFile, strlen($sSearchPrefix)); + } + } + } + + /** + * Quick an dirty way to clone a config file into another environment + */ + public function ChangeModulesPath($sSourceEnv, $sTargetEnv) + { + $sSearchPrefix = 'env-'.$sSourceEnv.'/'; + $sNewPrefix = 'env-'.$sTargetEnv.'/'; + self::ChangePrefix($this->m_aDataModels, $sSearchPrefix, $sNewPrefix); + self::ChangePrefix($this->m_aWebServiceCategories, $sSearchPrefix, $sNewPrefix); + self::ChangePrefix($this->m_aDictionaries, $sSearchPrefix, $sNewPrefix); + } + } ?> diff --git a/setup/ajax.dataloader.php b/setup/ajax.dataloader.php index 895876830..360ab6812 100644 --- a/setup/ajax.dataloader.php +++ b/setup/ajax.dataloader.php @@ -227,10 +227,11 @@ try $sModuleDir = Utils::ReadParam('modules_dir', ''); $oConfig->UpdateFromParams($aParamValues, $sModuleDir); - InitDataModel($oConfig, true); // load data model only + $oProductionEnv = new RunTimeEnvironment(); + $oProductionEnv->InitDataModel($oConfig, true); // load data model only $sMode = Utils::ReadParam('mode', 'install'); - if(!CreateDatabaseStructure(MetaModel::GetConfig(), $sMode)) + if(!$oProductionEnv->CreateDatabaseStructure(MetaModel::GetConfig(), $sMode)) { throw(new Exception("Failed to create/upgrade the database structure")); } @@ -256,7 +257,8 @@ try $sModuleDir = Utils::ReadParam('modules_dir', ''); $oConfig->UpdateFromParams($aParamValues, $sModuleDir); - InitDataModel($oConfig, false); // load data model and connect to the database + $oProductionEnv = new RunTimeEnvironment(); + $oProductionEnv->InitDataModel($oConfig, false); // load data model and connect to the database $sMode = Utils::ReadParam('mode', 'install'); $sSelectedModules = Utils::ReadParam('selected_modules', '', false, 'raw_data'); @@ -264,7 +266,7 @@ try // Perform here additional DB setup... profiles, etc... // - $aAvailableModules = AnalyzeInstallation(MetaModel::GetConfig(), $sModuleDir); + $aAvailableModules = $oProductionEnv->AnalyzeInstallation(MetaModel::GetConfig(), $sModuleDir); foreach($aAvailableModules as $sModuleId => $aModule) { if (($sModuleId != ROOT_MODULE) && in_array($sModuleId, $aSelectedModules) && @@ -278,7 +280,7 @@ try } } - if (!RecordInstallation($oConfig, $aSelectedModules, $sModuleDir)) + if (!$oProductionEnv->RecordInstallation($oConfig, $aSelectedModules, $sModuleDir)) { throw(new Exception("Failed to record the installation information")); } @@ -326,7 +328,8 @@ try $sModuleDir = Utils::ReadParam('modules_dir', ''); $oConfig->UpdateFromParams($aParamValues, $sModuleDir); - InitDataModel($oConfig, false); // load data model and connect to the database + $oProductionEnv = new RunTimeEnvironment(); + $oProductionEnv->InitDataModel($oConfig, false); // load data model and connect to the database $oDataLoader = new XMLDataLoader(); if ($sSessionStatus == 'start') diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index f64cb40ab..4ebc11751 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -398,7 +398,15 @@ EOF; $aClassParams['reconc_keys'] = $sReconcKeys; $aClassParams['db_table'] = "'".$oProperties->GetChildText('db_table')."'"; - $aClassParams['db_key_field'] = "'".$oProperties->GetChildText('db_key_field')."'"; + + $sKeyField = $oProperties->GetChildText('db_key_field'); + if ($sKeyField == '') + { + $sKeyField = 'id'; + } + $aClassParams['db_key_field'] = "'".$sKeyField."'"; + + // TODO: faire automatiquement (pas dans le XML !!!) $aClassParams['db_finalclass_field'] = "'".$oProperties->GetChildText('db_final_class_field')."'"; if (($sDisplayTemplate = $oProperties->GetChildText('display_template')) && (strlen($sDisplayTemplate) > 0)) diff --git a/setup/index.php b/setup/index.php index 6244e5dff..fe01f1749 100644 --- a/setup/index.php +++ b/setup/index.php @@ -447,7 +447,8 @@ function PopulateDataFilesList(SetupPage $oP, $aParamValues, $oConfig) $sScript .= "{\n"; $sScript .= "if (aFilesToLoad.length > 0) return;"; // Populate the list only once... - $aAvailableModules = AnalyzeInstallation($oConfig, $aParamValues['source_dir']); + $oProductionEnv = new RunTimeEnvironment(); + $aAvailableModules = $oProductionEnv->AnalyzeInstallation($oConfig, $aParamValues['source_dir']); $sMode = $aParamValues['mode']; $aStructureDataFiles = array(); @@ -595,7 +596,8 @@ function WelcomeAndCheckPrerequisites(SetupPage $oP, $aParamValues, $iCurrentSte { $oConfig = new Config($sConfigFile); - $aVersion = AnalyzeInstallation($oConfig, 'datamodel'); + $oProductionEnv = new RunTimeEnvironment(); + $aVersion = $oProductionEnv->AnalyzeInstallation($oConfig, 'datamodel'); if (!empty($aVersion[ROOT_MODULE]['version_db'])) { $aPreviousParams = array('mode', 'db_server', 'db_user', 'db_pwd','db_name', 'new_db_name', 'db_prefix', 'source_dir', 'target_dir'); @@ -826,7 +828,8 @@ function ModulesSelection(SetupPage $oP, $aParamValues, $iCurrentStep, $oConfig) $sRedStar = '*'; $oP->set_title("iTop modules selection"); - $aAvailableModules = AnalyzeInstallation($oConfig, $aParamValues['source_dir']); + $oProductionEnv = new RunTimeEnvironment(); + $aAvailableModules = $oProductionEnv->AnalyzeInstallation($oConfig, $aParamValues['source_dir']); $sConfigFile = utils::GetConfigFilePath(); // Form goes here @@ -1132,7 +1135,8 @@ function SampleDataSelection(SetupPage $oP, $aParamValues, $iCurrentStep, Config function DisplaySummary(SetupPage $oP, $aParamValues, $iCurrentStep, Config $oConfig) { $sMode = $aParamValues['mode']; - $aAvailableModules = AnalyzeInstallation($oConfig, $aParamValues['source_dir']); + $oProductionEnv = new RunTimeEnvironment(); + $aAvailableModules = $oProductionEnv->AnalyzeInstallation($oConfig, $aParamValues['source_dir']); $aInstall = array(); $aUpgrade = array(); @@ -1388,7 +1392,8 @@ function SetupFinished(SetupPage $oP, $aParamValues, $iCurrentStep, Config $oCon $oConfig->WriteToFile($sConfigFile); // Start the application - InitDataModel($oConfig, false, true); // Load model, startup DB and load the cache + $oProductionEnv = new RunTimeEnvironment(); + $oProductionEnv->InitDataModel($oConfig, false, true); // Load model, startup DB and load the cache if ($aParamValues['mode'] == 'install') { if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd)) @@ -1421,7 +1426,8 @@ function SetupFinished(SetupPage $oP, $aParamValues, $iCurrentStep, Config $oCon $oP->add("