/* * 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 "mymalloc/mymalloc.h" #include "raslib/rmdebug.hh" #include "mdddomaintype.hh" #include "mdddimensiontype.hh" #include "malloc.h" #include "basetype.hh" #include #include "reladminif/sqlerror.hh" #include "reladminif/externs.h" #include "reladminif/objectbroker.hh" #include "dbminterval.hh" #include r_Bytes MDDDomainType::getMemorySize() const { return MDDBaseType::getMemorySize() + sizeof(DBMinterval*) + myDomain->getMemorySize(); } MDDDomainType::MDDDomainType(const OId& id) throw (r_Error) : MDDBaseType(id), myDomain(0) { RMDBGENTER(4, RMDebug::module_catalogif, "MDDDomainType", "MDDDomainType(" << id <<")"); if (objecttype == OId::MDDDOMTYPEOID) { mySubclass = MDDDOMAINTYPE; readFromDb(); } RMDBGMIDDLE(8, RMDebug::module_catalogif, "MDDDomainType", "Domain\t:" << *myDomain); RMDBGEXIT(4, RMDebug::module_catalogif, "MDDDomainType", "MDDDomainType(" << id <<")"); } MDDDomainType::MDDDomainType(const char* newTypeName, const BaseType* newBaseType, const r_Minterval& newDomain) : MDDBaseType(newTypeName, newBaseType) { objecttype = OId::MDDDOMTYPEOID; myDomain = new DBMinterval(newDomain); myDomain->setCached(true); mySubclass = MDDDOMAINTYPE; } MDDDomainType::MDDDomainType() : MDDBaseType("unnamed mdddomaintype"), myDomain(0) { objecttype = OId::MDDDOMTYPEOID; mySubclass = MDDDOMAINTYPE; } MDDDomainType::MDDDomainType(const MDDDomainType& old) : MDDBaseType(old) { throw r_Error(r_Error::r_Error_FeatureNotSupported); } MDDDomainType& MDDDomainType::operator=(const MDDDomainType& old) { // Gracefully handle self assignment if (this == &old) return *this; MDDBaseType::operator=(old); if (myDomain) { myDomain->setPersistent(false); myDomain->setCached(false); delete myDomain; } myDomain = new DBMinterval(*old.myDomain); myDomain->setCached(true); return *this; } char* MDDDomainType::getTypeStructure() const { char* baseType = myBaseType->getTypeStructure(); char* mdom = myDomain->get_string_representation(); char* result = (char*)mymalloc(12 + strlen(baseType) + strlen(mdom)); strcpy(result, "marray <"); strcat(result, baseType); strcat(result, ", "); strcat(result, mdom); strcat(result, ">"); free(mdom); free(baseType); return result; } const r_Minterval* MDDDomainType::getDomain() const { return myDomain; } void MDDDomainType::print_status( ostream& s ) const { s << "\tr_Marray" << "<" << myBaseType->getTypeName() << ", "; myDomain->print_status(s); s << "\t>"; } MDDDomainType::~MDDDomainType() { RMDBGENTER(4, RMDebug::module_catalogif, "MDDDomainType", "~MDDDomainType() " << myOId << " " << getTypeName()); validate(); if (myDomain) delete myDomain; myDomain = 0; RMDBGEXIT(4, RMDebug::module_catalogif, "MDDDomainType", "~MDDDomainType() " << myOId << " " << getTypeName()); } int MDDDomainType::compatibleWith(const Type* aType) const { RMDBGENTER(11, RMDebug::module_catalogif, "MDDDomainType", "compatibleWith(" << aType->getName() << ") " << getName()); bool retval = false; if (aType->getType() == MDDTYPE) { MDDTypeEnum ttype = ((const MDDType*)aType)->getSubtype(); if (ttype == MDDDOMAINTYPE) { if (myBaseType->compatibleWith(((const MDDBaseType*)aType)->getBaseType())) { if (((const MDDDomainType*)aType)->getDomain()->dimension() == myDomain->dimension()) { if (myDomain->covers(*((const MDDDomainType*)aType)->getDomain())) { retval = true; } else { RMDBGMIDDLE(6, RMDebug::module_catalogif, "MDDDomainType", "domain marray types have incompatible domains"); } } else { RMDBGMIDDLE(6, RMDebug::module_catalogif, "MDDDomainType", "domain marray types have different dimensions"); } } else { RMDBGMIDDLE(6, RMDebug::module_catalogif, "MDDDomainType", "basetypes are not equal"); } } else { if (ttype == MDDDIMENSIONTYPE) { if (myBaseType->compatibleWith(((const MDDBaseType*)aType)->getBaseType())) { if (myDomain->dimension() == ((const MDDDimensionType*)aType)->getDimension()) { retval = true; } else { RMDBGMIDDLE(6, RMDebug::module_catalogif, "MDDDomainType", "dimension marray type has wrong dimension") } } else { RMDBGMIDDLE(6, RMDebug::module_catalogif, "MDDDomainType", "basetypes are not equal"); } } else { RMDBGMIDDLE(6, RMDebug::module_catalogif, "MDDDomainType", "not a dimension/domain type"); } } } else { RMInit::logOut << "MDDDomainType::compatibleWith() was passed a type that is not an marray type (" << aType->getName() << endl; } RMDBGEXIT(11, RMDebug::module_catalogif, "MDDDomainType", "compatibleWith(" << aType->getName() << ") " << getName() << " retval " << retval); return retval; } void MDDDomainType::setPersistent(bool t) throw (r_Error) { MDDBaseType::setPersistent(t); myDomain->setPersistent(t); }