Loading src/WorkerThread.cpp +71 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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(); } //============================================================================== Loading src/WorkerThread.h +5 −26 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 //------------------------------------------------------------------------------ Loading Loading
src/WorkerThread.cpp +71 −24 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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(); } //============================================================================== Loading
src/WorkerThread.h +5 −26 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 //------------------------------------------------------------------------------ Loading