Name = 'Import';
$this->Version = '1.0';
$this->Creator = 'Chronos';
$this->License = 'GNU/GPL';
$this->Description = 'Support for import of data.';
$this->Dependencies = array('Translation');
}
function DoStart(): void
{
$this->System->RegisterPage(['import'], 'PageImport');
}
}
class Import
{
var $Version;
var $Group;
var $NewItemCount;
var $System;
function __construct(System $System)
{
$this->System = &$System;
}
function SetVersion($Version)
{
$DbResult = $this->System->Database->query('SELECT * FROM `ClientVersion` WHERE `Version` = "'.$Version.'"');
$this->Version = $DbResult->fetch_assoc();
}
function InsertItem($Value)
{
$insert = true;
$Columns = '';
//$Values = '';
foreach ($this->Group['Items'] as $GroupItem)
{
$Columns .= ', `'.$GroupItem['Column'].'` ';
// $Values .= ', "'.$Value[$GroupItem['Column']].'"';
}
$Columns = substr($Columns, 1);
$Where = ' (`'.$this->Group['PrimaryKeyItem'].'` = "'.$Value[$this->Group['PrimaryKeyItem']].'") AND (`Language`=0) ' ;
$DbResultMiddle = $this->System->Database->query('SELECT `VersionEnd`,`VersionStart`, `ID`, `Entry`, '.$Columns.' FROM `'.$this->Group['TablePrefix'].'` WHERE '.$Where.' AND `VersionStart` <= '.$this->Version['BuildNumber'].' AND `VersionEnd` >= '.$this->Version['BuildNumber'].' ORDER BY `VersionEnd` DESC LIMIT 1');
$DbResultBefore = $this->System->Database->query('SELECT `VersionEnd`,`VersionStart`, `ID`, `Entry`, '.$Columns.' FROM `'.$this->Group['TablePrefix'].'` WHERE '.$Where.' AND `VersionEnd` <= '.$this->Version['BuildNumber'].' ORDER BY `VersionEnd` DESC LIMIT 1');
$DbResultAfter = $this->System->Database->query('SELECT `VersionEnd`,`VersionStart`, `ID`, `Entry`, '.$Columns.' FROM `'.$this->Group['TablePrefix'].'` WHERE '.$Where.' AND `VersionStart` >= '.$this->Version['BuildNumber'].' ORDER BY `VersionStart` LIMIT 1');
if (($DbResultMiddle->num_rows > 0) or ($DbResultBefore->num_rows > 0) or ($DbResultAfter->num_rows > 0))
{
// Update existed text
$DbRowMiddle = $DbResultMiddle->fetch_assoc();
$DbRowAfter = $DbResultAfter->fetch_assoc();
$DbRowBefore = $DbResultBefore->fetch_assoc();
if ($this->HaveSameText($this->Group, $DbRowBefore, $Value) and ($DbResultBefore->num_rows > 0))
{
$insert = false;
if ($this->Group['Id'] == 1)
{
$set = ' , EndText = "'.$Value['EndText'].'" , ObjectiveText1 = "'.$Value['ObjectiveText1'].'"'.' , ObjectiveText2 = "'.$Value['ObjectiveText2'].'"'.' , ObjectiveText3 = "'.$Value['ObjectiveText3'].'"'.' , ObjectiveText4 = "'.$Value['ObjectiveText4'].'"';
} else $set = '';
$this->System->Database->query('UPDATE `'.$this->Group['TablePrefix'].'` SET `VersionEnd` = "'.$this->Version['BuildNumber'].'" '.$set.' WHERE `ID`='.$DbRowBefore['ID']);
echo('b ');
} else
if ($this->HaveSameText($this->Group, $DbRowAfter, $Value) and ($DbResultAfter->num_rows > 0))
{
$insert = false;
if ($this->Group['Id'] == 1)
{
$set = ' , EndText = "'.$Value['EndText'].'" , ObjectiveText1 = "'.$Value['ObjectiveText1'].'"'.' , ObjectiveText2 = "'.$Value['ObjectiveText2'].'"'.' , ObjectiveText3 = "'.$Value['ObjectiveText3'].'"'.' , ObjectiveText4 = "'.$Value['ObjectiveText4'].'"';
} else $set = '';
$this->System->Database->query('UPDATE `'.$this->Group['TablePrefix'].'` SET `VersionStart` = "'.$this->Version['BuildNumber'].'" '.$set.' WHERE `ID`='.$DbRowAfter['ID']);
echo('a ');
} else
{
if (isset($DbRowAfter['VersionStart']))
{
if ($DbRowAfter['VersionStart'] <= $this->Version['BuildNumber'])
{
echo('Allready imported '.$DbRowBefore['Entry'].' ');
$insert = false;
}
}
if (isset($DbRowBefore['VersionEnd']))
{
if ($DbRowBefore['VersionEnd'] >= $this->Version['BuildNumber'])
{
echo('Allready imported '.$DbRowBefore['Entry'].' ');
$inserted = false;
}
}
// if [DEPRECATED] do not import
foreach ($this->Group['Items'] as $GroupItem)
{
if (false !== strpos($Value[$GroupItem['Column']],'[DEPRECATED'))
{
echo('d '.$DbRowBefore['Entry'].' ');
$insert = false;
}
}
if ($insert)
{
$insert = false;
foreach ($this->Group['Items'] as $GroupItem)
{
if ($Value[$GroupItem['Column']] <> '') $insert = true;
}
}
if (isset($DbRowMiddle['Entry'])) $insert = false;
if (isset($DbRowAfter['Entry'])) $Value['Entry'] = $DbRowAfter['Entry'];
if (isset($DbRowBefore['Entry'])) $Value['Entry'] = $DbRowBefore['Entry'];
if ($insert)
{
$Columns = '`Entry`, `Language`, `VersionStart`, `VersionEnd`';
$Values = $Value['Entry'].', 0, '.$this->Version['BuildNumber'].', '.$this->Version['BuildNumber'];
foreach ($this->Group['Items'] as $GroupItem)
{
$Columns .= ', `'.$GroupItem['Column'].'`';
$Values .= ', "'.$Value[$GroupItem['Column']].'"';
}
$this->System->Database->query('INSERT `'.$this->Group['TablePrefix'].'` ('.$Columns.') VALUES ('.$Values.')');
echo('
'.$Value['Entry'].' = '.$DbRowBefore['VersionStart'].'.'.$DbRowBefore['VersionEnd'].'< '.$this->Version['BuildNumber'].' <'.$DbRowAfter['VersionStart'].'.'.$DbRowAfter['VersionEnd'].'... '.$DbRowMiddle['VersionStart'].' '.$DbRowMiddle['VersionEnd'].'
');
if (false !== strpos($Values,'[DEPRECATED'))
echo($Values);
echo('# ');
$InsertId = $this->System->Database->insert_id;
$this->System->ModuleManager->Modules['Log']->WriteLog('Text '.$InsertId.' ('.$Value['Entry'].') ze skupiny '.$this->Group['Name'].' byl v nové verzi '.$this->Version['Version'].' změněn.', LOG_TYPE_IMPORT);
}
}
} else
{
// Insert new text
if (is_numeric($Value[$this->Group['PrimaryKeyItem']])) $Value['Entry'] = $Value[$this->Group['PrimaryKeyItem']];
else
{
// Get new unused Entry for tables without numeric id
$Value['Entry'] = 1;
$DbResult = $this->System->Database->query('SELECT MAX(`Entry`) FROM `'.$this->Group['TablePrefix'].'`');
if ($DbResult->num_rows > 0)
{
$DbRow = $DbResult->fetch_row();
$Value['Entry'] += $DbRow[0];
}
}
$Columns = '`Entry`, `Language`, `VersionStart`, `VersionEnd`';
$Values = $Value['Entry'].', 0, '.$this->Version['BuildNumber'].', '.$this->Version['BuildNumber'];
$insert = false;
foreach ($this->Group['Items'] as $GroupItem)
{
$Columns .= ', `'.$GroupItem['Column'].'`';
$Values .= ', "'.$Value[$GroupItem['Column']].'"';
if ($Value[$GroupItem['Column']] <> '') $insert = true;
}
if ($insert)
{
$this->System->Database->query('INSERT `'.$this->Group['TablePrefix'].'` ('.$Columns.') VALUES ('.$Values.')');
$InsertId = $this->System->Database->insert_id;
echo('+ ');
$this->NewItemCount++;
$this->System->ModuleManager->Modules['Log']->WriteLog('Text '.$InsertId.' ('.$Value['Entry'].') ze skupiny '.$this->Group['Name'].' byl v nové verzi '.$this->Version['Version'].' přidán.', LOG_TYPE_IMPORT);
}
}
}
function ImportLUA()
{
$Output = 'Načítání textů z LUA souboru...';
if (($this->Group['LuaFileName'] != '') and ($this->Group['TablePrefix'] != ''))
{
$Output .= '
'.$this->Group['Name'].'
';
// if ($this->Group['LastVersion'] < $this->Version['BuildNumber'] + 1)
{
$File = new FileStream();
$File->OpenFile(dirname(__FILE__).'/../../source/'.$this->Version['Version'].'/lua/'.$this->Group['LuaFileName'].'.lua');
$this->NewItemCount = 0;
$Count = 0;
while (!$File->EOF())
{
$Line = $File->ReadLine();
if (strpos($Line, '=') !== false)
{
$LineParts = explode('=', $Line, 2);
$Value['ShortCut'] = trim($LineParts[0]);
$Line = trim($LineParts[1]);
if ($Line[0] == '"')
{
// Quoted string value
$Line = substr($Line, 1); // Skip start qoute
$TempLine = str_replace('\"', ' ', $Line); // Temporary remove slashed quotes
$Value['Text'] = substr($Line, 0, strpos($TempLine, '"'));
$Value['Text'] = str_replace('\n', "\n", $Value['Text']);
$Value['Text'] = addslashes(stripslashes($Value['Text']));
$Line = trim(substr($Line, strpos($TempLine, '"') + 1)); // Skip closing quote and semicolon
} else
{
// Nonstring value
$Value['Text'] = substr($Line, 0, strpos($Line, ';'));
}
$Line = substr($Line, strpos($Line, ';') + 1);
$Value['Comment'] = addslashes(stripslashes(substr($Line, 3))); // Skip " --"
$this->InsertItem($Value);
};
$Count++;
}
$Output .= '
Celkem: '.$Count.' Nových: '.$this->NewItemCount.'
';
$this->UpdateLastVersion();
}
// else $Output .= ShowMessage('Již importován pro verzi '.$this->Version['Version'], MESSAGE_CRITICAL);
} else $Output .= ShowMessage('Není definováno jméno zdrojového souboru', MESSAGE_CRITICAL);
$Output .= ShowMessage('Dokončeno.');
return $Output;
}
function UpdateTranslated()
{
$TranslationTree = $this->System->ModuleManager->Modules['Translation']->GetTranslationTree();
$Output = '
Začínám se synchronizací VersionEnd u přeložených textů
';
foreach ($TranslationTree as $Group)
{
$Output .= '
'.$Group['Name'].' ';
$do = true;
while ($do)
{
$DbResult = $this->System->Database->query('SELECT `gs_tran`.`ID`, '.
'`gs_tran`.`VersionEnd` AS `VersionEnd_tran`, '.
'`gs_tran`.`VersionStart` AS `VersionStart_tran`, '.
'`gs_orig`.`VersionEnd` AS `VersionEnd_orig`, '.
'`gs_orig`.`VersionStart` AS `VersionStart_orig` FROM `'.
$Group['TablePrefix'].'` AS `gs_tran` JOIN `'.$Group['TablePrefix'].
'` AS `gs_orig` ON `gs_orig`.`ID` = `gs_tran`.`Take` WHERE '.
'`gs_tran`.`VersionEnd` <> `gs_orig`.`VersionEnd` OR `gs_tran`.`VersionStart` <> `gs_orig`.`VersionStart`');
$do = ($DbResult->num_rows > 0);
while ($DbRow = $DbResult->fetch_assoc())
{
echo('`');
$this->System->Database->query('UPDATE `'.$Group['TablePrefix'].'` SET `VersionEnd` = '.$DbRow['VersionEnd_orig'].', `VersionStart` = '.$DbRow['VersionStart_orig'].' WHERE `ID` = '.$DbRow['ID']);
$Output .= '. ';
}
}
$Output .= 'Dokončeno.';
}
return $Output;
}
function HaveSameText($Group, $DbRow2, $Value)
{
$result = true;
foreach ($Group['Items'] as $GroupItem)
{
$old = $DbRow2[$GroupItem['Column']];
$old = str_replace(chr(10), '', $old);
$old = str_replace(chr(13), '', $old);
$old = str_replace('\n', '', $old);
$old = str_replace('\r', '', $old);
$old = str_replace('\"', '"', $old);
$old = str_replace('\\\\', '\\', $old);
$old = str_replace('\32', '32', $old);
$old = str_replace('\124', '124', $old);
$old = str_replace("\'", "'", $old);
$old = str_replace("Â", "", $old);
$old = str_replace("�", "", $old);
$old = str_replace('-', '', $old);
$old = str_replace(' ', '', $old);
$old = strtolower($old);
$old = str_replace('$b', '', $old);
if ($this->Group['Id'] == 1)
{
while ($part = substr($old, strpos($old, '<'), strpos($old, '>')-strpos($old, '<')))
{
if ($part <> '')
{
$old = str_replace($part.'>', '', $old);
}
}
}
if (($GroupItem['MangosColumn'] <> '') and ($Group['MangosDatabase'] == 'mangos'))
$new = $Value[$GroupItem['MangosColumn']];
else $new = $Value[$GroupItem['Column']];
$new = str_replace(chr(10), '', $new);
$new = str_replace(chr(13), '', $new);
$new = str_replace('\n', '', $new);
$new = str_replace('\r', '', $new);
$new = str_replace('\"', '"', $new);
$new = str_replace('\\\\', '\\', $new);
$new = str_replace('\32', '32', $new);
$new = str_replace('\124', '124', $new);
$new = str_replace("\'", "'", $new);
$new = str_replace("Â", "", $new);
$new = str_replace("�", "", $new);
$new = str_replace('-', '', $new);
$new = str_replace(' ', '', $new);
$new = strtolower($new);
$new = str_replace('$b', '', $new);
if ($this->Group['Id'] == 1)
{
while ($part = substr($new, strpos($new, '<'), strpos($new, '>')-strpos($new, '<')))
{
if ($part <> '')
{
$new = str_replace($part.'>', '', $new);
}
}
}
if (($old == 'null') or ($old == 'NULL')) $old = '';
if (($new == 'null') or ($new == 'NULL')) $new = '';
if (($new <> '') and ($old <> $new) and ($GroupItem['Column'] <> 'Comment'))
{
// echo $old.'X'.$new;
if ( ($GroupItem['Column'] <> 'EndText')
and ($GroupItem['Column'] <> 'ObjectiveText1')
and ($GroupItem['Column'] <> 'ObjectiveText2')
and ($GroupItem['Column'] <> 'ObjectiveText3')
and ($GroupItem['Column'] <> 'ObjectiveText4') )
$result = false;
}
}
return $result;
}
function ImportDBC()
{
global $System;
$Output = 'Načítání textů z DBC souboru...';
if (($this->Group['DBCFileName'] != '') and ($this->Group['TablePrefix'] != ''))
{
$Output .= '
'.$this->Group['Name'].'
';
// Load string column index list
$DbResult = $System->Database->query('SELECT * FROM `GroupItem` JOIN `GroupItemDBC` ON `GroupItem`.`Id` = `GroupItemDBC`.`GroupItem` AND `GroupItemDBC`.`ClientVersion` = '.$this->Version['Id'].' WHERE `GroupItem`.`Group` = '.$this->Group['Id']);
$ColumnIndexes = array();
$ColumnFormat = array();
while ($DbRow = $DbResult->fetch_assoc())
{
$ColumnFormat[$DbRow['ColumnIndex']] = FORMAT_STRING;
$ColumnIndexes[$DbRow['GroupItem']] = $DbRow['ColumnIndex'];
}
$DBCFile = new DBCFile();
$DBCFile->OpenFile(dirname(__FILE__).'/../../source/'.$this->Version['Version'].'/dbc/'.$this->Group['DBCFileName'].'.dbc', $ColumnFormat);
$ItemCount = $DBCFile->GetRecordCount();
$this->NewItemCount = 0;
$Count = 0;
for ($I = 0; $I < $ItemCount; $I++)
{
foreach ($this->Group['Items'] as $GroupItem)
if (array_key_exists($GroupItem['Id'], $ColumnIndexes))
{
$Value[$GroupItem['Column']] = addslashes($DBCFile->GetString($I, $ColumnIndexes[$GroupItem['Id']]));
}
// Get multicolumn value
$Columns = explode(',', $this->Group['DBCIndex']);
$ColumnValue = '';
foreach ($Columns as $Column)
{
$ColumnValue .= '_'.$DBCFile->GetUint($I, $Column);
}
$ColumnValue = substr($ColumnValue, 1);
$Value[$this->Group['PrimaryKeyItem']] = $ColumnValue;
$this->InsertItem($Value);
$Count++;
}
$Output .= '
Celkem: '.$Count.' Nových: '.$this->NewItemCount.'
';
$this->UpdateLastVersion();
}
$Output .= 'Dokončeno.';
return $Output;
}
function ImportGroup($GroupId)
{
$TranslationTree = $this->System->ModuleManager->Modules['Translation']->GetTranslationTree();
$this->Group = $TranslationTree[$GroupId];
if ($this->Group['SourceType'] == 'dbc') $Output = $this->ImportDBC();
else if ($this->Group['SourceType'] == 'sql') $Output = $this->ImportSQL();
else if ($this->Group['SourceType'] == 'lua') $Output = $this->ImportLUA();
else $Output = ShowMessage('Neznámý typ zdroje pro import', MESSAGE_CRITICAL);
$Output .= $this->UpdateTranslated();
return $Output;
}
function ImportSQL()
{
$Output = '';
$File = new FileStream();
$File->OpenFile(dirname(__FILE__).'/../../source/'.$this->Version['Version'].'/sql/'.$this->Group['MangosTable'].'.sql');
$this->NewItemCount = 0;
$Count = 0;
$FollowStructure = false;
$i = 0;
while ((!$File->EOF()))
{
$Line = $File->ReadLine();
// Struktura
if (strpos($Line, 'CREATE TABLE `'.$this->Group['MangosTable'].'`') !== false)
{
$Line = '';
$FollowStructure = true;
$i = 0;
}
if ((strpos($Line, ';') !== false) and ($FollowStructure == true))
{
$FollowStructure = false;
}
if (($FollowStructure == true) and ($Line != ''))
{
$str = substr($Line, 0, strpos($Line, '`'));
$Line = substr($Line, strpos($Line, '`') + 1);
$Line = substr($Line, 0, strpos($Line, '`'));
if (strlen($str) < 3) $structure[$i] = $Line;
$i++;
}
// data
if ((strpos($Line, 'INSERT INTO `'.$this->Group['MangosTable'].'`') !== false) and (isset($structure)))
{
while ((strpos($Line, ');') === false) or ($File->EOF()))
$Line = $Line.$File->ReadLine();
$Line = str_replace("),\n(", '),(', $Line);
$Line = substr($Line, strpos($Line, '(') + 1);
$Line = substr($Line, 0, strpos($Line, ');'));
$LineParts = explode('),(', $Line);
unset($Line);
$value_buff = '';
$Value = '';
foreach ($LineParts as $LinePart)
{
unset($Value, $value_buff);
foreach ($structure as $i => $column)
{
if (substr($LinePart, 0, 1) != "'")
{
$value_buff = substr($LinePart, 0, strpos($LinePart, ','));
$LinePart = substr($LinePart, strlen($value_buff) + 1);
} else
{
$LinePart = substr($LinePart, 1);
$value_buff = substr($LinePart, 0, strpos($LinePart, "'"));
while (substr($value_buff, strlen($value_buff) - 1, 1) == "\\")
{
$str = substr($LinePart, strlen($value_buff));
$str2 = substr($str, 0, strpos($str, "'", 1));
$value_buff = $value_buff.$str2;
$str = substr($str, strlen($str2));
}
$LinePart = substr($LinePart, strlen($value_buff) + 2);
}
if (($value_buff != 'null') and ($value_buff != 'NULL'))
{
$str = '';
while (substr($value_buff, strlen($value_buff) - 1,1) == " ")
{
$value_buff = substr($value_buff, 0, strlen($value_buff) - 1);
$str .= ' ';
}
$str2 = '';
while (substr($value_buff, 0, 1) == ' ')
{
$value_buff = substr($value_buff, 1, strlen($value_buff) - 1);
$str2 .= ' ';
}
$Value[$column] = $str2.trim($value_buff).$str;
} else
{
$Value[$column] = '';
}
}
foreach ($this->Group['Items'] as $GroupItem)
{
if ($GroupItem['MangosColumn'] != '')
{
if (isset($Value[$GroupItem['MangosColumn']]))
{
$Value[$GroupItem['Column']] = $Value[$GroupItem['MangosColumn']];
}
else
{
$Value[$GroupItem['Column']] = '';
$Value[$GroupItem['MangosColumn']] ='';
}
}
}
// Get multicolumn value
$Columns = explode(',', $this->Group['MangosTableIndex']);
$ColumnValue = '';
foreach ($Columns as $Column)
{
$ColumnValue .= '_'.$Value[$Column];
}
$ColumnValue = substr($ColumnValue, 1);
$Value[$this->Group['PrimaryKeyItem']] = $ColumnValue;
$this->InsertItem($Value);
$Count++;
}
}
}
$Output = '
Celkem: '.$Count.' Nových: '.$this->NewItemCount.'
';
$this->UpdateLastVersion();
return $Output;
}
function UpdateLastVersion()
{
$DbResult = $this->System->Database->query('SELECT * FROM `Group` WHERE `Id`='.$this->Group['Id']);
$Version = $DbResult->fetch_assoc();
if ($Version['LastVersion'] < $this->Version['BuildNumber'])
$this->System->Database->query('UPDATE `Group` SET `LastVersion` = "'.$this->Version['BuildNumber'].'", `LastImport` = NOW() WHERE `Id`='.$this->Group['Id']);
}
}