dmppgsqlutils.cpp 11.4 KB
#include <iostream>
#include <libpq-fe.h> 
#include <map>
#include <vector>
#include <boost/property_tree/ptree.hpp>
#include "dmppgsqlutils.h"


    DmpPgsqlUtils::DmpPgsqlUtils()
    {}
    DmpPgsqlUtils::DmpPgsqlUtils( const char* strConn,std::string& Msg)
    {
        //std::string strconn_="hostaddr=172.26.99.160 prot=5432 dbname='DmapServer' user='postgres' password='chinadci'";
        conn_=strConn;   
        basepconn_=PQconnectdb(conn_);
        if(PQstatus(basepconn_)!=CONNECTION_OK)
        {
            Msg= (std::string)PQerrorMessage(basepconn_);          
        }
    }
    DmpPgsqlUtils::~DmpPgsqlUtils()
    {
        if(PQstatus(basepconn_)==CONNECTION_OK)
        {
             PQfinish(basepconn_);
        }         
    }

    void DmpPgsqlUtils::do_exit(PGconn *conn) 
    {
        PQfinish(conn);  
        exit(1);  
    }  

    bool DmpPgsqlUtils::GetDMapServices(std::map<int,DMapService> &dmapServices,std::string& Msg)
    {
        PGresult *res;
        const char* strsql="SELECT  name, title, state::character, create_time, update_time, description, node::character, overview, type, service_guid, catalog_guid FROM public.dmap_service where type='WMTS'";
        //char* conn_="hostaddr=172.26.60.100 port=5432 dbname=dmap_manager_test user=postgres password=chinadci";     
        //PGconn* pconn_=PQconnectdb(conn_);
        if(PQstatus(basepconn_)!=CONNECTION_OK)
        {
            std::string Msg_= (std::string)PQerrorMessage(basepconn_);
            PQfinish(basepconn_);
            return false;
        }        
        res = PQexec(basepconn_,strsql);
        int tuple_num=PQntuples(res);
        int field_num=PQnfields(res);
        if(tuple_num>0)
        {
            for(int i=0;i<tuple_num;i++)
            {
                std::string name=PQgetvalue(res,i,0);
                std::string state=PQgetvalue(res,i,2);
                std::string createtime=PQgetvalue(res,i,3);
                std::string type=PQgetvalue(res,i,8);
                std::string serviceguid=PQgetvalue(res,i,9);
                DMapService service{
                    .name=name,
                    .state=state,
                    .create_time=createtime,
                    .type=type,
                    .service_guid=serviceguid
                };
                dmapServices[i]=service;
            }
            
        }   
        else  
        {
            return false;
        }
        PQclear(res);   
        return true; 
    }
    bool DmpPgsqlUtils::GetDMapService(DMapService &dmapService,const std::string& servicename,std::string& Msg)
    {
        PGresult *res;
        std::string strsql="SELECT  name, title, state::character, create_time, update_time, description, node::character, overview, type, service_guid, catalog_guid FROM public.dmap_service where name='"+servicename+"'";
        const char* csql=strsql.c_str();
        if(PQstatus(basepconn_)!=CONNECTION_OK)
        {
            std::string Msg= (std::string)PQerrorMessage(basepconn_);
            PQfinish(basepconn_);
            return false;
        }        
        res = PQexec(basepconn_,csql);
        int tuple_num=PQntuples(res);
        int field_num=PQnfields(res);
        if(tuple_num==1)
        {           
            std::string name=PQgetvalue(res,0,0);
            std::string state=PQgetvalue(res,0,2);
            std::string createtime=PQgetvalue(res,0,3);
            std::string type=PQgetvalue(res,0,8);
            std::string serviceguid=PQgetvalue(res,0,9);
            DMapService service{
                .name=name,
                .state=state,
                .create_time=createtime,
                .type=type,
                .service_guid=serviceguid
            };
            dmapService=service;           
        }  
        else
        {
            return false;
        }   
        PQclear(res);   
        return true; 
    }
    
    bool DmpPgsqlUtils::GetDMapwmts(const std::string& serviceGuid,DMapWmtsService& resWmts,std::string& Msg)
    {
        //char* conn_="hostaddr=172.26.60.100 port=5432 dbname=dmap_manager_test user=postgres password=chinadci"; 
        std::string strsql="SELECT  name, wmts_type, vendor, create_time::character, crs, datasource, metadata_url, scheme_guid	FROM public.dmap_wmts where guid='"+serviceGuid+"'";
        const char* csql=strsql.c_str();
            
        //PGconn* pconn_=PQconnectdb(conn_);
        if(PQstatus(basepconn_)!=CONNECTION_OK)
        {
            std::string Msg= (std::string)PQerrorMessage(basepconn_);
            PQfinish(basepconn_);
            return false;
        }        
        PGresult *res;
        res = PQexec(basepconn_,csql);
        int tuple_num=PQntuples(res);
        int field_num=PQnfields(res);
        
        if(tuple_num>0)
        {            
            resWmts.name=PQgetvalue(res,0,0);
            resWmts.type=PQgetvalue(res,0,1);
            std::string v=PQgetvalue(res,0,2);            
            resWmts.vendor=StringToVendor(v);
            resWmts.create_time=PQgetvalue(res,0,3);
            resWmts.crs=PQgetvalue(res,0,4);
            resWmts.datasource=PQgetvalue(res,0,5);
            resWmts.metadata_url=PQgetvalue(res,0,6);
            resWmts.tile_id= PQgetvalue(res,0,7);           
        }
        else
        {
            return false;
        }
        PQclear(res);
        return true;
    }
    bool DmpPgsqlUtils::GetDMapwmtsFromName(const std::string& serviceName, DMapWmtsService& resWmts,std::string& Msg)
    {
        std::string strsql="SELECT  name, wmts_type, vendor, create_time::character, crs, datasource, metadata_url,layer_name, layer_alias, layer_title, layer_style, layer_format, layer_extent, scheme_guid	FROM public.dmap_wmts where name='"+serviceName+"'";
        const char* csql=strsql.c_str();
            
        //PGconn* pconn_=PQconnectdb(conn_);
        if(PQstatus(basepconn_)!=CONNECTION_OK)
        {
            std::string Msg= (std::string)PQerrorMessage(basepconn_);
            PQfinish(basepconn_);
            return false;
        }        
        PGresult *res;
        res = PQexec(basepconn_,csql);
        int tuple_num=PQntuples(res);
        int field_num=PQnfields(res);
        
        if(tuple_num>0)
        {            
            resWmts.name=PQgetvalue(res,0,0);
            resWmts.type=PQgetvalue(res,0,1);
            std::string v=PQgetvalue(res,0,2);            
            resWmts.vendor=StringToVendor(v);
            resWmts.create_time=PQgetvalue(res,0,3);
            resWmts.crs=PQgetvalue(res,0,4);
            resWmts.datasource=PQgetvalue(res,0,5);
            resWmts.metadata_url=PQgetvalue(res,0,6);
            resWmts.layername=PQgetvalue(res,0,7);
            resWmts.layer_alias=PQgetvalue(res,0,8);
            resWmts.layer_tile=PQgetvalue(res,0,9);
            resWmts.layer_style=PQgetvalue(res,0,10);
            resWmts.layer_format=PQgetvalue(res,0,11);
            resWmts.layer_extent=PQgetvalue(res,0,12);          
            resWmts.tile_id= PQgetvalue(res,0,13);           
        }
        else
        {
            return false;
        }
        PQclear(res);
        return true;
    }
    bool DmpPgsqlUtils::GetTileScheme(const std::string& guid,TileScheme& tileScheme,std::string& Msg)
    {
        std::string strsql="SELECT guid, name, alias, description, crs, crs_wkt, extent, top_left, levels, dpi::character, rows::character, cols::character, update_time, parameter FROM public.dmap_tile_scheme where guid='"+guid+"'";
        const char* csql=strsql.c_str();
            
        //PGconn* pconn_=PQconnectdb(conn_);
        if(PQstatus(basepconn_)!=CONNECTION_OK)
        {
            std::string Msg= (std::string)PQerrorMessage(basepconn_);
            PQfinish(basepconn_);
            return false;
        }        
        PGresult *res;
        res = PQexec(basepconn_,csql);
        int tuple_num=PQntuples(res);
        int field_num=PQnfields(res);
        
        if(tuple_num>0)
        {            
            tileScheme.guid=PQgetvalue(res,0,0);
            tileScheme.name=PQgetvalue(res,0,1);
            tileScheme.crs=PQgetvalue(res,0,4);
            tileScheme.wkt=PQgetvalue(res,0,5);
            tileScheme.layer_extent=PQgetvalue(res,0,6);
            tileScheme.top_left=PQgetvalue(res,0,7);
            tileScheme.levels=PQgetvalue(res,0,8);
            tileScheme.dpi=PQgetvalue(res,0,9);
            tileScheme.rows=PQgetvalue(res,0,10);
            tileScheme.cols=PQgetvalue(res,0,11);
        }
        else
        {
            return false;
        }
        PQclear(res);
        return true;
    }
    bool DmpPgsqlUtils::CreatServerPTree(const DMapService &dmapServices,const DMapWmtsService& resWmts,boost::property_tree::ptree& pt_root)
    {
        boost::property_tree::ptree pt_properties;
        pt_root.add("serviceName",dmapServices.name);
        pt_root.add("mapType",dmapServices.type);
        pt_root.add("state",dmapServices.state);
        pt_root.add("capabilities",dmapServices.type+"Server");
        pt_root.add_child("properties",pt_properties);
        pt_properties.add("filePath","postgresql");
        pt_properties.add("maxScale","");
        pt_properties.add("minScale","");
        boost::property_tree::ptree pt_services,pt_service;
        //pt_service.add("typeName",atoi(dmpwmtsservices_.type.c_str()));
        pt_service.add("typeName",0);
        pt_service.add("enabled","true");
        pt_service.add("properties.tileVersion",resWmts.vendor);
        pt_service.add("properties.tilePath",resWmts.datasource);
        pt_service.add("capabilities","");
        pt_services.push_back(std::make_pair("", pt_service)); 
        pt_root.put_child("services",pt_services);
        return true;
    }
    bool DmpPgsqlUtils::GetDMapServices(DMapService &dmapService,const std::string serviceName,std::string& Msg)
    {
        PGresult *res;
        const char* strsql="SELECT  name, title, state::character, create_time, update_time, description, node::character, overview, type, service_guid, catalog_guid FROM public.dmap_service where type='WMTS'";
        //char* conn_="hostaddr=172.26.60.100 port=5432 dbname=dmap_manager_test user=postgres password=chinadci";     
        //PGconn* pconn_=PQconnectdb(conn_);
        if(PQstatus(basepconn_)!=CONNECTION_OK)
        {
            std::string Msg= (std::string)PQerrorMessage(basepconn_);
            PQfinish(basepconn_);
            return false;
        }        
        res = PQexec(basepconn_,strsql);
        int tuple_num=PQntuples(res);
        if(tuple_num>0)
        {
            dmapService.name=PQgetvalue(res,0,0);
            dmapService.state=PQgetvalue(res,0,2);
            dmapService.create_time=PQgetvalue(res,0,3);
            dmapService.type=PQgetvalue(res,0,8);
            dmapService.service_guid=PQgetvalue(res,0,9);
        }  
        else
        {
            return false;
        }   
        PQclear(res);   
        return true; 
    }

    std::string DmpPgsqlUtils::StringToVendor(const std::string str)
    {
        std::string v="-1";
        if(str=="ESRI_V0")
        v="0";
        else if(str=="ESRI_V1")
        v="1";
        else if(str=="ESRI_V2")
        v="2";
        else if(str=="QGIS")
        v="3";
        else
        {}
        
        return v;
    }