#include "mymalloc/mymalloc.h"
/*
* 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:
* - not yet implemented.
*
************************************************************/
// PG stuff:
#include "libpq-fe.h" /* C interface to PgSQL */
#include "libpq/libpq-fs.h" /* large object (lo) api */
#include "debug-srv.hh"
// general embedded SQL related definitions
EXEC SQL include "../reladminif/sqlglobals.h";
#include "dbtcindex.hh"
#include "raslib/rmdebug.hh"
#include "reladminif/sqlerror.hh"
void
DBTCIndex::deleteFromDb() throw (r_Error)
{
RMDBGENTER(5, RMDebug::module_indexif, "DBTCIndex", "deleteFromDb() " << myOId);
throw r_Error( r_Error::r_Error_BaseDBMSFailed );
/*
EXEC SQL BEGIN DECLARE SECTION;
long id3;
Oid blobOid;
char pgQuery[SQL_QUERY_BUFFER_SIZE]; // prelim
PGresult *pgResult = NULL; // prelim
EXEC SQL END DECLARE SECTION;
if (!_isLoaded)
readInlineTiles();
DBHierIndex::deleteFromDb();
id3 = myOId.getCounter();
TALK( "EXEC SQL DELETE FROM RAS_ITILES WHERE ITileId = " << id3 );
EXEC SQL DELETE FROM RAS_ITILES
WHERE ITileId = :id3;
if (SQLCODE != 0)
{
if (SQLCODE != 100)
{
check("DBTCIndex::deleteFromDb() RAS_ITILES");
generateException();
}
}
TALK( "EXEC SQL DELETE FROM RAS_ITMAP WHERE IndexId = " << id3 );
EXEC SQL DELETE FROM
RAS_ITMAP
WHERE
IndexId = :id3;
if (SQLCODE != 0)
{
if (SQLCODE != 100)
{
check("DBTCIndex::deleteFromDb() RAS_ITMAP");
generateException();
}
}
RMDBGEXIT(5, RMDebug::module_indexif, "DBTCIndex", "deleteFromDb() " << myOId);
*/
}
void
DBTCIndex::storeTiles()
{
RMDBGENTER(5, RMDebug::module_indexif, "DBTCIndex", "storeTiles() " << myOId);
throw r_Error( r_Error::r_Error_BaseDBMSFailed );
/*
char* cells = NULL;
r_Bytes blobSize = 0;
r_Bytes currinlinesize = 0;
char* from = NULL;
DBObjectPMap::iterator itit;
for (itit = inlineTiles.begin(); inlineTiles.end() != itit; itit++)
{
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "InlineTile " << (*itit).second->getOId() << " has size " << ((InlineTile*)(*itit).second)->getStorageSize());
blobSize = ((InlineTile*)(*itit).second)->getStorageSize() + blobSize;
}
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "blobSize " << blobSize << " hasBlob " << (int)hasBlob);
if (hasBlob && (blobSize == 0))
{
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "dropping blob");
//drop blob
EXEC SQL BEGIN DECLARE SECTION;
long blspcoid4;
EXEC SQL END DECLARE SECTION;
blspcoid4 = myOId.getCounter();
TALK( "EXEC SQL DELETE FROM RAS_ITILES WHERE ITileId = " << blspcoid4 );
EXEC SQL DELETE FROM RAS_ITILES WHERE ITileId = :blspcoid4;
if (SQLCODE != 0)
{
if (SQLCODE != 100)
{
check("DBTCIndex::storeTiles drop blob()");
generateException();
}
else
{
RMInit::logOut << "Tile container index: error in BLOB Space." << endl << "Please contact Customer support." << endl;
RMInit::dbgOut << "Tile container index: store tiles, but can't find my blob!" << endl;
throw r_Error(TILE_CONTAINER_NOT_FOUND);
}
}
hasBlob = false;
}
else
{
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "not dropping blob");
if (blobSize == 0)
{
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "nothing to insert");
}
else
{
if (!hasBlob)
{
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "but inserting blob");
insertBlob();
}
hasBlob = true;
cells = (char*)mymalloc(blobSize * sizeof(char));
from = cells;
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "inserting " << blobSize << " bytes");
for (itit = inlineTiles.begin(); inlineTiles.end() != itit; itit++)
{
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "inserting " << (*itit).second->getOId() << " from " << (r_Bytes)(from - cells));
from = ((InlineTile*)((*itit).second))->insertInMemBlock(from);
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "inserted to " << (r_Bytes)(from - cells));
}
RMDBGMIDDLE(5, RMDebug::module_indexif, "DBTCIndex", "will write " << (r_Bytes)(from - cells) << " bytes");
writeInlineTiles(cells, blobSize);
for (itit = inlineTiles.begin(); itit != inlineTiles.end(); itit++)
{
delete (*(inlineTiles.begin())).second;
(*(inlineTiles.begin())).second = NULL;
}
}
}
RMDBGEXIT(5, RMDebug::module_indexif, "DBTCIndex", "storeTiles() " << myOId);
*/
}
void
DBTCIndex::insertBlob()
{
RMDBGENTER(5, RMDebug::module_indexif, "DBTCIndex", "insertBlob() " << myOId);
throw r_Error( r_Error::r_Error_BaseDBMSFailed );
EXEC SQL BEGIN DECLARE SECTION;
long blspcoid3;
EXEC SQL END DECLARE SECTION;
blspcoid3 = myOId.getCounter();
/*
EXEC SQL INSERT INTO RAS_ITILES (
ITileId,
ITile
)
VALUES (
:blspcoid3,
EMPTY_BLOB()
);
if (check("DBTCIndex::insertBlob()") != 0)
{
if (SQLCODE == -1)
RMInit::logOut << "Counter for DBTCIndexs corrupted." << endl << "Please increment Rows in RAS_COUNTERS manually." << endl;
generateException();
}
*/
hasBlob = true;
RMDBGEXIT(5, RMDebug::module_indexif, "DBTCIndex", "insertBlob() " << myOId);
}
void
DBTCIndex::writeInlineTiles(char* theblob, r_Bytes blobSize) throw (r_Error)
{
RMDBGENTER(3, RMDebug::module_indexif, "DBTCIndex", "writeInlineTiles() " << myOId);
throw r_Error( r_Error::r_Error_BaseDBMSFailed );
/*
EXEC SQL BEGIN DECLARE SECTION;
long blspcoid2;
EXEC SQL END DECLARE SECTION;
if (blobSize == 0)
{
RMInit::logOut << "DBTCIndex encountered an internal Error: blobSize is zero." << endl;
RMInit::logOut << "Please check your Oracle Instance and contact Customer Support." << endl;
RMDBGONCE(0, RMDebug::module_indexif, "DBTCIndex", "writeInlineTiles blobSize = 0!");
throw r_Error(r_Error::r_Error_BaseDBMSFailed);
}
do
{
//EXEC SQL SELECT ITile INTO :loc1 FROM RAS_ITILES WHERE ITileId = :blspcoid2;
if (check("Select Loblocator") != 0)
generateException();
} while ((retries < 5) && (tnserror));
_isLoaded = false;
inlineTileHasChanged = false;
RMDBGEXIT(3, RMDebug::module_indexif, "DBTCIndex", "writeInlineTiles() " << myOId << " " << myOId.getType());
*/
}
void
DBTCIndex::readInlineTiles() throw (r_Error)
{
RMDBGENTER(3, RMDebug::module_indexif, "DBTCIndex", "readInlineTiles() " << myOId);
throw r_Error( r_Error::r_Error_BaseDBMSFailed );
/*
EXEC SQL BEGIN DECLARE SECTION;
long blspcoid1;
EXEC SQL END DECLARE SECTION;
blspcoid1 = myOId.getCounter();
long from = 0;
long newsize = 0;
char* theblob = NULL;
//EXEC SQL SELECT ITile INTO :loc FROM RAS_ITILES WHERE ITileId = :blspcoid1;
if (check("DBTCIndex::loadInlineTiles() SELECT LOBLOCATOR"))
throw r_Error(r_Error::r_Error_ObjectUnknown);
if (loblength != 0)
{
theblob = (char*)mymalloc(loblength * sizeof(char));
}
inlineTiles = DBObjectPMap();
InlineTile* t = NULL;
char* end = (theblob + loblength);
RMDBGMIDDLE(3, RMDebug::module_indexif, "DBTCIndex", "end is at " << (r_Bytes)end);
while (theblob != end)
{
RMDBGMIDDLE(3, RMDebug::module_indexif, "DBTCIndex", "reading from " << (r_Bytes)theblob);
t = new InlineTile(myOId, theblob);
t->setCached(true);
DBObjectPPair p(t->getOId(), t);
inlineTiles.insert(p);
}
#ifdef RMANBENCHMARK
DBObject::readTimer.pause();
#endif
_isLoaded = true;
inlineTileHasChanged = false;
mappingHasChanged = false;
RMDBGEXIT(3, RMDebug::module_indexif, "DBTCIndex", "readInlineTiles() " << myOId);
*/
}
void
DBTCIndex::updateTileIndexMappings() throw (r_Error)
{
RMDBGENTER(5, RMDebug::module_indexif, "DBTCIndex", "updateTileIndexMappings() " << myOId);
throw r_Error( r_Error::r_Error_BaseDBMSFailed );
EXEC SQL BEGIN DECLARE SECTION;
long indexid;
long inlineid;
EXEC SQL END DECLARE SECTION;
indexid = myOId.getCounter();
TALK( "EXEC SQL DELETE FROM RAS_ITMAP WHERE IndexId = " << indexid );
EXEC SQL DELETE FROM
RAS_ITMAP
WHERE
IndexId = :indexid;
DBObjectPMap::iterator itit;
for (itit = inlineTiles.begin(); itit != inlineTiles.end(); itit++)
{
inlineid = OId((*itit).first).getCounter();
TALK( "EXEC SQL INSERT INTO RAS_ITMAP ( TileId, IndexId) VALUES ( " << inlineid << "," << indexid << ")" );
EXEC SQL INSERT INTO RAS_ITMAP (
TileId,
IndexId
)
VALUES (
:inlineid,
:indexid
);
RMDBGMIDDLE(6, RMDebug::module_indexif, "DBTCIndex", "TileId: " << inlineid << " IndexId: " << indexid);
if (check("DBTCIndex::updateTileIndexMappings() insert in RAS_ITMAP") != 0)
generateException();
}
mappingHasChanged = false;
RMDBGEXIT(5, RMDebug::module_indexif, "DBTCIndex", "updateTileIndexMappings() " << myOId);
}