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;
}