Commit c55e2872 authored by Marco De Marco's avatar Marco De Marco
Browse files

Read key and extract key function refactored

parent bdc03726
Loading
Loading
Loading
Loading
+71 −24
Original line number Diff line number Diff line
@@ -353,7 +353,7 @@ void WorkerThread::execQuery(ConnectionManager::SessionSP session_sp,
		try
		{
			//Search for primary fits key
			value = readKey(phdu, (*it)->getFitsPrimary());	
			value = readKey(phdu, (*it)->getFitsPrimary(), (*it)->getColumnType());	

			insertQuery << "," << (*it)->getColumnName();
			valuesQuery << "," << value;
@@ -363,7 +363,7 @@ void WorkerThread::execQuery(ConnectionManager::SessionSP session_sp,
			try
			{
				//Search for secondary fits key (alias)
				value = readKey(phdu, (*it)->getFitsSecondary());
				value = readKey(phdu, (*it)->getFitsSecondary(), (*it)->getColumnType());

				insertQuery << "," << (*it)->getColumnName();
				valuesQuery << "," << value;
@@ -389,69 +389,116 @@ void WorkerThread::execQuery(ConnectionManager::SessionSP session_sp,
//==============================================================================
//	WorkerThread::readKey()
//==============================================================================
std::string WorkerThread::readKey(CCfits::PHDU& phdu, std::string keyName)
	throw(CCfits::FitsException, std::runtime_error)
std::string WorkerThread::readKey(CCfits::PHDU& phdu, std::string keyName, 
    std::string dMDBKeyType) throw(CCfits::FitsException, std::runtime_error)	
{
    DEBUG_STREAM << "WorkerThread::readKey()" << endl;
        
	int keyType = phdu.keyWord(keyName).keytype();
    //Use this place to add special parsing if necessary
    //accordingly with data model database mapping
    
    std::stringstream result_stream;
    
    if(dMDBKeyType.compare("varchar")==0 ||
        dMDBKeyType.compare("char")==0)
    {
        result_stream << "\'" << extractKey(phdu, keyName, dMDBKeyType) << "\'";
    }
    else if(dMDBKeyType.compare("date")==0 ||
        dMDBKeyType.compare("datetime")==0 ||
        dMDBKeyType.compare("time")==0 ||
        dMDBKeyType.compare("timestamp")==0)
    {
        result_stream << "\'" << extractKey(phdu, keyName, dMDBKeyType) << "\'";
    }
    else
    {
        result_stream << extractKey(phdu, keyName, dMDBKeyType);
    }
    
    return result_stream.str();
}

//==============================================================================
//	WorkerThread::extractKey()
//==============================================================================
std::string WorkerThread::extractKey(CCfits::PHDU& phdu, std::string keyName, 
    std::string dMDBKeyType) throw(CCfits::FitsException, std::runtime_error)	
{
    DEBUG_STREAM << "WorkerThread::extractKey()" << endl;

	int fitsKeyType = phdu.keyWord(keyName).keytype();

#ifdef VERBOSE_DEBUG
    INFO_STREAM << "KEY: " << keyName << " " << fitsKeyType 
        << " -> " << dMDBKeyType << endl;
    INFO_STREAM << "-------------------------------------------------" << endl;
#endif    
    
    DEBUG_STREAM << "WorkerThread::readKey() key " << keyName.c_str()
            << " value " << keyType << endl;
    std::stringstream result_stream;
    
	switch(keyType)
	switch(fitsKeyType)
	{
		case TSTRING:
		{
			std::string value;
			return readKeyType(phdu, keyName, value); 
		}
            phdu.readKey(keyName, value);
            result_stream << value;
            break;
            
		}
		case TINT: case TSHORT: case TLOGICAL: case TSBYTE:
		{
			int value = 0;
			return readKeyType(phdu, keyName, value);
            phdu.readKey(keyName, value);
            result_stream << value;
            break;
		}

		case TUINT: case TUSHORT: case TBIT: case TBYTE:
		{
			unsigned int value = 0;
			return readKeyType(phdu, keyName, value);
            phdu.readKey(keyName, value);
            result_stream << value;
            break;
		}

		case TULONG:
		{
			unsigned long value = 0;
			return readKeyType(phdu, keyName, value);
            phdu.readKey(keyName, value);
            result_stream << value;
            break;
		}

		case TLONG:
		{
			long value = 0;
			return readKeyType(phdu, keyName, value);
            phdu.readKey(keyName, value);
            result_stream << value;
            break;
		}

		case TLONGLONG:
		{
			long long value = 0;
			return readKeyType(phdu, keyName, value);
            phdu.readKey(keyName, value);
            result_stream << value;
            break;
		}

		case TDOUBLE: case TFLOAT:
		{
			double value = 0;
			return readKeyType(phdu, keyName, value);
            phdu.readKey(keyName, value);
            result_stream << value;
            break;
		}

		case TCOMPLEX: case TDBLCOMPLEX:
		{	
			//TODO: [WARNING] complex case
			throw std::runtime_error("Not yet implemented fits type");
			std::runtime_error("Not yet implemented fits type");
		}

		default:
			throw std::runtime_error("Unknown fits type");
	}
    
    return result_stream.str();
}

//==============================================================================
+5 −26
Original line number Diff line number Diff line
@@ -64,7 +64,10 @@ protected:
		boost::gregorian::date&, int, boost::filesystem::path&,
		CCfits::PHDU&) throw(CCfits::FitsException, std::runtime_error);

	virtual std::string readKey(CCfits::PHDU&, std::string)
	virtual std::string readKey(CCfits::PHDU&, std::string, std::string)
		throw(CCfits::FitsException, std::runtime_error);    
    
	virtual std::string extractKey(CCfits::PHDU&, std::string, std::string)
		throw(CCfits::FitsException, std::runtime_error);

	virtual void moveFile(boost::filesystem::path&, Destination::SP,
@@ -73,30 +76,6 @@ protected:
	virtual boost::gregorian::date parseDate(std::string)
		throw(boost::bad_lexical_cast, std::runtime_error);
      
//------------------------------------------------------------------------------
//	[Protected] Template methods
//------------------------------------------------------------------------------
	template <class T>
	std::string readKeyType(CCfits::PHDU& phdu, std::string keyName, T t)
	{
		phdu.readKey(keyName, t);
		
		std::stringstream value;
		value << t;

		return value.str();
	}

	std::string readKeyType(CCfits::PHDU& phdu,std::string keyName, std::string t)
	{
		phdu.readKey(keyName, t);
		
		std::stringstream value;
		value << "\'" << t << "\'";

		return value.str();
	}

//------------------------------------------------------------------------------
//	[Protected] Class variables
//------------------------------------------------------------------------------