Skip to content
DBManager.cpp 5.28 KiB
Newer Older
#include <DBManager.h>

#include <ctime>

#include <boost/date_time.hpp>

#include <soci/mysql/soci-mysql.h>

namespace DataImporter_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;

    m_deviceName = deviceImpl_p->get_name_lower();

    m_session_sp.reset(new soci::session);

    m_tangoDB_sp.reset(new Tango::Database);
}

//==============================================================================
//      DBManager::DBManager()
//==============================================================================
DBManager::~DBManager()
{
    DEBUG_STREAM << "DBManager::~DBManager()" << endl;

    m_session_sp->close();
}

//==============================================================================
//      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_connectionMutex);

    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 << "MAIN CONNECTION: " << connection.str() << endl;
    #endif

    m_session_sp->open(soci::mysql, connection.str());
}

//==============================================================================
//      DBManager::disconnect()
//==============================================================================
void DBManager::disconnect()
{
    DEBUG_STREAM << "DBManager::disconnect()" << endl;

    boost::mutex::scoped_lock lock(m_connectionMutex);

    m_session_sp->close();
}

//==============================================================================
//      DBManager::retrieveLastTimestamp()
//==============================================================================
std::tm DBManager::retrieveLastTimestamp() throw(soci::soci_error)
{
    DEBUG_STREAM << "DBManager::retrieveLastTimestamp()" << endl;

    boost::mutex::scoped_lock lock(m_connectionMutex);

//    if(m_auxSession_sp->get_backend() == NULL)
//        m_auxSession_sp->reconnect();
//
//    std::tm lastTimestamp;
//
//    *m_auxSession_sp << "select coalesce(max(update_time),'1970-01-01 00:00:00') "
//        << "from " << m_configuration_sp->getDIDBSchema() << "."
//        << m_configuration_sp->getDIDBIndexTable(), soci::into(lastTimestamp);
//
//    return lastTimestamp;
}

//==============================================================================
//      DBManager::persistLastTimestamp()
//==============================================================================
void DBManager::persistLastTimestamp(std::tm lastTimestamp) throw(soci::soci_error)
{
    DEBUG_STREAM << "DBManager::persistLastTimestamp()" << endl;

    boost::mutex::scoped_lock lock(m_connectionMutex);

//    if(m_auxSession_sp->get_backend() == NULL)
//        m_auxSession_sp->reconnect();
//
//    *m_auxSession_sp << "insert into " << m_configuration_sp->getDIDBSchema()
//        << "." << m_configuration_sp->getDIDBIndexTable()
//        << " values(:lastTimestamp)", soci::use(lastTimestamp, "lastTimestamp");
}

//==============================================================================
//      DBManager::retrieveNewTuples()
//==============================================================================
DBManager::RowsetSP DBManager::retrieveNewTuples(std::tm lastTimestamp)
    throw(soci::soci_error, std::out_of_range)
{
    DEBUG_STREAM << "DBManager::retrieveNewTuples()" << endl;

    boost::mutex::scoped_lock lock(m_connectionMutex);

    if(m_session_sp->get_backend() == NULL)
        m_session_sp->reconnect();

    boost::posix_time::ptime timestamp = boost::posix_time::ptime_from_tm(lastTimestamp);

//    RowsetSP rows(new soci::rowset<soci::row>(m_mainSession_sp->prepare
//        << "select id, file_path, file_version, file_name, update_time from "
//        << m_configuration_sp->getDatabaseSchema() << "."
//        << m_configuration_sp->getDatabaseTable()
//        << " where update_time>'"
//        << boost::posix_time::to_iso_string(timestamp)
//        << "' order by update_time asc"));

    //return rows;
}

//==============================================================================
//      DBManager::retrieveNewTuples()
//==============================================================================