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