/*
* 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:
*
*
* COMMENTS:
*
************************************************************/
static const char rcsid[] = "@(#)qlparser, QtScalarData: $Header: /home/rasdev/CVS-repository/rasdaman/qlparser/qtscalardata.cc,v 1.17 2005/07/06 22:48:34 rasdev Exp $";
#include "qlparser/qtscalardata.hh"
#include "relcatalogif/basetype.hh"
#include "raslib/rmdebug.hh"
#include
#ifndef CPPSTDLIB
#include // STL
#else
#include
#include
#include
using namespace std;
#endif
#include
// deprecated, not available any longer -- PB 2005-jan-14
// #include
QtScalarData::QtScalarData()
: valueBuffer(NULL),
valueType(NULL)
{
}
QtScalarData::QtScalarData( const QtScalarData& obj )
: QtData( obj )
{
setLifetime( obj.getLifetime() );
// Pointer received from TypeFactory just can be copied.
valueType = obj.valueType;
if( valueType && obj.valueBuffer )
{
valueBuffer = new char[ valueType->getSize() ];
memcpy( (void*)valueBuffer, (void*)obj.valueBuffer, valueType->getSize() );
}
else
valueBuffer = NULL;
}
QtScalarData::~QtScalarData()
{
// valueType is not deleted because it is maintained by the typeFactory
if( valueBuffer )
{
delete[] valueBuffer;
valueBuffer=NULL;
}
}
QtDataType
QtScalarData::getDataType() const
{
QtDataType returnValue = QT_BOOL;
if( valueType )
switch( valueType->getType() )
{
case BOOLTYPE: returnValue = QT_BOOL; break;
case CHAR: returnValue = QT_CHAR; break;
case OCTET: returnValue = QT_OCTET; break;
case USHORT: returnValue = QT_USHORT; break;
case SHORT: returnValue = QT_SHORT; break;
case ULONG: returnValue = QT_ULONG; break;
case LONG: returnValue = QT_LONG; break;
case FLOAT: returnValue = QT_FLOAT; break;
case DOUBLE: returnValue = QT_DOUBLE; break;
case STRUCT: returnValue = QT_COMPLEX; break;
default:
RMDBGONCE(0, RMDebug::module_qlparser, "r_QtScalarData", "getDataType() bad type " << valueType->getType());
break;
}
return returnValue;
}
bool
QtScalarData::isScalarData() const
{
return true;
}
bool
QtScalarData::equal( const QtData* obj ) const
{
int returnValue = false; // not equal by initialization
if( obj->isScalarData() )
{
QtScalarData* scalarObj = (QtScalarData*)obj;
if( getDataType() == scalarObj->getDataType() ) // Attention: this is not correct for structs
// compare value buffers
returnValue = (memcmp( (void*)valueBuffer, (void*)scalarObj->valueBuffer, valueType->getSize() ) == 0);
}
return returnValue;
}
string
QtScalarData::getSpelling() const
{
string result;
// buffer for hex representation of chars
int bufferLen = valueType->getSize() * 2 + 1 + 2; // added final "+2" to remove memleak -- PB 2006-aug-17
char* buffer = new char[ bufferLen ];
// replaced deprecated ostrstream -- PB 2005-jan-14
// ostrstream bufferStream( buffer, bufferLen );
ostringstream bufferStream( buffer );
for( int i=0; igetSize(); i++ )
bufferStream << hex << valueBuffer[i];
bufferStream << ends;
result.append( string( buffer ) );
delete[] buffer;
buffer = NULL;
return result;
}
char* QtScalarData::getTypeStructure() const
{
if( valueType )
return valueType->getTypeStructure();
else
return NULL;
}
void
QtScalarData::printStatus( ostream& stream ) const
{
if( valueType )
{
char* typeStructure = valueType->getTypeStructure();
stream << "type: " << flush << valueType->getTypeName()
<< ", structure: " << flush << typeStructure
<< ", value: " << flush;
valueType->printCell( stream, valueBuffer );
free( typeStructure );
typeStructure=NULL;
QtData::printStatus( stream );
}
else
stream << "";
}