firstChild; while ($mas[$pos]) { if($mas[$pos]->nodeName==$nodename) { return $mas[$pos]; } if($mas[$pos]->firstChild) { $pos++; $mas[$pos]=$mas[$pos-1]->firstChild; }else { while (true) { $mas[$pos] = $mas[$pos]->nextSibling; if (!$mas[$pos]) { if($pos>0){ $pos--; }else{ break; } }else { break; } } } } return ''; } 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(); } if(!isset($_SESSION["USER_ID"])) $_SESSION["USER_ID"]=0; if(isset($_REQUEST["fn"])) $fn=$_REQUEST["fn"]; else Exit(); if ($fn==0) //Отправить время в секундах с 2000 года { $res = $db->query('select "getDate2000"()'); if($row = $res->fetch(PDO::FETCH_NUM)) print $row[0]; exit(); }else if ($fn==1) //Получить данные заданных полей из таблицы в виде двоичных данных { if(isset($_REQUEST["r"])) $r=$_REQUEST["r"]; else $r=0; //id запроса if(isset($_REQUEST["n"])) $n=$_REQUEST["n"]; //Название таблицы if(isset($_REQUEST["s"])) $s=$_REQUEST["s"]; else $s=0; //Время с которого надо отправлять клиенту 0 то всё if(isset($_REQUEST["l"])) $l=$_REQUEST["l"]; else $l=100; //Кол-во записей за раз //Чтобы не выбирать данные при запросе к таблице с кучей полей $res = $db->query('select id,seq from "'.$n.'" where seq>'.$s.' order by seq'); //Лимит не применяю чтоб seq не различался $cnt=0; $seq=-1; $ids=''; while ($row = $res->fetch(PDO::FETCH_ASSOC)) { if($cnt>=$l && $seq!=$row['seq']) break; //Заданное количество записей включая повторы последнего seq $ids.="'".$row['id']."',"; $seq=$row['seq']; $cnt++; } $ids=rtrim($ids,','); if($ids=='') { $ids="''"; } error_log('select * from "'.$n.'" where id in ('.$ids.') order by seq'); $res = $db->query('select * from "'.$n.'" where id in ('.$ids.') order by seq'); //Лимит не применяю чтоб seq не различался $tbl=new TCTable($n,0); //Записываем id типов столбцов for($i=0;$i<$res->columnCount();$i++) { $meta = $res->getColumnMeta($i); $field=new TCField($meta['name'], $meta['native_type']); $tbl->addField($field); } /* //Оперативка на хостинге не безграничная поэтому в файл сохраняем $hTable = fopen($n.'.tbl', 'w'); //Таблица fwrite($hTable, $tbl->getHeader()); //Записываем заголовок таблицы $cnt=0; $seq=-1; while ($row = $res->fetch(PDO::FETCH_NUM)) { if($cnt>=$l && $seq!=$row[$sn]) break; //Заданное количество записей включая повторы последнего seq $hCol = fopen('col.txt', 'w'); //1 запись таблицы //подсчитываем пустоту и записываем значения $null=''; for($i=0;$i<$res->columnCount();$i++) { if($tbl->fields[$i]->type==TCField::$BD_BLOB_4) //Двоичные данные { if($row[$i]=='') { $null.='0'; }else { stream_copy_to_stream($row[$i],$hCol); $null.='1'; } }else { if(fwrite($hCol, $tbl->fields[$i]->pack($row[$i]))>0) $null.='1'; else $null.='0'; } } fclose($hCol); $null.='00000000'; for($i=0;$ifields)/8.0);$i++) { fwrite($hTable, pack("C",bindec(substr($null,0,8)))); $null=substr($null,8); } //Копируем содержимое записи $hCol = fopen('col.txt', 'r'); stream_copy_to_stream($hCol,$hTable); fclose($hCol); unlink('col.txt'); $seq=$row[$sn]; $cnt++; } fclose($hTable); //Зипуем и отправляем клиенту (без поддержки докачки) $fname = 'data_'.time().'.zip'; $zip = new ZipArchive; $res = $zip->open($fname, ZipArchive::CREATE); if ($res === TRUE) { $zip->addFile($n.'.tbl'); $zip->close(); unlink($n.'.tbl'); } header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename=data.zip'); readfile($fname); unlink($fname); */ $szRez=''; //Данные из таблицы в двоичном формате $szRez.=$tbl->getHeader(); //заголовок while ($row = $res->fetch(PDO::FETCH_NUM)) { for($i=0;$i<$res->columnCount();$i++) { if($tbl->fields[$i]->type==TCField::$BD_BLOB_4) //Двоичные данные { if($row[$i]=='') $tbl->fields[$i]->setValue(''); else $tbl->fields[$i]->setValue(stream_get_contents($row[$i])); }else $tbl->fields[$i]->setValue($row[$i]); } $szRez.=$tbl->getCol(); } $zipfile = new zipfile(); $zipfile->addFile($szRez, $cnt.'_'.$n.'.tbl'); header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename=data.zip'); echo $zipfile->file(); exit(); } if ($fn==2) //Получить данные заданных полей из таблицы в виде XML { if(isset($_REQUEST["r"])) $r=$_REQUEST["r"]; else $r=0; //id запроса if(isset($_REQUEST["n"])) $n=$_REQUEST["n"]; //Название таблицы if(isset($_REQUEST["s"])) $s=$_REQUEST["s"]; else $s=0; //Время с которого надо отправлять клиенту 0 то всё if(isset($_REQUEST["l"])) $l=$_REQUEST["l"]; else $l=100; //Кол-во записей за раз $res = $db->query('select * from "'.$n.'" where seq>'.$s.' order by seq'); //Лимит не применяю чтоб seq не различался $xmlString=''; $xmlString.=''; /* for($i=0;$i'; //названия запишем в строку потом разобьём на массив $strNames=""; $currNode=findNodeOnAttribute($objXMLDocument->documentElement,'type','n',$sub[0]); $nodeProperties=findFirstNode($currNode,"properties"); if($nodeProperties!=null) { $nodeProp=$nodeProperties->firstChild; while ($nodeProp != null): if($nodeProp->nodeName=="prop") { $strNames.=$nodeProp->getAttribute("n").';'; } $nodeProp=$nodeProp->nextSibling; endwhile; } $propNames=split(";", $strNames); //Сформировали массив названий полей //проверяем права на чтение записи $sql->sql_query='select * from "p__Access_4"(-1,-1,\''.$sub[0].'\','.$_SESSION["USER_ID"].');'; $sql->sql_execute(); if((pg_num_rows($sql->sql_res)>0)&&(pg_result($sql->sql_res, $j, "select")=="t")) { $sql->sql_query='select * from "p_'.$sub[0].'_5"(0,-1,'.$sub[1].')'; $sql->sql_execute(); $j=0; while ($j sql_res)) : $xmlString.=''; //перебираем название полй и строим ответ for($k=0;$ksql_result($j,$propNames[$k]).']]>'; //гадина java удаляет пустые cdata (поэтому ) } $xmlString.=''; $j++; endwhile; } $xmlString.=''; }*/ $xmlString.=''; //зипуем xml и отправляем клиенту (без поддержки докачки) $zipfile = new zipfile(); $zipfile->addFile($xmlString, 'xml.xml'); $binarydata = $zipfile->file(); header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename=xml.zip'); echo $binarydata; exit(); }