setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e)
{ echo 'Ошибка соединения: ' . $e->getMessage();
Exit();
}
echo 'Synchronization started!
';
$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.'
';
//Не знаю на сколько хорошо работает функция 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.'
';
$fp = $zip->getStream($name);
if(!$fp) { continue; }
$tbl= new TCTable('',0);
$tbl->OpenTableH($fp);
//Формируем SQL запрос для обновления записи
$sql='update "'.$tbl->name.'" set ';
for($j=0;$jfields);$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;$jfields);$j++)
{
$sql.='"'.$tbl->fields[$j]->name.'"';
if($j+1!=count($tbl->fields)) $sql.=',';
}
$sql.=')values(';
for($j=0;$jfields);$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 . '
' . $e->getMessage();
$seq--;
break;
}
if($resE->rowCount()>0){ $exist=true; } else { $exist=false; }
if($exist)
{
for($j=0;$jfields);$j++)
{
//print $tbl->fields[$j]->name.'='.$tbl->fields[$j]->getValue().'
';
$stmtU->bindValue(':'.$tbl->fields[$j]->name, $tbl->fields[$j]->getValue(), $tbl->fields[$j]->getPDOType());
}
print '
Update ';
try
{ $stmtU->execute();
} catch (Exception $e)
{ echo ' Error SQL id="'.$id.'": ' . $e->getMessage();
$seq--; //Потому что могут идти с одинаковым временем подподрят несколько записей
//break;
}
}else
{
for($j=0;$jfields);$j++)
{
//print $tbl->fields[$j]->name.'='.$tbl->fields[$j]->getValue().'
';
if(!$stmtI->bindValue($tbl->fields[$j]->name, $tbl->fields[$j]->getValue(), $tbl->fields[$j]->getPDOType())) print '
Error';
}
print '
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 "
ok
";
}
if(file_exists('data.zip')) { unlink('data.zip'); }
}
?>