#include "BeamMonCuts.h"

#include <DatabaseInterface/DbiResultSet.h>
#include <DatabaseInterface/DbiOutRowStream.h>
#include "Registry/Registry.h"

#include <sstream>

#include <MessageService/MsgService.h>
CVSID("$Id: BeamMonCuts.cxx,v 1.2 2006/11/22 20:28:23 mdier Exp $");


#include <DatabaseInterface/DbiResultPtr.tpl>
template class  DbiResultPtr<BeamMonCuts>;


BeamMonCuts::BeamMonCuts(const string& cutValues)
    : fCutValues(cutValues)
{}

BeamMonCuts::BeamMonCuts(const Registry* reg)
{
    if (reg) this->SetCutValues(reg);
}


BeamMonCuts::~BeamMonCuts()
{}

DbiTableRow* BeamMonCuts::CreateTableRow() const
{
    return new BeamMonCuts;
}

void BeamMonCuts::Fill(DbiResultSet& rs, const DbiValidityRec* /*vrec*/)
{
    rs >> fCutValues;
}

void BeamMonCuts::Store(DbiOutRowStream& ors, const DbiValidityRec* /*vrec*/) const
{
    ors << fCutValues;
}

void BeamMonCuts::FillRegistry(Registry* reg) const
{
    // Do nothing if pointer to registry is 0
    if (!reg) return;

    // Record the current state of reg and then clear it
    Bool_t keysLocked = reg->KeysLocked();
    Bool_t valuesLocked = reg->ValuesLocked();
    reg->UnLockKeys();
    reg->UnLockValues();
    reg->Clear();

    // use the owned BeamMonCuts to fill reg
    std::istringstream is(fCutValues);
    reg->ReadStream(is);

    if ( keysLocked   ) reg->LockKeys();
    if ( valuesLocked ) reg->LockValues();

}

void BeamMonCuts::SetCutValues(const Registry* reg)
{
    if (!reg){
        MAXMSG("BeamMonCuts",Msg::kError,20) << "No valid registry to use!" << endl;
        return;
    }

    std::ostringstream os;
    reg->PrintStream(os);
    fCutValues = os.str();              
}


ClassImp(BeamMonCuts)
