split up code that handles datasource plugin registration

This commit is contained in:
Dane Springmeyer 2012-06-13 19:25:59 -04:00
parent 5df056ae4c
commit d33496baa7
2 changed files with 51 additions and 43 deletions

View file

@ -54,7 +54,8 @@ private:
public: public:
static std::vector<std::string> plugin_names(); static std::vector<std::string> plugin_names();
static std::string plugin_directories(); static std::string plugin_directories();
static void register_datasources(const std::string& path); static void register_datasources(std::string const& path);
static bool register_datasource(std::string const& path);
static boost::shared_ptr<datasource> create(parameters const& params, bool bind=true); static boost::shared_ptr<datasource> create(parameters const& params, bool bind=true);
}; };
} }

View file

@ -118,7 +118,7 @@ datasource_ptr datasource_cache::create(const parameters& params, bool bind)
return ds; return ds;
} }
bool datasource_cache::insert(const std::string& type,const lt_dlhandle module) bool datasource_cache::insert(std::string const& type,const lt_dlhandle module)
{ {
return plugins_.insert(make_pair(type,boost::make_shared<PluginInfo> return plugins_.insert(make_pair(type,boost::make_shared<PluginInfo>
(type,module))).second; (type,module))).second;
@ -140,7 +140,7 @@ std::vector<std::string> datasource_cache::plugin_names ()
return names; return names;
} }
void datasource_cache::register_datasources(const std::string& str) void datasource_cache::register_datasources(std::string const& str)
{ {
#ifdef MAPNIK_THREADSAFE #ifdef MAPNIK_THREADSAFE
mutex::scoped_lock lock(mapnik::singleton<mapnik::datasource_cache, mutex::scoped_lock lock(mapnik::singleton<mapnik::datasource_cache,
@ -162,13 +162,25 @@ void datasource_cache::register_datasources(const std::string& str)
if (!is_directory( *itr ) && is_input_plugin(itr->path().leaf())) if (!is_directory( *itr ) && is_input_plugin(itr->path().leaf()))
#endif #endif
{ {
#if (BOOST_FILESYSTEM_VERSION == 3)
if (register_datasource(itr->path().string().c_str()))
#else // v2
if (register_datasource(itr->string().c_str()))
#endif
{
registered_ = true;
}
}
}
}
}
bool datasource_cache::register_datasource(std::string const& str)
{
bool success = false;
try try
{ {
#if (BOOST_FILESYSTEM_VERSION == 3) lt_dlhandle module = lt_dlopen(str.c_str());
lt_dlhandle module = lt_dlopen(itr->path().string().c_str());
#else // v2
lt_dlhandle module = lt_dlopen(itr->string().c_str());
#endif
if (module) if (module)
{ {
// http://www.mr-edd.co.uk/blog/supressing_gcc_warnings // http://www.mr-edd.co.uk/blog/supressing_gcc_warnings
@ -181,32 +193,27 @@ void datasource_cache::register_datasources(const std::string& str)
{ {
MAPNIK_LOG_DEBUG(datasource_cache) << "datasource_cache: Registered=" << ds_name(); MAPNIK_LOG_DEBUG(datasource_cache) << "datasource_cache: Registered=" << ds_name();
registered_=true; success = true;
} }
else if (!ds_name) else if (!ds_name)
{ {
MAPNIK_LOG_ERROR(datasource_cache) MAPNIK_LOG_ERROR(datasource_cache)
<< "Problem loading plugin library '" << "Problem loading plugin library '"
<< itr->path().string() << "' (plugin is lacking compatible interface)"; << str << "' (plugin is lacking compatible interface)";
} }
} }
else else
{ {
#if (BOOST_FILESYSTEM_VERSION == 3)
MAPNIK_LOG_ERROR(datasource_cache) MAPNIK_LOG_ERROR(datasource_cache)
<< "Problem loading plugin library: " << itr->path().string() << "Problem loading plugin library: " << str
<< " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)"; << " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)";
#else // v2 }
}
catch (...) {
MAPNIK_LOG_ERROR(datasource_cache) MAPNIK_LOG_ERROR(datasource_cache)
<< "Problem loading plugin library: " << itr->string() << "Exception caught while loading plugin library: " << str;
<< " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)";
#endif
}
}
catch (...) {}
}
}
} }
return success;
} }
} }