/* * 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 . */ #include #include #include "dbmddset.hh" #include "raslib/rmdebug.hh" #include "reladminif/sqlerror.hh" #include "reladminif/externs.h" #include "dbmddobj.hh" #include "reladminif/objectbroker.hh" #include "reladminif/dbref.hh" #include "relcatalogif/collectiontype.hh" #include "reladminif/dbobjectiditerator.hh" #include "raslib/error.hh" void DBMDDSet::printStatus(unsigned int level, std::ostream& stream) const { char* indent = new char[level*2 +1]; for (int j = 0; j < level*2 ; j++) indent[j] = ' '; indent[level*2] = '\0'; DBObject::printStatus(level, stream); stream << indent; stream << "Collection Entries "; for (DBMDDObjIdSet::const_iterator i = mySet.begin(); i != mySet.end(); i++) { if (isPersistent()) stream << (*i).getOId() << " "; else stream << (r_Ptr)(*i).ptr() << " "; } stream << endl; delete[] indent; indent=0; } bool DBMDDSet::contains_element(const DBMDDObjId& elem) const { RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "contains_element(" << elem.getOId() << ") " << myOId); bool retval = false; DBMDDObjIdSet::const_iterator i = mySet.find(elem); if (i != mySet.end()) { retval = true; } RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "contains_element(" << elem.getOId() << ") " << myOId << " " << retval); return retval; } void DBMDDSet::remove(DBMDDObjId& elem) { RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "remove(" << elem.getOId() << ")"); DBMDDObjIdSet::iterator i = mySet.find(elem); if (i != mySet.end()) { elem->decrementPersRefCount(); mySet.erase(i); setModified(); } RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "remove(" << elem.getOId() << ")"); } void DBMDDSet::removeAll() { DBMDDObjId t; while (!mySet.empty()) { ((DBMDDObj*)(*(mySet.begin())).ptr())->decrementPersRefCount(); mySet.erase(mySet.begin()); } setModified(); } DBMDDSet::~DBMDDSet() { RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "~DBMDDSet() " << myOId); validate(); collType = NULL; mySet.clear(); RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "~DBMDDSet() " << myOId); } const CollectionType* DBMDDSet::getCollType() const { RMDBGONCE(4, RMDebug::module_mddif, "DBMDDSet", "getCollType() " << myOId << "\t" << collType->getName()); return collType; } r_Bytes DBMDDSet::getMemorySize() const { return DBNamedObject::getMemorySize() + sizeof(OIdSet) + mySet.size() * sizeof(OId); } void DBMDDSet::insert(DBMDDObjId elem) { if (!contains_element(elem)) { setModified(); elem->incrementPersRefCount(); mySet.insert(elem); } } DBMDDObjIdIter* DBMDDSet::newIterator() const { return new DBMDDObjIdIter(mySet); } unsigned int DBMDDSet::getCardinality() const { return mySet.size(); } void DBMDDSet::deleteName() { setName("\0"); setModified(); } void DBMDDSet::releaseAll() { RMDBGONCE(1, RMDebug::module_mddif, "DBMDDSet", "releaseAll() " << myOId << "\tdoes not do anything"); } DBMDDSetId DBMDDSet::getDBMDDSet(const char* name) throw (r_Error) { RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "getDBMDDSet(" << name << ")"); DBMDDSetId set((DBMDDSet*)ObjectBroker::getObjectByName(OId::MDDCOLLOID, name)); RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "getDBMDDSet(" << name << ")"); return set; } DBMDDSetId DBMDDSet::getDBMDDSet(const OId& o) throw (r_Error) { RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "getDBMDDSet(" << o << ")"); DBMDDSetId set((DBMDDSet*)ObjectBroker::getObjectByOId(o)); RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "getDBMDDSet(" << o << ")"); return set; } bool DBMDDSet::deleteDBMDDSet(const OId& oid) { bool retval = true; try { DBObject* set = ObjectBroker::getObjectByOId(oid); set->setPersistent(false); } catch (r_Error& e) { if (e.get_kind() == r_Error::r_Error_ObjectUnknown) retval = false; else throw; } return retval; } bool DBMDDSet::deleteDBMDDSet(const char* name) { bool retval = true; try { DBObject* set = ObjectBroker::getObjectByName(OId::MDDCOLLOID, name); set->setPersistent(false); } catch (r_Error& e) { if (e.get_kind() == r_Error::r_Error_ObjectUnknown) retval = false; else throw; } return retval; } DBMDDSet::DBMDDSet(const char* name, const CollectionType* type) throw (r_Error) : DBNamedObject(name), collType(type) { if (name == NULL) setName("unnamed collection"); if (type == NULL) { RMDBGONCE(0, RMDebug::module_mddif, "DBMDDSet", "DBMDDSet(" << name << ", NULL)") RMInit::logOut << "DBMDDSet::DBMDDSet() the collection type is NULL" << endl; throw r_Error(COLLECTIONTYPEISNULL); } objecttype = OId::MDDCOLLOID; } void DBMDDSet::setPersistent(bool state) throw (r_Error) { DBMDDSet* set = NULL; if (state) { if (!collType->isPersistent()) { r_Error t(RASTYPEUNKNOWN); t.setTextParameter("type", collType->getName()); RMDBGONCE(0, RMDebug::module_mddif, "DBMDDSet", "setPersistent(" << state << ") " << getName() << ", " << collType->getName() << " not persistent"); throw t; } try { set = (DBMDDSet*)ObjectBroker::getObjectByName(OId::MDDCOLLOID, getName()); } catch (r_Error& err) { if (err.get_kind() == r_Error::r_Error_ObjectUnknown) set = NULL; else throw; } if (set) { RMDBGMIDDLE(6, RMDebug::module_mddif, "DBMDDSet", "already have a set with name " << getName()); RMInit::logOut << "DBMDDSet::DBMDDSet() mdd collection with name \"" << getName() << "\" exists already" << endl; throw r_Error(r_Error::r_Error_NameNotUnique); } } else { removeAll(); } DBNamedObject::setPersistent(state); } DBMDDSet::DBMDDSet(const OId& id) throw (r_Error) : DBNamedObject(id), collType(0) { RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "DBMDDSet(" << myOId << ")"); objecttype = OId::MDDCOLLOID; readFromDb(); RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "DBMDDSet(" << myOId << ")"); } void DBMDDSet::updateInDb() throw (r_Error) { RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "updateInDb() " << myOId); deleteFromDb(); insertInDb(); DBObject::updateInDb(); RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "updateInDb() " << myOId); }