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++) { $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'); } } ?>