<html>
<head>
	<title>Синхронизация</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body bgColor="#FFFFDD">
<?php
//Для переодического запрашивания данных с другого сервера и обновления локальной базы
//ini_set('max_execution_time',600);//устанавливаем время работы скрипта

require_once("../include/class_table.php");
require_once("../../config.xyz");

try
{	$db = new PDO($db_connection, $db_login, $db_password);
	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e)
{	echo 'Ошибка соединения: ' . $e->getMessage();
	Exit();
}

echo 'Synchronization started!<br>';

$sql='
	select 
		so.id,
		ss.host,
		so.obj_name,
		so.obj_seq,
		so.limit
	from 
		"_SynServices" ss 
		join "_SynObjects" so on so.synservice_id=ss.id
	where 
		ss.del=false 
		and so.del=false
		and ss.active=true
		and extract(epoch from now())-time>interval	
	order by ss.host, so.sort
	';

$res = $db->query($sql);
while ($row = $res->fetch(PDO::FETCH_ASSOC))
{
	$host=$row['host'].'?fn=1&n='.$row['obj_name'].'&s='.$row['obj_seq'].'&l='.$row['limit'];
		
	echo $host.'<br>';
	
	//Не знаю на сколько хорошо работает функция copy но пока ничего лучше ненашел
	if(copy( $host, 'data.zip' ))
	{
		//Извлекаем данные из таблицы если запись существует то обновляем если нет то вставляем
		$zip = new ZipArchive();
		if ($zip->open('data.zip') !== true)
		{
			echo $row['name']." ZIP error!";
			continue;
		}

		//Перебираем файлы архива
		for($i=0;$i<$zip->numFiles;$i++)
		{
			$seq=0; //Запишется макс время пришедших данных (потому что данные приходят частями)
			$name=$zip->getNameIndex($i);

			echo $name.'<br>';
			$fp = $zip->getStream($name);
			if(!$fp) { continue; }

			$tbl= new TCTable('',0);
			$tbl->OpenTableH($fp);

			//Формируем SQL запрос для обновления записи
			$sql='update "'.$tbl->name.'" set ';
			for($j=0;$j<count($tbl->fields);$j++)
			{
				if($tbl->fields[$j]->name!='id') //Первичный ключ
				{
					$sql.='"'.$tbl->fields[$j]->name.'"=:'.$tbl->fields[$j]->name;
					if($j+1!=count($tbl->fields)) { $sql.=', '; } else { $sql.=' '; }
				}
			}
			$sql.='where id=:id;';
			$stmtU = $db->prepare($sql);

			//Формируем SQL для вставки записей
			$sql='insert into "'.$tbl->name.'"(';
			for($j=0;$j<count($tbl->fields);$j++)
			{
				$sql.='"'.$tbl->fields[$j]->name.'"';
				if($j+1!=count($tbl->fields)) $sql.=',';
			}
			$sql.=')values(';
			for($j=0;$j<count($tbl->fields);$j++)
			{
				$sql.=':'.$tbl->fields[$j]->name;
				if($j+1!=count($tbl->fields)) $sql.=',';
			}
			$sql.=');';
			$stmtI = $db->prepare($sql);

			$db->query('ALTER TABLE "'.$tbl->name.'" DISABLE TRIGGER USER;' ); //Почемуто при вставке тригер срабатывает а при обновлении соответствует условию
			while($tbl->ReadNextRecord())
			{
				$id=$tbl->getRowByName('id')->getValue();
				//Проверяем существование записи
				//$resE=null;
				try
				{
					$sql2='select true from "'.$tbl->name.'" where id=\''.$id.'\'';
					$resE = $db->query( $sql2 );
				} catch (Exception $e)
				{	echo 'Error SQL: ' . $sql2 . '<br><br>' . $e->getMessage();
					$seq--;
					break;
				}

				if($resE->rowCount()>0){ $exist=true; } else { $exist=false; }
				if($exist)
				{
					for($j=0;$j<count($tbl->fields);$j++)
					{
						$stmtU->bindValue(':'.$tbl->fields[$j]->name, $tbl->fields[$j]->getValue(), $tbl->fields[$j]->getPDOType());
					}
					print '<br>Update ';

					try
					{	$stmtU->execute();
					} catch (Exception $e)
					{	echo ' Error SQL id="'.$id.'": ' . $e->getMessage();
						$seq--; //Потому что могут идти с одинаковым временем подподрят несколько записей
						//break;
					}
				}else
				{
					for($j=0;$j<count($tbl->fields);$j++)
					{
						//print $tbl->fields[$j]->name.'='.$tbl->fields[$j]->getValue().'<br>';
						if(!$stmtI->bindValue($tbl->fields[$j]->name, $tbl->fields[$j]->getValue(), $tbl->fields[$j]->getPDOType())) print '<br>Error';
					}
					print '<br>Insert';

					try
					{	$stmtI->execute();
					} catch (Exception $e)
					{	echo ' Error SQL id="'.$id.'": ' . $e->getMessage();
						$seq--; //Потому что могут идти с одинаковым временем подподрят несколько записей
						//break;
					}
				}
				if($seq<$tbl->getRowByName('seq')->getValue()) { $seq=$tbl->getRowByName('seq')->getValue(); }
			}
			$db->query('ALTER TABLE "'.$tbl->name.'" ENABLE TRIGGER USER;' );
			fclose($fp);

			//Обновляем время последнего обновления
			if($seq>0)
			{
				$sql='update "_SynObjects" set "time"=extract(epoch from now()), obj_seq='.$seq.' where id=\''.$row['id'].'\'';
				try
				{
					$db->query($sql);
				} catch (Exception $e)
				{	echo $e->getMessage().' SQL='.$sql;
					Exit();
				}
			}
		}
		$zip->close();
		echo "<br>ok<br><br>";
	}
	if(file_exists('data.zip')) { unlink('data.zip'); }
}

?>
</body>
</html>