Files
Metadata_PHP/metadata/update/set.php

255 lines
8.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<? //Отправляет запрошенную таблицу в виде 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();
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();
}