// Connector // // Douglas Thrift // // $Id$ #include #include #include #include #include #include "Connector.hpp" Connector::Connector(const cse::String& configuration) : running(true), cleanup(hop::BindAll(&Connector::Cleanup, this)) { _R document(xml::Parse(configuration)); _R configuration_(*document/"configuration"); driver = dbi::GetDriver(*configuration_/"driver"); host = *configuration_/"host"; user = *configuration_/"user"; password = *configuration_/"password"; database = *configuration_/"database"; } _R Connector::Connect() { _R connection; _synchronized (connectionsLock) if (!connections.Pop(connection)) connection = driver->Connect(host, user, password, database); return connection; } void Connector::Release(const _R& connection) { _synchronized (connectionsLock) connections.Push(connection); } int Connector::Cleanup() { while (running) { ::timespec sleep = { 60, 0 }, remaining; while (running && ::nanosleep(&sleep, &remaining) == -1) sleep = remaining; _synchronized (connectionsLock) connections.Clear(); } return 0; }