/*
 * SPDX-FileCopyrightText: 2003 Copyright contributors to the cppTango project
 *
 * SPDX-License-Identifier: LGPL-3.0-or-later
 */

#include <tango/client/DbAttribute.h>

#include <tango/client/ApiUtil.h>
#include <tango/client/Database.h>
#include <tango/client/DbDatum.h>
#include <tango/common/defines.h>

#include <string>

using namespace CORBA;

namespace Tango
{

//-----------------------------------------------------------------------------
//
// DbAttribute::DbAttribute() - constructor to create a DbAttribute object for
//              accessing an attribute of this name in the specified
//              TANGO database (import/export info and properties)
//
//-----------------------------------------------------------------------------

DbAttribute::DbAttribute(const std::string &att_name, const std::string &dev_name, Database *att_dbase)
{
    name = att_name;
    device_name = dev_name;
    dbase = att_dbase;
    ext_dbase = true;
}

//-----------------------------------------------------------------------------
//
// DbAttribute::DbAttribute() - constructor to create a DbAttribute object for
//              accessing an attribute of this name without specifying
//              the TANGO database.
//
//-----------------------------------------------------------------------------

DbAttribute::DbAttribute(const std::string &att_name, const std::string &dev_name)
{
    name = att_name;
    device_name = dev_name;
    db_ind = ApiUtil::instance()->get_db_ind();
    ext_dbase = false;
}

//-----------------------------------------------------------------------------
//
// DbAttribute::DbAttribute() - constructor to create a DbAttribute object for
//              accessing an attribute of this name with specifying
//              the TANGO database via its server host and port
//
//-----------------------------------------------------------------------------

DbAttribute::DbAttribute(const std::string &att_name,
                         const std::string &dev_name,
                         const std::string &host,
                         const std::string &port_str)
{
    name = att_name;
    device_name = dev_name;

    TangoSys_MemStream s;
    int port_num;
    s << port_str << std::ends;
    s >> port_num;

    db_ind = ApiUtil::instance()->get_db_ind(host, port_num);
    ext_dbase = false;
}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//
// DbAttribute::~DbAttribute() - destructor to destroy a DbAttribute object
//
//-----------------------------------------------------------------------------

DbAttribute::~DbAttribute() { }

//-----------------------------------------------------------------------------
//
// DbAttribute::get_property() - public method to get attribute properties from the database
//
//-----------------------------------------------------------------------------

void DbAttribute::get_property(DbData &db_data)
{
    if(ext_dbase)
    {
        dbase->get_device_attribute_property(device_name, db_data);
    }
    else
    {
        ApiUtil *au = ApiUtil::instance();
        (au->get_db_vect())[db_ind]->get_device_attribute_property(device_name, db_data);
    }
}

//-----------------------------------------------------------------------------
//
// DbAttribute::put_property() - public method to put attribute properties from the database
//
//-----------------------------------------------------------------------------

void DbAttribute::put_property(const DbData &db_data)
{
    if(ext_dbase)
    {
        dbase->put_device_attribute_property(device_name, db_data);
    }
    else
    {
        ApiUtil *au = ApiUtil::instance();
        (au->get_db_vect())[db_ind]->put_device_attribute_property(device_name, db_data);
    }
}

//-----------------------------------------------------------------------------
//
// DbAttribute::delete_property() - public method to delete attribute properties from the database
//
//-----------------------------------------------------------------------------

void DbAttribute::delete_property(const DbData &db_data)
{
    if(ext_dbase)
    {
        dbase->delete_device_attribute_property(device_name, db_data);
    }
    else
    {
        ApiUtil *au = ApiUtil::instance();
        (au->get_db_vect())[db_ind]->delete_device_attribute_property(device_name, db_data);
    }
}

} // namespace Tango
