if (empty($sFileName)) {
     throw new Exception("Missing argument 'file'");
 }
 if (!file_exists($sFileName)) {
     throw new Exception("File {$sFileName} does not exist");
 }
 SetMemoryLimit($oP);
 // The XMLDataLoader constructor has initialized the DB, let's start a transaction
 CMDBSource::Query('START TRANSACTION');
 $oChange = MetaModel::NewObject("CMDBChange");
 $oChange->Set("date", time());
 $oChange->Set("userinfo", "Initialization");
 $iChangeId = $oChange->DBInsert();
 $oP->p("Starting data load.");
 $oDataLoader->StartSession($oChange);
 $oDataLoader->LoadFile($sFileName);
 $oP->p("Ending data load session");
 if ($oDataLoader->EndSession(true)) {
     $iCountCreated = $oDataLoader->GetCountCreated();
     CMDBSource::Query('COMMIT');
     $oP->p("Data successfully written into the DB: {$iCountCreated} objects created");
 } else {
     CMDBSource::Query('ROLLBACK');
     $oP->p("Some issues have been encountered, changes will not be recorded, please review the source data");
     $aErrors = $oDataLoader->GetErrors();
     if (count($aErrors) > 0) {
         $oP->p('Errors (' . count($aErrors) . ')');
         foreach ($aErrors as $sMsg) {
             $oP->p(' * ' . $sMsg);
         }
     }
 protected static function DoLoadFiles($aSelectedModules, $sModulesDir, $sDBServer, $sDBUser, $sDBPwd, $sDBName, $sDBPrefix, $sTargetEnvironment = '', $bOldAddon = false, $bSampleData = false)
 {
     $aParamValues = array('db_server' => $sDBServer, 'db_user' => $sDBUser, 'db_pwd' => $sDBPwd, 'db_name' => $sDBName, 'new_db_name' => $sDBName, 'db_prefix' => $sDBPrefix);
     $oConfig = new Config();
     $oConfig->UpdateFromParams($aParamValues, $sModulesDir);
     if ($bOldAddon) {
         // Old version of the add-on for backward compatibility with pre-2.0 data models
         $oConfig->SetAddons(array('user rights' => 'addons/userrights/userrightsprofile.db.class.inc.php'));
     }
     //Load the MetaModel if needed (asynchronous mode)
     if (!self::$bMetaModelStarted) {
         $oProductionEnv = new RunTimeEnvironment($sTargetEnvironment);
         $oProductionEnv->InitDataModel($oConfig, false);
         // load data model and connect to the database
         self::$bMetaModelStarted = true;
         // No need to reload the final MetaModel in case the installer runs synchronously
     }
     $oDataLoader = new XMLDataLoader();
     CMDBObject::SetTrackInfo("Initialization");
     $oMyChange = CMDBObject::GetCurrentChange();
     SetupPage::log_info("starting data load session");
     $oDataLoader->StartSession($oMyChange);
     $aFiles = array();
     $aPreviouslyLoadedFiles = array();
     $oProductionEnv = new RunTimeEnvironment();
     $aAvailableModules = $oProductionEnv->AnalyzeInstallation($oConfig, APPROOT . $sModulesDir);
     foreach ($aAvailableModules as $sModuleId => $aModule) {
         if ($sModuleId != ROOT_MODULE) {
             // Load data only for selected AND newly installed modules
             if (in_array($sModuleId, $aSelectedModules)) {
                 if ($aModule['version_db'] != '') {
                     // Simulate the load of the previously loaded XML files to get the mapping of the keys
                     if ($bSampleData) {
                         $aPreviouslyLoadedFiles = array_merge($aPreviouslyLoadedFiles, $aAvailableModules[$sModuleId]['data.struct'], $aAvailableModules[$sModuleId]['data.sample']);
                     } else {
                         // Load only structural data
                         $aPreviouslyLoadedFiles = array_merge($aPreviouslyLoadedFiles, $aAvailableModules[$sModuleId]['data.struct']);
                     }
                 } else {
                     if ($bSampleData) {
                         $aFiles = array_merge($aFiles, $aAvailableModules[$sModuleId]['data.struct'], $aAvailableModules[$sModuleId]['data.sample']);
                     } else {
                         // Load only structural data
                         $aFiles = array_merge($aFiles, $aAvailableModules[$sModuleId]['data.struct']);
                     }
                 }
             }
         }
     }
     // Simulate the load of the previously loaded files, in order to initialize
     // the mapping between the identifiers in the XML and the actual identifiers
     // in the current database
     foreach ($aPreviouslyLoadedFiles as $sFileRelativePath) {
         $sFileName = APPROOT . $sFileRelativePath;
         SetupPage::log_info("Loading file: {$sFileName} (just to get the keys mapping)");
         if (empty($sFileName) || !file_exists($sFileName)) {
             throw new Exception("File {$sFileName} does not exist");
         }
         $oDataLoader->LoadFile($sFileName, true);
         $sResult = sprintf("loading of %s done.", basename($sFileName));
         SetupPage::log_info($sResult);
     }
     foreach ($aFiles as $sFileRelativePath) {
         $sFileName = APPROOT . $sFileRelativePath;
         SetupPage::log_info("Loading file: {$sFileName}");
         if (empty($sFileName) || !file_exists($sFileName)) {
             throw new Exception("File {$sFileName} does not exist");
         }
         $oDataLoader->LoadFile($sFileName);
         $sResult = sprintf("loading of %s done.", basename($sFileName));
         SetupPage::log_info($sResult);
     }
     $oDataLoader->EndSession();
     SetupPage::log_info("ending data load session");
 }