diff options
Diffstat (limited to 'relmddif/dbmddset.pgc')
-rw-r--r-- | relmddif/dbmddset.pgc | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/relmddif/dbmddset.pgc b/relmddif/dbmddset.pgc new file mode 100644 index 0000000..b92a884 --- /dev/null +++ b/relmddif/dbmddset.pgc @@ -0,0 +1,314 @@ +// This is -*- C++ -*- + +/* +* 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 <http://www.gnu.org/licenses/>. +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see <http://www.rasdaman.org> +* or contact Peter Baumann via <baumann@rasdaman.com>. +*/ +/************************************************************* + * + * + * PURPOSE: + * Code with embedded SQL for PostgreSQL DBMS + * + * + * COMMENTS: + * uses embedded SQL + * + ************************************************************/ + +#include "debug-srv.hh" + +// general embedded SQL related definitions +EXEC SQL include "../reladminif/sqlglobals.h"; + +#include "dbmddset.hh" +#include "raslib/rmdebug.hh" +#include "reladminif/sqlerror.hh" +#include "reladminif/objectbroker.hh" +#include "relcatalogif/collectiontype.hh" + +DBMDDSet::DBMDDSet(const char* name, const OId& id, const CollectionType* type) throw (r_Error) + : DBNamedObject(id, name), + collType(type) +{ + RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "DBMDDSet(" << getName() << ", " << myOId << ", " << collType->getName() << ")"); + ENTER( "DBMDDSet::DBMDDSet, name=" << name << ", oid=" << id ); + + if (name == NULL) + setName("unnamed collection"); + if (type == NULL) + { + RMDBGONCE(0, RMDebug::module_mddif, "DBMDDSet", "DBMDDSet(" << name << ", NULL)") + throw r_Error(r_Error::r_Error_General); + } + if (!type->isPersistent()) + { + r_Error t(RASTYPEUNKNOWN); + t.setTextParameter("type", type->getName()); + RMDBGONCE(0, RMDebug::module_mddif, "DBMDDSet", "DBMDDSet(" << name << ", " << type->getName() << " not persistent)") + throw t; + } + DBMDDSet* set = NULL; + 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(5, 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); + } + EXEC SQL BEGIN DECLARE SECTION; + long testoid1; + EXEC SQL END DECLARE SECTION; + + testoid1 = id.getCounter(); + TALK( "EXEC SQL SELECT MDDCollId INTO :testoid1 FROM RAS_MDDCOLLNAMES WHERE MDDCollId = " << testoid1 ); + EXEC SQL SELECT MDDCollId INTO :testoid1 FROM RAS_MDDCOLLNAMES WHERE MDDCollId = :testoid1; + if (SQLCODE == SQLNODATAFOUND) + { //the code is most of the time 100 + _isInDatabase = false; + _isPersistent = true; + _isModified = true; + objecttype = OId::MDDCOLLOID; + myOId = id; + ObjectBroker::registerDBObject(this); + } + else + { + if (SQLCODE == SQLOK) + { + RMDBGMIDDLE(2, RMDebug::module_mddif, "DBMDDSet", "already have a DBMDDSet with this OId " << id); + RMInit::logOut << "DBMDDSet::DBMDDSet() mdd collection with oid \"" << id << "\" exists already" << endl; + throw r_Error(r_Error::r_Error_OIdNotUnique); + } + else + { + check("DBMDDSet::DBMDDSet(name, oid, settype)"); + generateException(); + } + } + + LEAVE( "DBMDDSet::DBMDDSet" ); + RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "DBMDDSet(" << name << ", " << id << ") " << myOId); +} + +void +DBMDDSet::insertInDb() throw (r_Error) +{ + RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "insertInDb() " << myOId); + ENTER( "DBMDDSet::insertInDb" ); + + EXEC SQL BEGIN DECLARE SECTION; + long mddoid; + long mddcolloid; + long colltypeoid; + char collname[VARCHAR_MAXLEN]; + EXEC SQL END DECLARE SECTION; + + mddcolloid = myOId.getCounter(); + colltypeoid = collType->getOId().getCounter(); + + (void) strncpy( collname, (char*) getName(), (size_t) sizeof(collname) ); + + TALK( "EXEC SQL INSERT INTO RAS_MDDCOLLNAMES ( MDDCollName, MDDCollId, SetTypeId) VALUES( " << collname << "," << mddcolloid << "," << colltypeoid << ")" ); + + EXEC SQL INSERT INTO RAS_MDDCOLLNAMES ( MDDCollName, MDDCollId, SetTypeId) + VALUES ( :collname, :mddcolloid, :colltypeoid); + if (SQLCODE != SQLOK) + { + check("DBMDDSet::insertInDb() INSERT INTO RAS_MDDCOLLNAMES\0"); + generateException(); + } + + for (DBMDDObjIdSet::iterator i = mySet.begin(); i != mySet.end(); i++) + { + mddoid = (*i).getOId().getCounter(); + RMDBGMIDDLE(5, RMDebug::module_mddif, "DBMDDSet", "mddobject with id " << mddoid); + TALK( "EXEC SQL INSERT INTO RAS_MDDCOLLECTIONS ( MDDId, MDDCollId) VALUES( " << mddoid << "," << mddcolloid << ")" ); + EXEC SQL INSERT INTO RAS_MDDCOLLECTIONS ( MDDId, MDDCollId) + VALUES ( :mddoid, :mddcolloid); + if (SQLCODE != SQLOK) + { + check("DBMDDSet::insertInDb() INSERT INTO RAS_MDDCOLLECTIONS\0"); + generateException(); + } + else + { + RMDBGMIDDLE(5, RMDebug::module_mddif, "DBMDDSet", "wrote mddobjoid\t: " << (*i).getOId()); + } + } + + DBObject::insertInDb(); + + LEAVE( "DBMDDSet::insertInDb" ); + RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "insertInDb() " << myOId); +} + +void +DBMDDSet::deleteFromDb() throw (r_Error) +{ + RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "deleteFromDb() " << myOId); + ENTER( "DBMDDSet::deleteFromDb" ); + + EXEC SQL BEGIN DECLARE SECTION; + long mddcolloid1; + EXEC SQL END DECLARE SECTION; + + mddcolloid1 = myOId.getCounter(); + TALK( "EXEC SQL DELETE FROM RAS_MDDCOLLNAMES WHERE MDDCollId = " << mddcolloid1 ); + EXEC SQL DELETE FROM RAS_MDDCOLLNAMES WHERE MDDCollId = :mddcolloid1; + if (SQLCODE != SQLOK) + { + check("DBMDDSet::deleteFromDb() DELETE FROM RAS_MDDCOLLNAMES\0"); + generateException(); + } + + TALK( "EXEC SQL DELETE FROM RAS_MDDCOLLECTIONS WHERE MDDCollId = " << mddcolloid1 ); + EXEC SQL DELETE FROM RAS_MDDCOLLECTIONS WHERE MDDCollId = :mddcolloid1; + if (SQLCODE != SQLOK) + { + if (SQLCODE != SQLNODATAFOUND) + { + check("DBMDDSet::deleteFromDb() DELETE FROM RAS_MDDCOLLECTIONS\0"); + generateException(); + } + else + { + //there may be empty collections + } + } + + DBObject::deleteFromDb(); + + LEAVE( "DBMDDSet::deleteFromDb" ); + RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "deleteFromDb() " << myOId); +} + +void +DBMDDSet::readFromDb() throw (r_Error) +{ + RMDBGENTER(4, RMDebug::module_mddif, "DBMDDSet", "readFromDb() " << myOId); + ENTER( "DBMDDSet::readFromDb" ); + +#ifdef RMANBENCHMARK + DBObject::readTimer.resume(); +#endif + EXEC SQL BEGIN DECLARE SECTION; + long mddoid2; + long mddcolloid2; + long colltypeoid2; + char collname2[VARCHAR_MAXLEN]; + EXEC SQL END DECLARE SECTION; + + mddcolloid2 = myOId.getCounter(); + + TALK( "EXEC SQL SELECT MDDCollName, SetTypeId INTO :collname2, :colltypeoid2 FROM RAS_MDDCOLLNAMES WHERE MDDCollId = " << mddcolloid2 ); + + EXEC SQL SELECT MDDCollName, SetTypeId + INTO :collname2, :colltypeoid2 + FROM RAS_MDDCOLLNAMES + WHERE MDDCollId = :mddcolloid2; + if (SQLCODE != SQLOK) + { + if (SQLCODE == SQLNODATAFOUND) + { + RMDBGMIDDLE(7, RMDebug::module_mddif, "DBMDDSet", "object not found"); + LEAVE( "DBMDDSet::readFromDb(): object not found" ); + throw r_Error(r_Error::r_Error_ObjectUnknown); + } + else + { + LEAVE( "DBMDDSet::readFromDb(): db access error: " << SQLCODE ); + check("DBMDDSet::readFromDb() SELECT FROM RAS_MDDCOLLNAMES\0"); + generateException(); + } + } + + setName(collname2); + collType = (const CollectionType*)ObjectBroker::getObjectByOId(OId(colltypeoid2, OId::SETTYPEOID)); + + TALK( "EXEC SQL DECLARE c CURSOR FOR SELECT MDDId FROM RAS_MDDCOLLECTIONS WHERE MDDCollId = " << mddcolloid2 << " ORDER BY MDDId" ); + EXEC SQL DECLARE c CURSOR FOR + SELECT MDDId + FROM RAS_MDDCOLLECTIONS + WHERE MDDCollId = :mddcolloid2 + ORDER BY MDDId; + if (SQLCODE != SQLOK) + { + LEAVE( "DBMDDSet::readFromDb(): db access error: " << SQLCODE ); + check("DBMDDSet::readFromDb() DECLARE CURSOR"); + generateException(); + } + + TALK( "EXEC SQL OPEN c" ); + EXEC SQL OPEN c; + if (SQLCODE != SQLOK) + { + LEAVE( "DBMDDSet::readFromDb(): db access error: " << SQLCODE ); + check("DBMDDSet::readFromDb() OPEN CURSOR"); + generateException(); + } + + do + { + TALK( "EXEC SQL FETCH c INTO :mddoid2" ); + EXEC SQL FETCH c INTO :mddoid2; + if (SQLCODE == SQLOK) + { + RMDBGMIDDLE(7, RMDebug::module_mddif, "DBMDDSet", "fetched mddobjectoid " << mddoid2); + mySet.insert(OId(mddoid2, OId::MDDOID)); + } + else + { + if (SQLCODE == SQLNODATAFOUND) + { + //no more data to read + break; + } + else + { + LEAVE( "DBMDDSet::readFromDb(): db access error: " << SQLCODE ); + check("DBMDDSet::readFromDb() FETCHING\0"); + generateException(); + } + } + } while (true); + TALK( "EXEC SQL CLOSE c" ); + EXEC SQL CLOSE c; + + DBObject::readFromDb(); +#ifdef RMANBENCHMARK + DBObject::readTimer.pause(); +#endif + + LEAVE( "DBMDDSet::readFromDb" ); + RMDBGEXIT(4, RMDebug::module_mddif, "DBMDDSet", "readFromDb() " << myOId); +} + |