diff options
Diffstat (limited to 'relcatalogif/structtype.pgc')
-rw-r--r-- | relcatalogif/structtype.pgc | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/relcatalogif/structtype.pgc b/relcatalogif/structtype.pgc new file mode 100644 index 0000000..d1d1e24 --- /dev/null +++ b/relcatalogif/structtype.pgc @@ -0,0 +1,214 @@ +#include "mymalloc/mymalloc.h" +// 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 + * + ************************************************************/ + +static const char rcsid[] = "@(#)catalogif,StructType: $Header: /home/rasdev/CVS-repository/rasdaman/relcatalogif/structtype.ec,v 1.4 2003/12/27 23:23:04 rasdev Exp $"; + +// general embedded SQL related definitions +EXEC SQL include "../reladminif/sqlglobals.h"; + +#include "debug-srv.hh" +#include "structtype.hh" +#include "raslib/rmdebug.hh" +#include "reladminif/sqlerror.hh" +#include "reladminif/externs.h" +#include "reladminif/objectbroker.hh" + + +void +StructType::insertInDb() throw (r_Error) +{ + RMDBGENTER(5, RMDebug::module_catalogif, "StructType", "insertInDb() " << myOId); + EXEC SQL BEGIN DECLARE SECTION; + long structtypeid; + char structtypename[VARCHAR_MAXLEN]; + double elementtype; + char elementname[VARCHAR_MAXLEN]; + short count; + EXEC SQL END DECLARE SECTION; + + (void) strncpy( structtypename, (char*) getTypeName(), (size_t) sizeof(structtypename) ); + structtypeid = myOId.getCounter(); + + TALK( "EXEC SQL INSERT INTO RAS_BASETYPENAMES ( BaseTypeId, BaseTypeName) VALUES ( " << structtypeid << ", " << structtypename << ")" ); + EXEC SQL INSERT INTO RAS_BASETYPENAMES ( BaseTypeId, BaseTypeName) + VALUES ( :structtypeid, :structtypename); + if (SQLCODE != SQLOK) + { + check("StructType::insertInDb() INSERT INTO RAS_BASETYPENAMES"); + LEAVE("StructType::insertInDb() INSERT INTO RAS_BASETYPENAMES error: " << SQLCODE ); + generateException(); + } + + for (count = 0; count < getNumElems(); count++) + { + (void) strncpy( elementname, (char*) getElemName(count), (size_t) sizeof(elementname) ); + //should not be necessary because of TypeFactory::addType() + DBObject* obj = (DBObject*)getElemType(count); + + elementtype = obj->getOId(); + RMDBGMIDDLE(6, RMDebug::module_catalogif, "StructType", "element " << count << ". id\t:" << elementtype); + + TALK( "EXEC SQL INSERT INTO RAS_BASETYPES ( BaseTypeId, ContentType, Count, ContentTypeName) VALUES ( " << structtypeid << ", " << elementtype << ", " << count << ", " << elementname << ")" ); + EXEC SQL INSERT INTO RAS_BASETYPES ( BaseTypeId, ContentType, Count, ContentTypeName ) + VALUES ( :structtypeid, :elementtype, :count, :elementname); + if (SQLCODE != SQLOK) + { + check("StructType::insertInDb() INSERT INTO RAS_BASETYPES"); + LEAVE("StructType::insertInDb() INSERT INTO RAS_BASETYPES error: " << SQLCODE ); + generateException(); + } + } + DBObject::insertInDb(); + RMDBGEXIT(5, RMDebug::module_catalogif, "StructType", "insertInDb()"); +} + +void +StructType::deleteFromDb() throw (r_Error) +{ + RMDBGENTER(5, RMDebug::module_catalogif, "StructType", "deleteFromDb() " << myOId); + EXEC SQL BEGIN DECLARE SECTION; + long basetypeid3; + EXEC SQL END DECLARE SECTION; + + basetypeid3 = myOId.getCounter(); + + TALK( "EXEC SQL DELETE FROM RAS_BASETYPENAMES WHERE BaseTypeId = " << basetypeid3 ); + EXEC SQL DELETE FROM RAS_BASETYPENAMES + WHERE BaseTypeId = :basetypeid3; + if (SQLCODE != SQLOK) + { + check("StructType::deleteFromDb() DELETE FROM RAS_BASETYPENAMES"); + LEAVE("StructType::deleteFromDb() DELETE FROM RAS_BASETYPENAMES error: " << SQLCODE ); + generateException(); + } + + TALK( "EXEC SQL DELETE FROM RAS_BASETYPES WHERE BaseTypeId = " << basetypeid3 ); + EXEC SQL DELETE FROM RAS_BASETYPES + WHERE BaseTypeId = :basetypeid3; + if (SQLCODE != SQLOK) + { + check("StructType::deleteFromDb() DELETE FROM RAS_BASETYPES"); + LEAVE("StructType::deleteFromDb() DELETE FROM RAS_BASETYPES error: " << SQLCODE ); + generateException(); + } + + DBObject::deleteFromDb(); + RMDBGEXIT(5, RMDebug::module_catalogif, "StructType", "deleteFromDb() " << myOId); +} + +void +StructType::readFromDb() throw (r_Error) +{ + RMDBGENTER(5, RMDebug::module_catalogif, "StructType", "readFromDb() " << myOId); + short count = 0; + + EXEC SQL BEGIN DECLARE SECTION; + long basetypeid1; + double elementtypeid1; + char basetypename1[VARCHAR_MAXLEN]; + char elementname1[VARCHAR_MAXLEN]; + long count1; // added PB 2005jan-09 + EXEC SQL END DECLARE SECTION; + + basetypeid1 = myOId.getCounter(); + + TALK( "EXEC SQL SELECT BaseTypeName INTO :basetypename1 FROM RAS_BASETYPENAMES WHERE BaseTypeId = " << basetypeid1 ); + EXEC SQL SELECT BaseTypeName + INTO :basetypename1 + FROM RAS_BASETYPENAMES + WHERE BaseTypeId = :basetypeid1; + if (SQLCODE != SQLOK) + { + check("StructType::readFromDb() SELECT FROM RAS_BASETYPENAMES"); + LEAVE("StructType::readFromDb() SELECT FROM RAS_BASETYPENAMES error: " << SQLCODE ); + if (SQLCODE == SQLNODATAFOUND) // was: 100 -- PB 2005-feb-13 + throw r_Error(r_Error::r_Error_ObjectUnknown); + else + generateException(); + } + + setName(basetypename1); + + TALK( "EXEC SQL DECLARE c CURSOR FOR SELECT ContentTypeName, ContentType, Count FROM RAS_BASETYPES WHERE BaseTypeId = " << basetypeid1 << " ORDER BY Count" ); + EXEC SQL DECLARE c CURSOR FOR + SELECT ContentTypeName, ContentType, Count + FROM RAS_BASETYPES + WHERE BaseTypeId = :basetypeid1 + ORDER BY Count; + if (SQLCODE != SQLOK) + { + check("StructType::readFromDb() DECLARE"); + LEAVE("StructType::readFromDb() DECLARE error: " << SQLCODE ); + } + + TALK( "EXEC SQL OPEN c" ); + EXEC SQL OPEN c; + check("StructType::readFromDb() OPEN"); + + do + { + memset(elementname1, 0, VARCHAR_MAXLEN); + // bug fix (FIXME: what about other DBMSs?), was this: -- PB 2005-jan-09 + // EXEC SQL FETCH c INTO :elementname1, :elementtypeid1; + TALK( "EXEC SQL FETCH c INTO :elementname1, :elementtypeid1, :count1;" ) + EXEC SQL FETCH c INTO :elementname1, :elementtypeid1, :count1; + if (SQLCODE != SQLOK) + { + if (SQLCODE != SQLNODATAFOUND) // was: 100 -- PB 2005-feb-13 + { + check("StructType::readFromDb() FETCH"); + cout << "FETCHED " << count << endl; + TALK( "EXEC SQL CLOSE c" ); + EXEC SQL CLOSE c; + TALK( "EXEC SQL FREE c" ); + EXEC SQL FREE c; + generateException(); + } + break; + } + RMDBGMIDDLE(7, RMDebug::module_catalogif, "StructType", count << ". contenttypeid is " << elementtypeid1 << " elementname is " << elementname1); + addElementPriv((char*)elementname1, (BaseType*)ObjectBroker::getObjectByOId(OId(elementtypeid1))); + count++; + } while (1); // FIXME: make it (SQLCODE == SQLOK) + + TALK( "EXEC SQL CLOSE c" ); + EXEC SQL CLOSE c; + + DBObject::readFromDb(); + + RMDBGEXIT(5, RMDebug::module_catalogif, "StructType", "readFromDb() " << myOId); +} + |