#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 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);
}