255 lines
9.0 KiB
PHP
255 lines
9.0 KiB
PHP
<? //Отправляет запрошенную таблицу в виде zip архива
|
|
/*
|
|
$pos=strripos ( $_SERVER['SERVER_NAME'] , '.' , 0 ) - strlen($_SERVER['SERVER_NAME']) - 1;
|
|
$pos=strripos ( $_SERVER['SERVER_NAME'] , '.' , $pos );
|
|
ini_set('session.cookie_domain', $pos ? substr($_SERVER['SERVER_NAME'],$pos) : '.'.$_SERVER['SERVER_NAME']);
|
|
*/
|
|
if(isset($_GET[session_name()]) && $_GET[session_name()]!='') //Чтоб сессия переданная гетом была главней
|
|
session_id($_GET[session_name()]);
|
|
@session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);
|
|
if(isset($_SESSION['REMOTE_ADDR']) && $_SESSION['REMOTE_ADDR'] != $_SERVER['REMOTE_ADDR']) unset($_SESSION["USER_ID"]); //Делаемся не авторизованным если зашли с другого ip адреса
|
|
|
|
require_once("../include/zip.lib.php");
|
|
require_once("../include/class_table.php");
|
|
require_once("../../config.php");
|
|
|
|
function findFirstNode($node, $nodename)
|
|
{
|
|
$mas=array();
|
|
$pos=0;
|
|
$mas[$pos] = $node->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;$i<ceil(count($tbl->fields)/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='<?xml version="1.0" encoding="utf-8"?>';
|
|
$xmlString.='<metadata>';
|
|
/* for($i=0;$i<count($someArray)-1;$i++)
|
|
{
|
|
$xmlString.='<type n="'.$sub[0].'">';
|
|
|
|
//названия запишем в строку потом разобьём на массив
|
|
$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 <pg_num_rows($sql->sql_res)) :
|
|
$xmlString.='<rec id="'.$sql->sql_result($j,'id').'" del="'.$sql->sql_result($j,'del').'" seq="'.$sql->sql_result($j,'seq').'">';
|
|
//перебираем название полй и строим ответ
|
|
for($k=0;$k<count($propNames)-1;$k++)
|
|
{
|
|
$xmlString.='<d><![CDATA['.$sql->sql_result($j,$propNames[$k]).']]></d>'; //гадина java удаляет пустые cdata (поэтому <d>)
|
|
}
|
|
$xmlString.='</rec>';
|
|
$j++;
|
|
endwhile;
|
|
}
|
|
$xmlString.='</type>';
|
|
}*/
|
|
$xmlString.='</metadata>';
|
|
|
|
//зипуем 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();
|
|
}
|