Первая копия
This commit is contained in:
178
metadata/update/get.php
Normal file
178
metadata/update/get.php
Normal file
@ -0,0 +1,178 @@
|
||||
<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.php");
|
||||
|
||||
try
|
||||
{ $db = new PDO($db_connstr, $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++)
|
||||
{
|
||||
//print $tbl->fields[$j]->name.'='.$tbl->fields[$j]->getValue().'<br>';
|
||||
$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>
|
||||
Reference in New Issue
Block a user