Files
Metadata_PHP/metadata/update/get.php

177 lines
5.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<title>Синхронизация</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body style="background-color:#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>