summaryrefslogtreecommitdiffstats
path: root/relcatalogif/structtype.pgc
diff options
context:
space:
mode:
Diffstat (limited to 'relcatalogif/structtype.pgc')
-rw-r--r--relcatalogif/structtype.pgc214
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 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);
+}
+