dmppgsqlutils.cpp 11.3 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;
    }