/* * 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 . */ /************************************************************* * * * PURPOSE: * C++ part (i.e., RDBMS independent) of the RC index adaptor. * * * COMMENTS: * uses embedded SQL * ************************************************************/ #include "mymalloc/mymalloc.h" #include "dbrcindexds.hh" #include "reladminif/objectbroker.hh" #include "reladminif/dbref.hh" #include "raslib/rmdebug.hh" #include "reladminif/lists.h" #include "reladminif/sqlerror.hh" #include "reladminif/externs.h" #include "relblobif/blobtile.hh" #include "indexmgr/keyobject.hh" #include "storagemgr/sstoragelayout.hh" DBRCIndexDS::DBRCIndexDS(const OId& id) : IndexDS(id), currentDbRows(0), myDomain(0), myBaseCounter(0), myBaseOIdType(OId::INVALID), mySize(0) { RMDBGENTER(7, RMDebug::module_indexif, "DBRCIndexDS", "DBRCIndexDS(" << myOId << ")"); objecttype = OId::MDDRCIXOID; readFromDb(); RMDBGEXIT(7, RMDebug::module_indexif, "DBRCIndexDS", "DBRCIndexDS(" << myOId << ")"); } DBRCIndexDS::DBRCIndexDS(const r_Minterval& definedDomain, unsigned int size, OId::OIdType theEntryType) : IndexDS(), myDomain(definedDomain), currentDbRows(-1), myBaseCounter(0), myBaseOIdType(theEntryType), mySize(size) { RMDBGENTER(7, RMDebug::module_indexif, "DBRCIndexDS", "DBRCIndexDS(" << definedDomain << ", " << size << ", " << theEntryType << ") " << myOId); objecttype = OId::MDDRCIXOID; OId t; OId::allocateOId(t, myBaseOIdType, mySize); myBaseCounter = t.getCounter(); RMDBGMIDDLE(7, RMDebug::module_indexif, "DBRCIndexDS", "base counter " << myBaseCounter); setPersistent(true); setCached(true); RMDBGEXIT(7, RMDebug::module_indexif, "DBRCIndexDS", "DBRCIndexDS(" << definedDomain << ", " << size << ", " << theEntryType << ") " << myOId); } IndexDS* DBRCIndexDS::getNewInstance() const { RMInit::logOut << "DBRCIndexDS::getNewInstance() not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } OId::OIdPrimitive DBRCIndexDS::getIdentifier() const { return myOId; } bool DBRCIndexDS::removeObject(const KeyObject& entry) { RMInit::logOut << "DBRCIndexDS::removeObject(" << entry << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } bool DBRCIndexDS::removeObject(unsigned int pos) { RMInit::logOut << "DBRCIndexDS::removeObject(" << pos << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } void DBRCIndexDS::insertObject(const KeyObject& theKey, unsigned int pos) { RMInit::logOut << "DBRCIndexDS::insertObject(" << theKey << ", " << pos << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } void DBRCIndexDS::setObjectDomain(const r_Minterval& dom, unsigned int pos) { RMInit::logOut << "DBRCIndexDS::setObjectDomain(" << dom << ", " << pos << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } void DBRCIndexDS::setObject(const KeyObject& theKey, unsigned int pos) { RMInit::logOut << "DBRCIndexDS::setObject(" << theKey << ", " << pos << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } r_Minterval DBRCIndexDS::getCoveredDomain() const { RMDBGONCE(7, RMDebug::module_indexif, "DBRCIndexDS", "getCoveredDomain() const " << myOId << " " << myDomain); return myDomain; } r_Dimension DBRCIndexDS::getDimension() const { RMDBGONCE(7, RMDebug::module_indexif, "DBDDObjIx", "getDimension() const " << myOId << " " << myDomain.dimension()); return myDomain.dimension(); } r_Bytes DBRCIndexDS::getTotalStorageSize() const { RMDBGENTER(4, RMDebug::module_indexif, "DBRCIndexDS", "getTotalStorageSize() " << myOId); r_Bytes sz = 0; RMDBGEXIT(4, RMDebug::module_indexif, "DBRCIndexDS", "getTotalStorageSize() " << myOId << " " << sz); return sz; } bool DBRCIndexDS::isValid() const { return true; } void DBRCIndexDS::printStatus(unsigned int level, std::ostream& stream) const { char* indent = new char[level*2 +1]; for (unsigned int j = 0; j < level*2 ; j++) indent[j] = ' '; indent[level*2] = '\0'; stream << indent << "DBRCIndexDS" << std::endl; stream << indent << " current db rows " << currentDbRows << std::endl; stream << indent << " domain " << myDomain << std::endl; stream << indent << " base oid counter " << myBaseCounter << std::endl; stream << indent << " base oid type " << myBaseOIdType << std::endl; stream << indent << " size " << mySize << std::endl; DBObject::printStatus(level, stream); delete[] indent; } OId::OIdCounter DBRCIndexDS::getBaseCounter() const { return myBaseCounter; } OId::OIdType DBRCIndexDS::getBaseOIdType() const { return myBaseOIdType; } unsigned int DBRCIndexDS::getSize() const { return mySize; } bool DBRCIndexDS::isUnderFull() const { //redistribute in srptindexlogic has to be checked first before any other return value may be assigned return false; } bool DBRCIndexDS::isOverFull() const { return false; } unsigned int DBRCIndexDS::getOptimalSize() const { return getSize(); } r_Minterval DBRCIndexDS::getAssignedDomain() const { return myDomain; } void DBRCIndexDS::setAssignedDomain(const r_Minterval& newDomain) { RMInit::logOut << "DBRCIndexDS::setAssignedDomain(" << newDomain << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } void DBRCIndexDS::freeDS() { setPersistent(false); } bool DBRCIndexDS::isSameAs(const IndexDS* other) const { if (other->isPersistent()) if (myOId == other->getIdentifier()) return true; return false; } const KeyObject& DBRCIndexDS::getObject(unsigned int pos) const { RMInit::logOut << "DBRCIndexDS::getObject(" << pos << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } void DBRCIndexDS::getObjects(KeyObjectVector& objs) const { RMInit::logOut << "DBRCIndexDS::getObjects(vec) not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } r_Minterval DBRCIndexDS::getObjectDomain(unsigned int pos) const { RMInit::logOut << "DBRCIndexDS::getObjectDomain(" << pos << ") not suported" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); } void DBRCIndexDS::destroy() { DBObject::destroy(); } DBRCIndexDS::~DBRCIndexDS() { RMDBGENTER(7, RMDebug::module_indexif, "DBRCIndexDS", "~DBRCIndexDS() " << myOId); validate(); currentDbRows = 0; RMDBGEXIT(7, RMDebug::module_indexif, "DBRCIndexDS", "~DBRCIndexDS() " << myOId); } void DBRCIndexDS::updateInDb() throw (r_Error) { RMDBGENTER(5, RMDebug::module_indexif, "DBRCIndexDS", "updateInDb() " << myOId); // this operation is illegal RMInit::logOut << "DBRCIndexDS::updateInDb() update is not possible" << std::endl; throw r_Error(r_Error::r_Error_FeatureNotSupported); RMDBGEXIT(5, RMDebug::module_indexif, "DBRCIndexDS", "updateInDb() " << myOId); }