Back to index

PdbObjyApplication.cc

 
//----------------------------------------------------------------------------- 
//  $Header: /afs/rhic/phenix/PHENIX_CVS/offline/database/pdbcal/PdbObjyApplication.cc,v 1.7 2000/07/20 18:02:59 messer Exp $ 
// 
//  The pdbcal package 
//  Copyright (C) PHENIX collaboration, 1999 
// 
//  Implementation of class PdbObjyApplication 
// 
//  Author: Matthias Messer 
//----------------------------------------------------------------------------- 
#include "PdbObjyApplication.hh" 
#include "PdbNames.hh" 
#include <stdlib.h> 
 
PdbObjyApplication* PdbObjyApplication::_instance = 0; 
 
PdbObjyApplication::PdbObjyApplication()  
{ 
   char *bf = getenv("OO_FD_BOOT"); 
   if (bf) { 
      bootFileName = bf; 
   } 
   else { 
      cout << "PdbObjyApplication::PdbObjyApplication()" << endl; 
      cout << "\tError:" << endl; 
      cout << "\tEnvironment variable OO_FD_BOOT undefined" << endl; 
   } 
       
   ooInit(); 
   cout << "Application initialised:" << endl; 
   cout << "  boot-file : " << bootFileName << endl; 
 
   accessMode = oocNoOpen; 
} 
 
PdbObjyApplication::~PdbObjyApplication()  
{ 
   commit(); 
} 
 
PdbObjyApplication * PdbObjyApplication::instance() 
{ 
   if (!_instance) 
      _instance = new PdbObjyApplication; 
   return _instance; 
} 
 
PdbStatus PdbObjyApplication::startUpdate() 
{ 
   if (!transaction.isActive()) 
      transaction.start(); 
 
   if (fdbHandle.openMode() == oocRead) { 
     transaction.commit(); 
     transaction.start(); 
   } 
 
   if (fdbHandle.openMode() == oocNoOpen) { 
      if (fdbHandle.open(bootFileName.getString(), oocUpdate)) { 
	 accessMode = oocUpdate; 
      } 
      else { 
	 accessMode = oocNoOpen; 
	 return oocError; 
      } 
   } 
 
   return oocSuccess; 
} 
 
PdbStatus PdbObjyApplication::startRead() 
{ 
   if (!transaction.isActive()) 
      transaction.start(); 
 
   if (fdbHandle.openMode() == oocUpdate) 
     transaction.commitAndHold(oocDowngradeAll); 
 
   if (fdbHandle.openMode() == oocNoOpen) { 
      if (!fdbHandle.open(bootFileName.getString(), oocRead)) { 
	 accessMode = oocNoOpen; 
	 return oocError; 
      } 
   } 
 
   accessMode = oocRead; 
   return oocSuccess;    
} 
 
PdbStatus PdbObjyApplication::commit() 
{ 
   accessMode = oocNoOpen; 
   if (transaction.isActive()) 
      return transaction.commit(); 
   else 
      return oocSuccess; 
} 
 
PdbStatus PdbObjyApplication::abort() 
{ 
   accessMode = oocNoOpen; 
   if (transaction.isActive()) 
      return transaction.abort(); 
   else 
      return oocSuccess; 
} 
 
PdbStatus PdbObjyApplication::openForUpdate(ooHandle(ooObj) handle) 
{ 
   if (accessMode == oocUpdate) { 
      handle.open(oocUpdate); 
      return oocSuccess; 
   } 
   else { 
      return oocError; 
   }	   
} 
 
ooHandle(ooContObj) PdbObjyApplication::getTagContainerHandle(const char * bankName) 
{ 
   return getContainerHandle("tag", bankName); 
} 
 
ooHandle(ooContObj) PdbObjyApplication::getCalContainerHandle(const char * bankName) 
{ 
   return getContainerHandle("cal", bankName); 
} 
 
ooHandle(ooContObj) PdbObjyApplication::getContainerHandle(const PHString& type, const char * bankName) 
{ 
   // 
   // The namer provides all the sys and db names needed below. 
   // 
   PdbNames namer(bankName, bootFileName); 
 
   // 
   // Determine mode (tag or cal) 
   // 
   PHString dbSysName, dbFileName, contName; 
   if (type == "tag") { 
      dbSysName  = namer.getTagDbSysName(); 
      dbFileName = namer.getTagDbFileName(); 
      contName   = namer.getTagContainerName(); 
   } 
   else { 
      if (type == "cal") { 
	 dbSysName  = namer.getCalDbSysName(); 
	 dbFileName = namer.getCalDbFileName(); 
	 contName   = namer.getCalContainerName(); 
      } 
      else { 
	 cout << "PdbObjyApplication::getContainerHandle(): wrong type " << type << endl; 
	 return 0; 
      } 
   } 
    
   // 
   // Try to open the database, otherwise create a new one. 
   // 
   ooHandle(ooDBObj) dbHandle; 
   if (dbHandle.exist(fdbHandle, dbSysName.getString())) { 
      if (!(dbHandle.open(fdbHandle, dbSysName.getString(), accessMode))) { 
	 cout << "PdbObjyApplication::getContainerHandle()" << endl; 
	 cout << "\tError:" << endl; 
	 cout << "\tFailed to open database " << dbSysName.getString() << endl; 
	 return 0; 
      } 
   } 
   else { 
      if (!(dbHandle = new(fdbHandle) ooDBObj(dbSysName.getString(), 0, 0, lockServerHost.getString(), dbFileName.getString()))) { 
	 cout << "PdbObjyApplication::getContainerHandle()" << endl; 
	 cout << "\tError:" << endl; 
	 cout << "\tFailed to create database " << dbSysName.getString() << endl; 
	 return 0; 
      } 
   } 
 
   // 
   // Try to find the container in there, otherwise create a new one. 
   // 
   ooHandle(ooContObj) contHandle; 
   if (contHandle.exist(dbHandle, contName.getString())) { 
      if (!contHandle.open(dbHandle, contName.getString(), accessMode)) { 
	 cout << "PdbObjyApplication::getContainerHandle()" << endl; 
	 cout << "\tError:" << endl; 
	 cout << "\tFailed to open container " << contName.getString() << endl; 
	 return 0; 
      } 
   } 
   else { 
      if (!(contHandle = new(contName.getString(), 0, 0, 0, dbHandle) ooContObj())) { 
	 cout << "PdbObjyApplication::getContainerHandle()" << endl; 
	 cout << "\tError:" << endl; 
	 cout << "\tFailed to create container " << contName.getString() << endl; 
	 return 0; 
      } 
   } 
 
   return contHandle; 
} 
 
size_t PdbObjyApplication::getTagFileSize(const char * calibName) 
{ 
   ooHandle(ooContObj) contHandle = getTagContainerHandle(calibName); 
   return fdbHandle.pageSize() * contHandle.nPage(); 
} 
 
size_t PdbObjyApplication::getCalFileSize(const char * calibName) 
{ 
   ooHandle(ooContObj) contHandle = getCalContainerHandle(calibName); 
   return fdbHandle.pageSize() * contHandle.nPage(); 
} 

Back to index