//*-- AUTHOR : Ilse Koenig //*-- Created : 26/11/2004 ////////////////////////////////////////////////////////////////////////////// // FairDetParOraIo // // Base class for all detector I/O classes from database Oracle // (uses the Oracle C/C++ precompiler) // ////////////////////////////////////////////////////////////////////////////// using namespace std; #include "FairOraConn.h" #include "FairDetParOraIo.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "FairRtdbRun.h" #include "FairParSet.h" #include "TClass.h" #include #include #define SQLCA_STORAGE_CLASS extern #define ORACA_STORAGE_CLASS extern // Oracle communication area #include // Include the SQL Communications Area #include ClassImp(FairDetParOraIo) ClassImp(FairParOraSet) FairParOraSet::FairParOraSet(const char* pName) { SetName(pName); contextId=-1; clearVersDate(); } void FairParOraSet::clearVersDate() { versDate[0]=-1; versDate[1]=1.E+12; } FairDetParOraIo::FairDetParOraIo(FairOraConn* pC) : FairDetParIo() { // constructor gets a pointer to the connection class pConn=pC; actContVers=0; actRunId=-1; containerList=0; } FairDetParOraIo::~FairDetParOraIo(void) { // destructor if (containerList) { containerList->Delete(); delete containerList; containerList=0; } } void FairDetParOraIo::commit(void) { // commits all changes EXEC SQL COMMIT WORK; cout<<"Transaction committed"<GetRuntimeDb()->getCurrentRun(); if (!actContVers) { Error("getRunStart()","current run not set in runtime database"); return -1; } const Text_t* refRun=actContVers->getRefRun(); if (strlen(refRun)>0) sscanf(refRun,"%i",&actRunId); else actRunId=actContVers->getRunId(); if (pPar) { Int_t contVers=getPredefVersion(pPar); if (contVers>=0) actRunId=contVers; } runStart=pConn->getRunStart(actRunId); return runStart; } const char* FairDetParOraIo::getHistoryDate() { // returns the timestamp set by the user to read historic data return pConn->getHistoryDate(); } Int_t FairDetParOraIo::getPredefVersion(FairParSet* pPar) { // finds out if a version for the parameter container has been set by // the user (typically by defining a reference run for initialisation // in the macro // returns -1, if no version found FairParVersion* pv=(FairParVersion*)actContVers->getParVersion((char*)pPar->GetName()); if (pv) return pv->getInputVersion(inputNumber); else return -1; } FairParOraSet* FairDetParOraIo::getOraSet(FairParSet* pPar) { if (!containerList) containerList=new TList; FairParOraSet* pSet=(FairParOraSet*)(containerList->FindObject(pPar->GetName())); if (!pSet) { pSet=new FairParOraSet(pPar->GetName()); pSet->contextId=getContextId(pPar->IsA()->GetName(),pPar->getParamContext()); containerList->Add(pSet); } return pSet; } Int_t FairDetParOraIo::getContextId(const char* className, const char* paramContext) { // return the parameter_context_id if (strlen(paramContext)==0) return -1; EXEC SQL BEGIN DECLARE SECTION; char* p_class; char* p_context; int context_id=-1; EXEC SQL END DECLARE SECTION; p_class=(char*)className; p_context=(char*)paramContext; EXEC SQL WHENEVER SQLERROR GOTO not_found; EXEC SQL WHENEVER NOT FOUND GOTO not_found; EXEC SQL SELECT context_id INTO :context_id FROM hanal.all_parameter_contexts WHERE class = :p_class and context = :p_context; // cout<<"Id of context "<setChanged(); pPar->setInputVersion(getActRunId(),inputNumber); TString s="Read from Oracle\n Valid for Run Id "; s.Append(Form("%d",getActRunId())); s.Append("\n Status at "); s.Append(pConn->getHistoryDate()); pPar->setDescription(s.Data()); }