#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 . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . */ /************************************************************* * * * 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 2005­jan-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); }