Back to index

PdbObjyBankManager.cc

 
// The creator and fetcher of Objectivity calibration banks.   // 
 
// The class name PdbObjyBankManager should also not appear          // 
// in user code, it should be referenced by a pointer to       // 
// the parent class PdbBanks.                                  // 
 
// During the creation/fetching of the banks many checks       // 
// are made:                                                   // 
// * does the user have permission to create the bank.         // 
// * which database (file) to put the information.             // 
// * check the open mode of the database                       // 
// * "stamp"/check if the object has been created via          // 
//   PdbObjyBankManager.                                             // 
 
// Most of this functionality is not yet implemented....       // 
 
// Author: Mark Pollack                                        // 
 
#include <iostream.h> 
#include "Pdb.hh" 
#include "PdbObjyBankManager.hh" 
#include "PdbObjyBankWrapper.hh" 
#include "PdbClassMap.hh" 
#include "PdbObjyApplication.hh" 
#include "PdbObjyCalBank.h" 
#include "PdbBankID.hh" 
#include "PdbObjyCalHeader.h" 
#include "PdbBankList.hh" 
#include "PHString.h" 
#include "PHPointerList.h" 
 
PdbObjyBankManager* PdbObjyBankManager::_instance = 0; 
 
PdbObjyBankManager* PdbObjyBankManager::instance() 
{ 
  if (_instance == 0) { 
    _instance = new PdbObjyBankManager(); 
  } 
  return _instance; 
} 
 
PdbObjyBankManager::PdbObjyBankManager() 
{ 
} 
 
PdbObjyBankManager::~PdbObjyBankManager() 
{ 
} 
 
PdbCalBank* PdbObjyBankManager::createBank(const char *className, PdbBankID bankID, const char *description,  
					   PHTimeStamp &startValTime, PHTimeStamp &endValTime, const char *bankName) 
{ 
   // 
   // Create a persistent bank of type classname.  The class name is the 
   // "generic name" for the class. For example PdbADCBank.  The string 
   // is created to transform this into something like PdbObjyADCBank. 
   // 
   // The derived class name (PdbObjyADCBank) needs to have been 
   // registered by being listed in the STL map classmap.  The database 
   // and name is derived from bankName. 
   // 
   // The container is selected by the application singleton. 
   // It is the TLA for the detector system followed by "Container". 
   // For example, emcContainer.  
   // 
 
   PHString realName = getRealName(className); 
    
   PdbObjyApplication *application         = PdbObjyApplication::instance(); 
   ooHandle(ooContObj) tagContHandle       = application->getTagContainerHandle(bankName); 
   ooHandle(ooContObj) calContHandle       = application->getCalContainerHandle(bankName); 
   ooHandle(PdbObjyCalHeader) headerHandle = new(tagContHandle) PdbObjyCalHeader(bankID, description, startValTime, endValTime); 
    
   PdbClassMap<PdbObjyCalBank> *classMap = PdbClassMap<PdbObjyCalBank>::instance(); 
   if (classMap->find(realName.getString()) != classMap->end()) { 
      ooHandle(PdbObjyCalBank) bankHandle = (*classMap)[realName.getString()]->clone(calContHandle); 
      headerHandle->setBank(bankHandle); 
      return new PdbObjyBankWrapper(headerHandle); 
   } else { 
      cout << "PdbObjyBankManager::createBank(...)" << endl; 
      cout << "\tWARNING" << endl; 
      cout << "\tCould not find realname = " << realName << "in classMap" << endl; 
      return 0; 
   } 
} 
 
PdbCalBank* PdbObjyBankManager::fetchBank(const char *className, PdbBankID bankID, const char *bankName, PHTimeStamp &searchTime) 
{ 
 
   PHString realName = getRealName(className); 
    
   PdbObjyApplication *application         = PdbObjyApplication::instance(); 
   ooHandle(ooContObj) tagContHandle       = application->getTagContainerHandle(bankName); 
 
   ooItr(PdbObjyCalHeader) headerIter; 
    
   int foundBank = 0; 
   headerIter.scan(tagContHandle); 
   ooHandle(PdbObjyCalHeader) foundHeaderHandle, mostRecentHeaderHandle; 
    
   // 
   // Search the complete database for a bank with matching validity range. 
   // In case of ambiguities the most recently inserted is selected. 
   // 
   while(headerIter.next()){ 
      foundHeaderHandle = headerIter; 
   	if (foundHeaderHandle->getBankID()       == bankID     && 
	    foundHeaderHandle->getStartValTime() <= searchTime && 
	    foundHeaderHandle->getEndValTime()   >  searchTime) { 
   	   if (!foundBank) 
   	      mostRecentHeaderHandle = foundHeaderHandle; 
   	   foundBank = 1; 
   	   if( foundHeaderHandle->getInsertTime() > mostRecentHeaderHandle->getInsertTime()) { 
   	      mostRecentHeaderHandle = foundHeaderHandle; 
   	   } 
   	} 
   } 
 
   if (foundBank) { 
      return new PdbObjyBankWrapper(mostRecentHeaderHandle); 
   } 
   else { 
      return 0; 
   } 
    
} 
 
void PdbObjyBankManager::fetchAllBanks(PdbBankList & bankList, const char *className, PdbBankID bankID, const char *bankName, PHTimeStamp &searchTime) 
{ 
 
   PHString realName = getRealName(className); 
    
   PdbObjyApplication *application         = PdbObjyApplication::instance(); 
   ooHandle(ooContObj) tagContHandle       = application->getTagContainerHandle(bankName); 
 
   ooItr(PdbObjyCalHeader) headerIter; 
    
   headerIter.scan(tagContHandle); 
   ooHandle(PdbObjyCalHeader) foundHeaderHandle; 
 
   // 
   // Search the complete database for a bank with matching validity range. 
   // All found banks are put into the bankList. 
   // 
   while(headerIter.next()){ 
      foundHeaderHandle = headerIter; 
   	if (foundHeaderHandle->getBankID()       == bankID     && 
	    foundHeaderHandle->getStartValTime() <= searchTime && 
	    foundHeaderHandle->getEndValTime()   >= searchTime) { 
	   bankList.append(new PdbObjyBankWrapper(foundHeaderHandle)); 
   	} 
   } 
} 
 
void PdbObjyBankManager::fetchAllBanks(PdbBankList & bankList, const char *className, const char *bankName, PHTimeStamp &searchTime) 
{ 
 
   PHString realName = getRealName(className); 
    
   PdbObjyApplication *application         = PdbObjyApplication::instance(); 
   ooHandle(ooContObj) tagContHandle       = application->getTagContainerHandle(bankName); 
 
   ooItr(PdbObjyCalHeader) headerIter; 
    
   headerIter.scan(tagContHandle); 
   ooHandle(PdbObjyCalHeader) foundHeaderHandle; 
 
   // 
   // Search the complete database for a bank with matching validity range. 
   // All found banks are put into the bankList. 
   // 
   while(headerIter.next()){ 
      foundHeaderHandle = headerIter; 
   	if (foundHeaderHandle->getStartValTime() <= searchTime && 
	    foundHeaderHandle->getEndValTime()   >= searchTime) { 
	   bankList.append(new PdbObjyBankWrapper(foundHeaderHandle)); 
   	} 
   } 
} 
 
PdbApplication*  PdbObjyBankManager::getApplication() 
{ 
  return PdbObjyApplication::instance(); 
} 
 
PHString PdbObjyBankManager::getRealName(const PHString & searchName) 
{ 
   PHPointerList<PHString> subStrings; 
   searchName.split(subStrings, "Pdb"); 
   PHString *strippedName; 
   PHString realName("noName"); 
   if (!(strippedName = subStrings[1])) { 
      cout << "PdbObjyBankManager::getRealName()" << endl; 
      cout << "\tError" << endl; 
      cout << "\tCould not parse name " << searchName << endl; 
   } 
   else { 
      realName = "PdbObjy" + *strippedName; 
   } 
   return realName; 
} 
 
 
 
 
 

Back to index