version-multiple-update/version.php

181 lines
6.7 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.

<?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;
}
}
}