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