+ check cached connection status before returning.

if PQstatus(conn) == CONNECTION_BAD attempt to
  create a new one
+ expose "conect_timeout" PG connection parameter
  default to 4 sec
+ throw mapnik::datasource exception if connection
  is 'bad' in mapnik::features(..)
This commit is contained in:
Artem Pavlenko 2010-07-02 11:42:35 +00:00
parent 15896b8ba9
commit aa0e17afd1
4 changed files with 31 additions and 12 deletions

View file

@ -105,11 +105,21 @@ public:
#ifdef MAPNIK_DEBUG
std::clog<<"borrow "<<(*itr).get()<<"\n";
#endif
usedPool_.push_back(*itr);
itr=unusedPool_.erase(itr);
return usedPool_[usedPool_.size()-1];
if ((*itr)->isOK())
{
usedPool_.push_back(*itr);
unusedPool_.erase(itr);
return usedPool_[usedPool_.size()-1];
}
else
{
#ifdef MAPNIK_DEBUG
std::clog<<"bad connection (erase)" << (*itr).get()<<"\n";
#endif
unusedPool_.erase(itr);
}
}
else if (unusedPool_.size() < maxSize_)
if (unusedPool_.size() < maxSize_)
{
HolderType conn(creator_());
if (conn->isOK())

View file

@ -51,12 +51,14 @@ public:
boost::optional<string> const& port,
boost::optional<string> const& dbname,
boost::optional<string> const& user,
boost::optional<string> const& pass)
boost::optional<string> const& pass,
boost::optional<string> const& connect_timeout)
: host_(host),
port_(port),
dbname_(dbname),
user_(user),
pass_(pass) {}
pass_(pass),
connect_timeout_(connect_timeout) {}
T* operator()() const
{
@ -76,7 +78,8 @@ public:
if (dbname_ && (*dbname_).size()) connect_str += " dbname=" + *dbname_;
if (user_ && (*user_).size()) connect_str += " user=" + *user_;
if (pass_ && (*pass_).size()) connect_str += " password=" + *pass_;
connect_str += " connect_timeout=4"; // todo: set by client (param)
if (connect_timeout_ && (*connect_timeout_).size())
connect_str +="connect_timeout=" + *connect_timeout_;
return connect_str;
}
@ -86,7 +89,7 @@ private:
boost::optional<string> dbname_;
boost::optional<string> user_;
boost::optional<string> pass_;
boost::optional<string> connect_timeout_;
};
class ConnectionManager : public singleton <ConnectionManager,CreateStatic>

View file

@ -79,7 +79,8 @@ postgis_datasource::postgis_datasource(parameters const& params)
params.get<std::string>("port"),
params.get<std::string>("dbname"),
params.get<std::string>("user"),
params.get<std::string>("password")),
params.get<std::string>("password"),
params.get<std::string>("connect_timeout","4")),
bbox_token_("!bbox!"),
scale_denom_token_("!scale_denominator!"),
persist_connection_(*params_.get<mapnik::boolean>("persist_connection",true)),
@ -490,6 +491,10 @@ featureset_ptr postgis_datasource::features(const query& q) const
boost::shared_ptr<IResultSet> rs = get_resultset(conn, s.str());
return featureset_ptr(new postgis_featureset(rs,desc_.get_encoding(),multiple_geometries_,props.size()));
}
else
{
throw mapnik::datasource_exception("bad connection");
}
}
return featureset_ptr();
}

View file

@ -83,14 +83,15 @@ int main ( int argc, char** argv)
boost::optional<std::string> dbname;
boost::optional<std::string> user;
boost::optional<std::string> password;
boost::optional<std::string> connect_timeout("4");
if (vm.count("host")) host = vm["host"].as<std::string>();
if (vm.count("port")) port = vm["port"].as<std::string>();
if (vm.count("dbname")) dbname = vm["dbname"].as<std::string>();
if (vm.count("user")) user = vm["user"].as<std::string>();
if (vm.count("password")) password = vm["password"].as<std::string>();
ConnectionCreator<Connection> creator(host,port,dbname,user,password);
ConnectionCreator<Connection> creator(host,port,dbname,user,password,connect_timeout);
try
{
boost::shared_ptr<Connection> conn(creator());