Skip to content
Snippets Groups Projects
Select Git revision
  • 2b26ffdbe3b15cbaeb64cf6eb7dc23361526ca7a
  • main default protected
  • s3_dev
  • s2_dev
  • nuovo_branch2
  • nuovo_branch
  • dario.delmoro-main-patch-65693
  • dario.delmoro-main-patch-95280
  • edit1
9 results

index.rst

Blame
  • DBManager.cpp 4.71 KiB
    #include <DBManager.h>
    
    #include <soci/mysql/soci-mysql.h>
    #include <soci/use.h>
    
    namespace MetadataExporter_ns
    {
    
    //==============================================================================
    //      DBManager::DBManager()
    //==============================================================================
    DBManager::DBManager(Tango::DeviceImpl* deviceImpl_p,
        Configuration::SP configuration_sp) : Tango::LogAdapter(deviceImpl_p),
        m_configuration_sp(configuration_sp)
    {
        DEBUG_STREAM << "DBManager::DBManager()" << endl;
    
        unsigned int connectionNumber = m_configuration_sp->getDatabaseConnectionNumber();
    
        m_connectionPool_sp.reset(new soci::connection_pool(connectionNumber));
    }
    
    //==============================================================================
    //      DBManager::DBManager()
    //==============================================================================
    DBManager::~DBManager()
    {
        DEBUG_STREAM << "DBManager::~DBManager()" << endl;
    }
    
    //==============================================================================
    //      DBManager::DBManager()
    //==============================================================================
    DBManager::SP DBManager::create(Tango::DeviceImpl* deviceImpl_p,
        Configuration::SP configuration_sp)
    {
        DBManager::SP d_sp(new DBManager(deviceImpl_p, configuration_sp),
            DBManager::Deleter());
    
        return d_sp;
    }
    
    //==============================================================================
    //      DBManager::connect()
    //==============================================================================
    void DBManager::connect() throw(soci::soci_error)
    {
        DEBUG_STREAM << "DBManager::connect()" << endl;
    
        boost::mutex::scoped_lock lock(m_connectionPoolMutex);
    
        std::stringstream connection;
        connection << " host=" << m_configuration_sp->getDatabaseHost();
        connection << " port=" << m_configuration_sp->getDatabasePort();
        connection << " user=" << m_configuration_sp->getDatabaseUsername();
        connection << " password=" << m_configuration_sp->getDatabasePassword();
    
        #ifdef VERBOSE_DEBUG
            INFO_STREAM << "CONNECTION: " << connection.str() << endl;
        #endif
    
        unsigned int connectionNumber = m_configuration_sp->getDatabaseConnectionNumber();
    
        for(unsigned int i=0; i<connectionNumber; ++i)
        {
            m_connectionPool_sp->at(i).open(soci::mysql, connection.str());
        }
    }
    
    //==============================================================================
    //      DBManager::disconnect()
    //==============================================================================
    void DBManager::disconnect()
    {
        DEBUG_STREAM << "DBManager::disconnect()" << endl;
    
        boost::mutex::scoped_lock lock(m_connectionPoolMutex);
    
        unsigned int connectionNumber = m_configuration_sp->getDatabaseConnectionNumber();
    
        for(unsigned int i=0; i<connectionNumber; ++i)
        {
            m_connectionPool_sp->at(i).close();
        }
    }
    
    //==============================================================================
    //      DBManager::retrieveInformation()
    //==============================================================================
    DBManager::InformationList DBManager::retrieveInformation(std::string schema,
        std::string table) throw(soci::soci_error)
    {
        DEBUG_STREAM << "DBManager::retrieveInformation()" << endl;
    
        soci::session session(*m_connectionPool_sp);
    
        soci::rowset<InformationTuple> rows = (session.prepare << "select "
            "column_name, column_type, is_nullable from information_schema.columns "
            "where table_schema like :schema and table_name like :table",
            soci::use(schema, "schema"), soci::use(table, "table"));
    
        InformationList informationList;
    
        std::copy(rows.begin(), rows.end(), std::back_inserter(informationList));
    
        if(informationList.empty())
        {
            std::stringstream errorStream;
            errorStream << schema << "." << table << " not exists";
            throw soci::soci_error(errorStream.str());
        }
    
        return informationList;
    }
    
    //==============================================================================
    //      DBManager::retrieveNewTuples()
    //==============================================================================
    soci::rowset<soci::row> DBManager::retrieveNewTuples(std::string schema,
        std::string table, std::tm update_time) throw(soci::soci_error)
    {
        DEBUG_STREAM << "DBManager::retrieveNewTuples()" << endl;
    
        soci::session session(*m_connectionPool_sp);
    
        soci::rowset<soci::row> rows = (session.prepare << "select * from "
            << schema << "." << table << " where update_time>=:timestamp",
            soci::use(update_time,"timestamp"));
    
        MetadataList metadataList;
    
        std::copy(rows.begin(), rows.end(), std::back_inserter(metadataList));
    
        return metadataList;
    }
    
    }   //namespace