/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
*/
// This is -*- C++ -*-
/*****************************************************************************
*
*
* PURPOSE:
* code common to all database interface implementations
*
*
* COMMENTS:
* uses embedded SQL
*
*****************************************************************************/
#include
#include "oidif.hh"
#include "adminif.hh"
#include "databaseif.hh"
#include
#include "externs.h"
#include "sqlerror.hh"
#include "raslib/error.hh"
#include "raslib/rmdebug.hh"
#ifdef RMANBENCHMARK
RMTimer
OId::oidAlloc("OId","allocateOId");
#endif
#ifdef RMANBENCHMARK
RMTimer
OId::oidResolve("OId","resolveOId");
#endif
double OId::ID_MULTIPLIER = 512;
OId::OIdCounter OId::nextMDDOID = 0;
OId::OIdCounter OId::nextMDDCOLLOID = 0;
OId::OIdCounter OId::nextMDDTYPEOID = 0;
OId::OIdCounter OId::nextMDDBASETYPEOID = 0;
OId::OIdCounter OId::nextMDDDIMTYPEOID = 0;
OId::OIdCounter OId::nextMDDDOMTYPEOID = 0;
OId::OIdCounter OId::nextSTRUCTTYPEOID = 0;
OId::OIdCounter OId::nextSETTYPEOID = 0;
OId::OIdCounter OId::nextBLOBOID = 0;
OId::OIdCounter OId::nextDBMINTERVALOID = 0;
OId::OIdCounter OId::nextSTORAGEOID = 0;
OId::OIdCounter OId::nextMDDHIERIXOID = 0;
OId::OIdCounter OId::nextATOMICTYPEOID = 0;
OId::OIdCounter OId::nextMDDRCIXOID = 0;
OId::OIdCounter OId::nextUDFOID = 0;
OId::OIdCounter OId::nextUDFPACKAGEOID = 0;
unsigned int
OId::maxCounter = 20;
const char*
OId::counterNames[] = { "INVALID",
"MDDOID",
"MDDCOLLOID",
"MDDTYPEOID",
"MDDBASETYPEOID",
"MDDDIMTYPEOID",
"MDDDOMTYPEOID",
"STRUCTTYPEOID",
"SETTYPEOID",
"BLOBOID",
"DBMINTERVALOID",
"STORAGEOID",
"MDDHIERIXOID",
"INLINEINDEXOID",
"INLINETILEOID",
"INNEROID",
"ATOMICTYPEOID",
"UDFOID",
"UDFPACKAGEOID",
"MDDRCIXOID"
};
OId::OIdCounter*
OId::counterIds[] = {
NULL,
&nextMDDOID,
&nextMDDCOLLOID,
&nextMDDTYPEOID,
&nextMDDBASETYPEOID,
&nextMDDDIMTYPEOID,
&nextMDDDOMTYPEOID,
&nextSTRUCTTYPEOID,
&nextSETTYPEOID,
&nextBLOBOID,
&nextDBMINTERVALOID,
&nextSTORAGEOID,
&nextMDDHIERIXOID,
&nextMDDHIERIXOID,
&nextBLOBOID,
&nextBLOBOID,
&nextATOMICTYPEOID,
&nextUDFOID,
&nextUDFPACKAGEOID,
&nextMDDRCIXOID
};
bool OId::loadedOk = false;
void
OId::allocateOId(OId& id, OIdType type, OIdCounter howMany)
{
RMDBGENTER(4, RMDebug::module_adminif, "OId", "allocateOId(" << id << ", " << (OIdType)type << ")");
if (howMany == 0)
{
RMInit::logOut << "OId::allocateOId(" << id << ", " << type << ", " << howMany << ") allocation of zero oids not supported" << endl;
throw r_Error(r_Error::r_Error_CreatingOIdFailed);
}
if (type == INVALID || type == INNEROID || type == ATOMICTYPEOID || type > maxCounter)
{
RMInit::logOut << "OIDs of the specified type (" << type << " cannot be allocated." << endl;
throw r_Error(r_Error::r_Error_CreatingOIdFailed);
}
else {
id.oid = *counterIds[type];
*counterIds[type] = *counterIds[type] + howMany;
}
id.oidtype = type;
RMDBGEXIT(4, RMDebug::module_adminif, "OId", "allocateOId(" << id << ", " << type << ") ");
}
OId::OId(const OId& oldOId)
{
RMDBGENTER(4, RMDebug::module_adminif, "OId", "OId(" << oldOId << ")");
oid = oldOId.oid;
oidtype = oldOId.oidtype;
RMDBGEXIT(4, RMDebug::module_adminif, "OId", "OId(" << oldOId << ")");
}
OId::OId()
{
RMDBGENTER(4, RMDebug::module_adminif, "OId", "OId()");
oidtype = INVALID;
oid = 0;
RMDBGEXIT(4, RMDebug::module_adminif, "OId", "OId()");
}
OId::OId(OIdPrimitive newId)
{
RMDBGENTER(4, RMDebug::module_adminif, "OId", "OId(OIdPrimitive " << newId << ")");
oid = newId / OId::ID_MULTIPLIER;
oidtype = (OId::OIdType)(newId - (OIdPrimitive)((OIdPrimitive)oid * OId::ID_MULTIPLIER));
RMDBGEXIT(4, RMDebug::module_adminif, "OId", "OId(OIdPrimitive " << newId << ") ID " << oid << " TYPE " << oidtype);
}
OId::OId(OIdCounter newId, OIdType type)
{
RMDBGENTER(4, RMDebug::module_adminif, "OId", "OId(" << newId << "," << type << ")");
oidtype = type;
oid = newId;
RMDBGEXIT(4, RMDebug::module_adminif, "OId", "OId(" << newId << "," << type << ")");
}
OId::OIdType
OId::getType() const
{
RMDBGONCE(4, RMDebug::module_adminif, "OId", "getType() " << oidtype);
return oidtype;
}
void
OId::print_status(ostream& s) const
{
s << this;
}
OId::OIdCounter
OId::getCounter() const
{
RMDBGONCE(4, RMDebug::module_adminif, "OId", "getCounter() " << oid);
return oid;
}
OId::operator double() const
{
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator() " << oid);
return oid * OId::ID_MULTIPLIER + oidtype;
}
bool
OId::operator!= (const OId& one) const
{
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator!=(" << one << ") " << *this);
return !(OId::operator==(one));
}
bool
OId::operator== (const OId& one) const
{
bool retval = false;
if (oidtype == one.oidtype)
{
retval = (oid == one.oid);
}
else {
retval = false;
}
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator==(" << one << ") " << *this << " retval=" << retval);
return retval;
}
OId&
OId::operator=(const OId& old)
{
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator=(" << old << ") "<< *this);
if (this != &old)
{
oid = old.oid;
oidtype = old.oidtype;
}
return *this;
}
bool
OId::operator<(const OId& old) const
{
bool retval = false;
if (oidtype == old.oidtype)
{
retval = (oid < old.oid);
}
else {
retval = (oidtype < old.oidtype);
}
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator<(" << old << ") " << *this << " retval=" << retval);
return retval;
}
bool
OId::operator>(const OId& old) const
{
bool retval = false;
if (oidtype == old.oidtype)
{
retval = (oid > old.oid);
}
else {
retval = (oidtype > old.oidtype);
}
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator>(" << old << ") " << *this << " retval=" << retval);
return retval;
}
bool
OId::operator<=(const OId& old) const
{
bool retval = false;
if (oidtype == old.oidtype)
{
retval = (oid <= old.oid);
}
else {
retval = (oidtype < old.oidtype);
}
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator<=(" << old << ") " << *this << " retval=" << retval);
return retval;
}
bool
OId::operator>=(const OId& old) const
{
bool retval = false;
if (oidtype == old.oidtype)
{
retval = (oid >= old.oid);
}
else {
retval = (oidtype > old.oidtype);
}
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator>=(" << old << ") " << *this << " retval=" << retval);
return retval;
}
bool
operator== (const double one, const OId& two)
{
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator==(" << one << "," << two << ")");
bool retval=false;
if (((double)two) == one)
retval=true;
return retval;
}
bool
operator== (const OId& two, const double one)
{
RMDBGONCE(4, RMDebug::module_adminif, "OId", "operator==(" << two << "," << one << ")");
bool retval=false;
if (((double)two) == one)
retval=true;
return retval;
}
std::ostream&
operator<<(std::ostream& s, const OId& d)
{
s << "OId(" << d.getCounter() << ":" << d.getType() << ")";
return s;
}
std::ostream&
operator<<(std::ostream& s, OId::OIdType d)
{
switch (d)
{
case OId::INVALID:
s << "INVALID";
break;
case OId::MDDOID:
s << "MDDOID";
break;
case OId::MDDCOLLOID:
s << "MDDCOLLOID";
break;
case OId::MDDTYPEOID:
s << "MDDTYPEOID";
break;
case OId::MDDBASETYPEOID:
s << "MDDBASETYPEOID";
break;
case OId::MDDDIMTYPEOID:
s << "MDDDIMTYPEOID";
break;
case OId::MDDDOMTYPEOID:
s << "MDDDOMTYPEOID";
break;
case OId::STRUCTTYPEOID:
s << "STRUCTTYPEOID";
break;
case OId::SETTYPEOID:
s << "SETTYPEOID";
break;
case OId::BLOBOID:
s << "BLOBOID";
break;
case OId::DBMINTERVALOID:
s << "DBMINTERVALOID";
break;
case OId::STORAGEOID:
s << "STORAGEOID";
break;
case OId::MDDHIERIXOID:
s << "MDDHIERIXOID";
break;
case OId::DBTCINDEXOID:
s << "DBTCINDEXOID";
break;
case OId::INLINETILEOID:
s << "INLINETILEOID";
break;
case OId::INNEROID:
s << "INNEROIDOID";
break;
case OId::ATOMICTYPEOID:
s << "ATOMICTYPEOID";
break;
case OId::UDFOID:
s << "UDFOID";
break;
case OId::UDFPACKAGEOID:
s << "UDFPACKAGEOID";
break;
case OId::MDDRCIXOID:
s << "MDDRCIXOID";
break;
default:
s << "UNKNOWN: " << (int)d;
break;
}
return s;
}