diff --git a/core/csvparser.class.inc.php b/core/csvparser.class.inc.php index 89a508947..3912a37e7 100644 --- a/core/csvparser.class.inc.php +++ b/core/csvparser.class.inc.php @@ -54,12 +54,14 @@ class CSVParser private $m_sCSVData; private $m_sSep; private $m_sTextQualifier; + private $m_iTimeLimitPerRow; - public function __construct($sTxt, $sSep = ',', $sTextQualifier = '"') + public function __construct($sTxt, $sSep = ',', $sTextQualifier = '"', $iTimeLimitPerRow = null) { $this->m_sCSVData = str_replace("\r\n", "\n", $sTxt); $this->m_sSep = $sSep; $this->m_sTextQualifier = $sTextQualifier; + $this->m_iTimeLimitPerRow = $iTimeLimitPerRow; } protected $m_sCurrCell = ''; @@ -129,6 +131,12 @@ class CSVParser // blank line, skip silently } $this->m_aCurrRow = array(); + + // More time for the next row + if ($this->m_iTimeLimitPerRow !== null) + { + set_time_limit($this->m_iTimeLimitPerRow); + } } protected function __AddCellTrimmed($c = null, $aFieldMap = null) { @@ -181,6 +189,13 @@ class CSVParser $iDataLength = strlen($this->m_sCSVData); $iState = stSTARTING; + $iTimeLimit = null; + if ($this->m_iTimeLimitPerRow !== null) + { + // Give some time for the first row + $iTimeLimit = ini_get('max_execution_time'); + set_time_limit($this->m_iTimeLimitPerRow); + } for($i = 0; $i <= $iDataLength ; $i++) { if ($i == $iDataLength) @@ -237,6 +252,11 @@ class CSVParser $iLineCount = count($this->m_aDataSet); if (($iMax > 0) && ($iLineCount >= $iMax)) break; } + if ($iTimeLimit !== null) + { + // Restore the previous time limit + set_time_limit($iTimeLimit); + } return $this->m_aDataSet; } diff --git a/pages/ajax.csvimport.php b/pages/ajax.csvimport.php index 234c537e5..f3333604e 100644 --- a/pages/ajax.csvimport.php +++ b/pages/ajax.csvimport.php @@ -244,8 +244,9 @@ try $bFirstLineAsHeader = utils::ReadParam('header_line', true); $sEncoding = utils::ReadParam('encoding', 'UTF-8'); $sData = stripslashes(utils::ReadParam('csvdata', true, false, 'raw_data')); - $oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier); - $aData = $oCSVParser->ToArray($iLinesToSkip); + $oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier, MetaModel::GetConfig()->Get('max_execution_time_per_loop')); + $iMaxIndex= 10; // Display maximum 10 lines for the preview + $aData = $oCSVParser->ToArray($iLinesToSkip, null, $iMaxIndex); $iTarget = count($aData); if ($iTarget == 0) { @@ -258,7 +259,6 @@ try $oPage->p("