/***************************************************************************** * * This file is part of Mapnik (c++ mapping toolkit) * * Copyright (C) 2006 Artem Pavlenko * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *****************************************************************************/ //$Id: datasource_cache.cpp 23 2005-03-22 22:16:34Z pavlenko $ // mapnik #include #include // boost #include #include #include // ltdl #include // stl #include #include namespace mapnik { using namespace std; using namespace boost; bool is_input_plugin (std::string const& filename) { return boost::algorithm::ends_with(filename,std::string(".input")); } datasource_cache::datasource_cache() { if (lt_dlinit()) throw std::runtime_error("lt_dlinit() failed"); } datasource_cache::~datasource_cache() { lt_dlexit(); } std::map > datasource_cache::plugins_; bool datasource_cache::registered_=false; datasource_ptr datasource_cache::create(const parameters& params) { boost::optional type = params.get("type"); if ( ! type) { throw config_error(string("Could not create datasource. Required ") + "parameter 'type' is missing"); } datasource_ptr ds; map >::iterator itr=plugins_.find(*type); if ( itr == plugins_.end() ) { throw config_error(string("Could not create datasource. No plugin ") + "found for type '" + * type + "'"); } if ( ! itr->second->handle()) { throw std::runtime_error(string("Cannot load library: ") + lt_dlerror()); } create_ds* create_datasource = (create_ds*) lt_dlsym(itr->second->handle(), "create"); if ( ! create_datasource) { throw std::runtime_error(string("Cannot load symbols: ") + lt_dlerror()); } #ifdef MAPNIK_DEBUG std::clog << "size = " << params.size() << "\n"; parameters::const_iterator i = params.begin(); for (;i!=params.end();++i) { std::clog << i->first << "=" << i->second << "\n"; } #endif ds=datasource_ptr(create_datasource(params), datasource_deleter()); #ifdef MAPNIK_DEBUG std::clog<<"datasource="<