181 lines
6.7 KiB
PHP
181 lines
6.7 KiB
PHP
<?php
|
||
class Version
|
||
{
|
||
private $db;
|
||
private $changelog;
|
||
private $err;
|
||
private $userid;
|
||
public $zend_db;
|
||
|
||
//初始化
|
||
function __construct($config)
|
||
{
|
||
//$this->db=$config->db;
|
||
$this->versionTable=$config->versionTable;
|
||
$this->statusTable=$config->statusTable;
|
||
$this->metadataTable=$config->metadataTable;
|
||
$this->xmlTable=$config->xmlTable;
|
||
$this->changelog=$config->changelog;
|
||
$this->db = pg_connect(http_build_query($config->db,'',' '));
|
||
$this->err=array();
|
||
$this->userid=$config->userid;
|
||
}
|
||
|
||
function __destruct()
|
||
{
|
||
pg_close($this->db);
|
||
}
|
||
|
||
//版本更新:指定versionid
|
||
function update_by_version($uuid,$versionid,$changelog="")
|
||
{
|
||
if (!$changelog) $changelog=$this->changelog;
|
||
// 1. 保存变化记录 save changelog & userid
|
||
$sql = "UPDATE {$this->versionTable} SET changelog='$changelog',userid=$this->userid WHERE id=$versionid and uuid='$uuid'";
|
||
pg_query($this->db,$sql);
|
||
|
||
// 2. 同步元数据
|
||
$sql = "select xml from {$this->versionTable} where id=$versionid and uuid='$uuid'";
|
||
$result=pg_query($this->db,$sql);
|
||
$row = pg_fetch_row($result);
|
||
$iso=new ISO19115();
|
||
@$iso->loadXML($row[0]);
|
||
if ($iso->validate())
|
||
{
|
||
$this->err[]="元数据: ".$uuid." 导入过程中发现错误。\n".implode("\n",$iso->error);
|
||
}
|
||
@$iso->saveDB($this->zend_db);
|
||
|
||
// 3. 移除中间版本
|
||
$sql="delete from {$this->versionTable} where uuid='$uuid' and changelog is null";
|
||
pg_query($this->db,$sql);
|
||
pg_free_result($result);
|
||
}
|
||
|
||
//版本更新:以最新的一个版本进行更新
|
||
function update_by_uuid($uuid,$changelog="")
|
||
{
|
||
if (!$changelog) $changelog=$this->changelog;
|
||
// 1. 保存变化记录 save changelog & userid
|
||
$sql = "UPDATE {$this->versionTable} SET changelog='$changelog',userid=$this->userid WHERE id in (select id from {$this->versionTable} where uuid='$uuid' order by ts_created desc limit 1)";
|
||
pg_query($this->db,$sql);
|
||
|
||
// 2. 同步元数据
|
||
$sql = "select xml from {$this->versionTable} where uuid='$uuid' order by ts_created desc limit 1";
|
||
$result=pg_query($this->db,$sql);
|
||
$row = pg_fetch_row($result);
|
||
$iso=new ISO19115();
|
||
@$iso->loadXML($row[0]);
|
||
if ($iso->validate())
|
||
{
|
||
$this->err[]="元数据: ".$uuid." 导入过程中发现错误。\n".implode("\n",$iso->error);
|
||
}
|
||
@$iso->saveDB($this->zend_db);
|
||
|
||
// 3. 移除中间版本
|
||
$sql="delete from {$this->versionTable} where uuid='$uuid' and changelog is null";
|
||
pg_query($this->db,$sql);
|
||
pg_free_result($result);
|
||
}
|
||
|
||
//专题更新:将指定专题的数据,全部按照最新版本进行更新
|
||
function update_by_source($sourceid,$changelog="")
|
||
{
|
||
if (!$changelog) $changelog=$this->changelog;
|
||
// 1. 保存变化记录 save changelog & userid
|
||
$sql = "UPDATE {$this->versionTable} SET changelog='$changelog',userid=$this->userid WHERE id in (
|
||
select distinct on (uuid) id from {$this->versionTable} where uuid in (select uuid from datasource where sourceid=$sourceid)
|
||
and uuid in (select distinct uuid from {$this->statusTable}) order by uuid,ts_created desc
|
||
) and changelog is null";
|
||
pg_query($this->db,$sql);
|
||
|
||
// 2. 同步元数据
|
||
$sql = "select xml from {$this->versionTable} WHERE id in (
|
||
select distinct on (uuid) id from {$this->versionTable} where uuid in (select uuid from datasource where sourceid=$sourceid)
|
||
and uuid in (select distinct uuid from {$this->statusTable}) order by uuid,ts_created desc
|
||
) and changelog is not null";
|
||
$result=pg_query($this->db,$sql);
|
||
while ($row = pg_fetch_row($result))
|
||
{
|
||
$iso=new ISO19115();
|
||
@$iso->loadXML($row[0]);
|
||
if ($iso->validate())
|
||
{
|
||
$this->err[]="元数据: ".$uuid." 导入过程中发现错误。\n".implode("\n",$iso->error);
|
||
}
|
||
@$iso->saveDB($this->zend_db);
|
||
}
|
||
// 3. 移除中间版本
|
||
$sql="delete from {$this->versionTable} where uuid in (select distinct uuid from datasource where sourceid=$sourceid)
|
||
and uuid in (select distinct uuid from {$this->statusTable}) and changelog is null";
|
||
pg_query($this->db,$sql);
|
||
pg_free_result($result);
|
||
}
|
||
|
||
// 更新符合SQL条件查询的所有数据的最新版本
|
||
function update_by_sql($like,$changelog="")
|
||
{
|
||
if (!$changelog) $changelog=$this->changelog;
|
||
// 1. 保存变化记录 save changelog & userid
|
||
$sql = "UPDATE {$this->versionTable} SET changelog='$changelog',userid=$this->userid WHERE id in (
|
||
select distinct on (uuid) id from {$this->versionTable} where uuid in (select distinct m.uuid from {$this->metadataTable} m left join {$this->xmlTable} x on m.id=x.id where x.xml like '%$like%')
|
||
and uuid in (select distinct uuid from {$this->statusTable}) order by uuid,ts_created desc
|
||
) and changelog is null";
|
||
pg_query($this->db,$sql);
|
||
|
||
// 2. 同步元数据
|
||
$sql = "select xml from {$this->versionTable} WHERE id in (
|
||
select distinct on (uuid) id from {$this->versionTable} where uuid in (select distinct m.uuid from {$this->metadataTable} m left join {$this->xmlTable} x on m.id=x.id where x.xml like '%$like%')
|
||
and uuid in (select distinct uuid from {$this->statusTable}) order by uuid,ts_created desc
|
||
) and changelog is not null";
|
||
$result=pg_query($this->db,$sql);
|
||
while ($row = pg_fetch_row($result))
|
||
{
|
||
$iso=new ISO19115();
|
||
@$iso->loadXML($row[0]);
|
||
if ($iso->validate())
|
||
{
|
||
$this->err[]="元数据: ".$uuid." 导入过程中发现错误。\n".implode("\n",$iso->error);
|
||
}
|
||
@$iso->saveDB($this->zend_db);
|
||
}
|
||
// 3. 移除中间版本
|
||
$sql="delete from {$this->versionTable} where uuid in (select distinct m.uuid from {$this->metadataTable} m left join {$this->xmlTable} x on m.id=x.id where x.xml like '%$like%')
|
||
and uuid in (select distinct uuid from {$this->statusTable}) and changelog is null";
|
||
pg_query($this->db,$sql);
|
||
pg_free_result($result);
|
||
}
|
||
|
||
//版本删除
|
||
function delete($uuid,$versionid)
|
||
{
|
||
$sql = "DELETE FROM {$this->versionTable} WHERE uuid='$uuid' and id=$versionid";
|
||
return pg_query($this->db, $sql);
|
||
}
|
||
|
||
//todo: 版本直接发布(仅发布之前为评审状态的数据)
|
||
function release_by_version($uuid,$versionid)
|
||
{
|
||
//todo
|
||
$sql = "SELECT s.*,v.xml,m.title FROM en.mdstatus s left join en.mdversion v on s.uuid=v.uuid
|
||
left join en.metadata m on s.uuid=m.uuid WHERE v.id=?";
|
||
return pg_query($this->db,$sql);
|
||
}
|
||
function release_by_uuid($uuid)
|
||
{
|
||
//todo
|
||
}
|
||
function release_by_source($sourceid)
|
||
{
|
||
//todo
|
||
}
|
||
|
||
//错误输出
|
||
function error()
|
||
{
|
||
if (!empty($this->err))
|
||
{
|
||
foreach($this->err as $e) print $e;
|
||
}
|
||
}
|
||
} |