diff --git a/application/admin/controllers/DataController.php b/application/admin/controllers/DataController.php
index 474b496b..8fc5f069 100755
--- a/application/admin/controllers/DataController.php
+++ b/application/admin/controllers/DataController.php
@@ -1536,195 +1536,7 @@ class Admin_DataController extends Zend_Controller_Action
private function import($xml)
{
$iso=new ISO19115();
- $iso->loadXML($xml);
- $md=new MetadataTable();
- $thumb=new ThumbnailTable();
- $xmlt=new XmlTable();
- $cgt=new CategoryTable();
- $cgct=new CategoryCodeTable();
- $keyt=new KeywordTable();
- $dst=new DatasetSeriesTable();
- $seriestable=new SeriesTable();
- $db=$seriestable->getAdapter();
- //save metadata
- //先删除已有元数据,然后再插入新数据
- $sql="delete from metadata where uuid=?";
- $this->db->query($sql,array($iso->uuid));
- //删除所有未用到的responsible数据
- $sql="delete from responsible where id not in (select distinct(resid) from role)";
- $this->db->query($sql);
- $row=$md->createRow();
- $trow=$thumb->createRow();
- $row->uuid=$iso->uuid;
- $row->title=$iso->resTitle;
- $row->title_en=$iso->resAltTitle;
- $row->description=$iso->idAbs;
- $row->citation=$iso->citation;
- $row->suppinfo=$iso->suppinfo;
- $row->fileformat=$iso->fileformat;
- $row->projection=$iso->projection;
- //$row->author=$iso->author;
- $row->datatype=$iso->datatype;
- $row->filesize=$iso->filesize;
- $row->ts_created=$iso->mdDateSt;
- $row->timebegin=$iso->timebegin;
- $row->timeend=$iso->timeend;
- $row->west=$iso->geoBox['w'];
- $row->south=$iso->geoBox['s'];
- $row->north=$iso->geoBox['n'];
- $row->east=$iso->geoBox['e'];
- if (!empty($iso->doi)) $row->doi=$iso->doi;
- //生成空白统计数据
- $sql=$db->quoteInto("select * from mdstat where uuid=?",$iso->uuid);
- if (!$db->fetchRow($sql))
- {
- $sql="insert into mdstat (uuid) values(?)";
- $db->query($sql,array($iso->uuid));
- }
- try {
- $id=$row->save();
- //处理在线资源
- if ($iso->onlineresource) foreach($iso->onlineresource as $resource)
- {
- $sql="insert into onlineresource (uuid,linkage,protocol,name,description) values(?,?,?,?,?)";
- $db->query($sql,array($iso->uuid,$resource['linkage'],$resource['protocol'],$resource['name'],$resource['description']));
- }
- //处理缩略图
- if (!empty($iso->thumbnail)) {
- $trow->id=$id;
- $trow->data=$iso->thumbnail;
- $trow->filetype='jpg';
- $trow->save();
- } elseif ($iso->graph) {
- $trow->id=$id;
- //$trow->data=$iso->graph['data'];
- $sql="select id as gid from geonetworkmetadata where uuid=?";
- $r=$this->db->fetchRow($sql,array($iso->uuid));
- if ($r)
- {
- $trow->data=base64_encode(file_get_contents($this->view->config->geonetwork->url.'srv/cn/resources.get?access=public&id='.$r->gid.'&fname='.urlencode($iso->graph['filename'])));
- }
- $trow->filetype=$iso->graph['filetype'];
- $trow->filedesc=$iso->graph['filedesc'];
- $trow->filename=$iso->graph['filename'];
- $trow->save();
- }
- //todo:处理关键词
- //1:N relation
- foreach($iso->keyword as $keytype=>$keys)
- {
- foreach($keys as $key)
- {
- $row=$keyt->createRow();
- $row->id=$id;
- //统一转换为大写
- //不再统一转换
- $row->keyword=$key;
- $row->keytype=$keytype;
- $row->save();
- }
- }
- //todo:处理数据集序列
- //M:N relation
- if ($iso->datasetSeries) foreach($iso->datasetSeries as $ds)
- {
- $where=$db->quoteInto('name = ?',$ds['seriesName']);
- $trow=$seriestable->fetchRow($where);
- if ($trow)
- $sid=$trow->id;
- else {
- $trow=$seriestable->createRow();
- $trow->name=$ds['seriesName'];
- $sid=$trow->save();
- }
- $row=$dst->createRow();
- $row->id=$id;
- $row->sid=$sid;
- $row->save();
- }
- //处理XML入库
- $row=$xmlt->createRow();
- $row->id=$id;
- $row->data=$xml;
- $row->save();
- //处理数据分类
- foreach($iso->tpCat as $cat){
- if (is_numeric($cat)) {
- $row=$cgt->createRow();
- $row->id=$id;
- $row->code=(int)$cat;
- $row->save();
- } else {
- //是字符串,geonetwork会采用这种模式
- //从categorycode表中查找其对应的code
- $where=$db->quoteInto('name= ?',trim($cat));
- $trow=$cgct->fetchRow($where);
- if ($trow) {
- $row=$cgt->createRow();
- $row->id=$id;
- $row->code=$trow->code;
- $row->save();
- }
- //$db=$cgt->getAdapter();
- //$sql="insert into category (id,code) values($id,(select code from categorycode where name='$cat'))";
- //$db->query($sql);
- }
- }
- //处理联系人信息
- //先查询再进行处理
- //若用户信息发生变化,则存在问题
- //无法保证数据的更新状态
- foreach($iso->author as $au)
- {
- $inds=explode(";",$au['individual']);
- foreach($inds as $ind)
- {
- $sql="select id from responsible where individual=? and organisation=?";
- $row=$this->db->fetchRow($sql,array(trim($ind),trim($au['organisation'])));
- if (!$row)
- {
- $sql="insert into responsible (individual,organisation,position,delivery,phone,email,city,country,administrative,postal) values(?,?,?,?,?,?,?,?,?,?)";
- $this->db->query($sql,array(trim($ind),trim($au['organisation']),trim($au['position']),trim($au['delivery']),trim($au['phone']),trim($au['email']),trim($au['city']),trim($au['country']),trim($au['administrative']),trim($au['postal'])));
- } elseif (count($inds)==1) {
- //deal email address
- if (($au['email']) && empty($row->email))
- {
- $sql="update responsible set email=? where id=?";
- $this->db->query($sql,array(trim($au['email']),$row->id));
- }
- }
- $sql="select id from responsible where individual=? and organisation=?";
- $row=$this->db->fetchRow($sql,array(trim($ind),trim($au['organisation'])));
- if ($row->id>0)
- {
- $sql="insert into role (resid,uuid,role) values(?,?,?)";
- $this->db->query($sql,array($row->id,$iso->uuid,trim($au['role'])));
- }
- }
- }
- //处理数据限制信息
- foreach($iso->limits as $uselimit)
- {
- $sql="select id from uselimit where uselimit=?";
- $row=$this->db->fetchRow($sql,array($uselimit));
- if (!$row)
- {
- $sql="insert into uselimit (uselimit) values (?)";
- $this->db->query($sql,array($uselimit));
- }
- $sql="select id from uselimit where uselimit=?";
- $row=$this->db->fetchRow($sql,array($uselimit));
- if ($row)
- {
- $sql="insert into mdlimit (uuid,lid) values(?,?)";
- $this->db->query($sql,array($iso->uuid,$row->id));
- }
- }
- $iso->save("../data/import/$iso->uuid.xml");
- } catch (Exception $e) {
- //数据重复插入,此处忽略所有错误
- print $iso->uuid.' has error: '.$e->getMessage().'
';
- }
+ $iso->saveDB($this->db,$xml);
}
}
diff --git a/application/models/ISO19115.php b/application/models/ISO19115.php
index 17635b82..00069607 100755
--- a/application/models/ISO19115.php
+++ b/application/models/ISO19115.php
@@ -163,8 +163,158 @@ class ISO19115
function loadUUID($uuid)
{
}
- function saveDB()
+ function saveDB($db,$xml)
{
+ $this->loadXML($xml);
+ //先删除已有元数据,然后再插入新数据
+ $sql="delete from metadata where uuid=?";
+ $db->query($sql,array($this->uuid));
+ //删除所有未用到的responsible数据
+ $sql="delete from responsible where id not in (select distinct(resid) from role)";
+ $db->query($sql);
+
+ //if (!empty($this->doi)) $row->doi=$this->doi;
+ //生成空白统计数据,可以转移到数据库端处理(todo)
+ try
+ {
+ $sql="insert into mdstat (uuid) values(?)";
+ $db->query($sql,array($this->uuid));
+ } catch (Exception $e) {
+ //do nothing.
+ //说明数据库中已存在该信息
+ }
+
+ //save metadata into database
+ $sql="insert into metadata (uuid,title,title_en,description,citation,suppinfo,fileformat,projection,datatype,filesize,ts_created,
+ timebegin,timeend,west,south,north,east,doi) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
+ $sth=$db->prepare($sql);
+ try {
+ $sth->execute(array($this->uuid,$this->resTitle,$this->resAltTitle,$this->idAbs,$this->citation,$this->suppinfo,$this->fileformat,
+ $this->projection,$this->datatype,$this->filesize,$this->mdDateSt,$this->timebegin,$this->timeend,$this->geoBox['w'],
+ $this->geoBox['s'],$this->geoBox['n'],$this->geoBox['e'],$this->doi));
+ $id=$db->lastInsertId('metadata','id');
+ //处理在线资源
+ if ($this->onlineresource) foreach($this->onlineresource as $resource)
+ {
+ $sql="insert into onlineresource (uuid,linkage,protocol,name,description) values(?,?,?,?,?)";
+ $db->query($sql,array($this->uuid,$resource['linkage'],$resource['protocol'],$resource['name'],$resource['description']));
+ }
+ //处理缩略图
+ if (!empty($this->thumbnail)) {
+ $sql="insert into thumbnail (id,data,filetype) values(?,?,?)";
+ $db->query($sql,array($id,$this->thumbnail,'jpg'));
+ } elseif ($this->graph) {
+ //$trow->data=$this->graph['data'];
+ $sql="select id as gid from geonetworkmetadata where uuid=?";
+ $r=$db->fetchRow($sql,array($this->uuid));
+ if ($r)
+ {
+ $thumb=base64_encode(file_get_contents($this->view->config->geonetwork->url.'srv/cn/resources.get?access=public&id='.$r->gid.'&fname='.urlencode($this->graph['filename'])));
+ $sql="insert into thumbnail (id,data,filetype,filedesc,filename) values(?,?,?,?,?)";
+ $db->query($sql,array($id,$thumb,$this->graph['filetype'],$this->graph['filedesc'],$this->graph['filename']));
+ }
+ }
+ //处理关键词
+ //1:N relation
+ foreach($this->keyword as $keytype=>$keys)
+ {
+ foreach($keys as $key)
+ {
+ $sql="insert into keyword (id,keyword,keytype) values(?,?,?)";
+ $db->query($sql,array($id,$key,$keytype));
+ }
+ }
+ //处理数据集序列
+ //M:N relation
+ if ($this->datasetSeries) foreach($this->datasetSeries as $ds)
+ {
+ $where=$db->quoteInto('name = ?',$ds['seriesName']);
+ $sql="select id from series where name=?";
+ $sth=$db->prepare($sql);
+ $sth->execute(array($ds['seriesName']));
+ $trow=$sth->fetch();
+ $trow=$seriestable->fetchRow($where);
+ if ($trow)
+ $sid=$trow['id'];
+ else {
+ $sql="insert into series (name) values(?)";
+ $db->query($sql,array($ds['seriesName']));
+ $sid=$db->lastInsertId('series','id');
+ }
+ $sql="insert into dataserires (id,sid) values(?,?)";
+ $db->query($sql,array($id,$sid));
+ }
+ //处理XML入库
+ $sql="insert into xml (id,data) values(?,?)";
+ $db->query($sql,array($id,$xml));
+ //处理数据分类
+ foreach($this->tpCat as $cat){
+ if (is_numeric($cat)) {
+ $sql="insert into category (id,code) values(?,?)";
+ $db->query($sql,array($id,(int)$cat));
+ } else {
+ //是字符串,geonetwork会采用这种模式
+ //从categorycode表中查找其对应的code
+ $sql="insert into category (id,code) select ?,code from categorycode where name=?";
+ $db->query($sql,array($id, trim($cat)));
+ }
+ }
+ //处理联系人信息
+ //先查询再进行处理
+ //若用户信息发生变化,则存在问题
+ //无法保证数据的更新状态
+ foreach($this->author as $au)
+ {
+ $inds=explode(";",$au['individual']);
+ foreach($inds as $ind)
+ {
+ $sql="select id from responsible where individual=? and organisation=?";
+ $row=$db->fetchRow($sql,array(trim($ind),trim($au['organisation'])));
+ if (!$row)
+ {
+ $sql="insert into responsible (individual,organisation,position,delivery,phone,email,city,country,administrative,postal) values(?,?,?,?,?,?,?,?,?,?)";
+ $db->query($sql,array(trim($ind),trim($au['organisation']),trim($au['position']),trim($au['delivery']),trim($au['phone']),trim($au['email']),trim($au['city']),trim($au['country']),trim($au['administrative']),trim($au['postal'])));
+ } elseif (count($inds)==1) {
+ //deal email address
+ if (($au['email']) && empty($row->email))
+ {
+ $sql="update responsible set email=? where id=?";
+ $db->query($sql,array(trim($au['email']),$row->id));
+ }
+ }
+ $sql="select id from responsible where individual=? and organisation=?";
+ $row=$db->fetchRow($sql,array(trim($ind),trim($au['organisation'])));
+ if ($row->id>0)
+ {
+ $sql="insert into role (resid,uuid,role) values(?,?,?)";
+ $db->query($sql,array($row->id,$this->uuid,trim($au['role'])));
+ }
+ }
+ }
+ //处理数据限制信息
+ foreach($this->limits as $uselimit)
+ {
+ $sql="select id from uselimit where uselimit=?";
+ $row=$db->fetchRow($sql,array($uselimit));
+ if (!$row)
+ {
+ $sql="insert into uselimit (uselimit) values (?)";
+ $db->query($sql,array($uselimit));
+ }
+ $sql="select id from uselimit where uselimit=?";
+ $row=$db->fetchRow($sql,array($uselimit));
+ if ($row)
+ {
+ $sql="insert into mdlimit (uuid,lid) values(?,?)";
+ $db->query($sql,array($this->uuid,$row->id));
+ }
+ }
+ $this->save("../data/import/$this->uuid.xml");
+ } catch (Exception $e) {
+ //数据重复插入,此处忽略所有错误
+ print $this->uuid.' has error: '.$e->getMessage().'
';
+ }
+
}
function parse()