void Cask::CdapOdbc::DataReader::fetchWVarchar(const wchar_t* str, const ColumnBinding& binding) { assert(binding.getTargetType() == SQL_WCHAR || binding.getTargetType() == SQL_DEFAULT); if (str) { std::wstring uniStr = str; size_t maxLength = static_cast<size_t>(binding.getBufferLength()) - 1; size_t size = (uniStr.size() < maxLength) ? uniStr.size() : maxLength; if (binding.getTargetValuePtr()) { wchar_t* outString = static_cast<wchar_t*>(binding.getTargetValuePtr()); auto it = stdext::make_checked_array_iterator<wchar_t*>(outString, size); std::copy(uniStr.begin(), uniStr.begin() + size, it); outString[size] = 0; } if (binding.getStrLenOrInd()) { if (size <= maxLength) { *binding.getStrLenOrInd() = size; } else { *binding.getStrLenOrInd() = SQL_NO_TOTAL; } } } else { if (binding.getTargetValuePtr() && binding.getBufferLength() > 0) { wchar_t* outString = static_cast<wchar_t*>(binding.getTargetValuePtr()); outString[0] = 0; } if (binding.getStrLenOrInd()) { *binding.getStrLenOrInd() = SQL_NULL_DATA; } } }
void Cask::CdapOdbc::DataReader::fetchValue(const web::json::value& value, const ColumnBinding& binding) { std::wstring strValue; SQLDOUBLE dblValue = NAN; switch (binding.getTargetType()) { case SQL_CHAR: strValue = to_wstring(value); this->fetchVarchar(strValue.c_str(), binding); break; case SQL_WCHAR: strValue = to_wstring(value); this->fetchWVarchar(strValue.c_str(), binding); break; case SQL_DOUBLE: if (value.is_string()) { dblValue = std::wcstod(value.as_string().c_str(), nullptr); } else if (value.is_integer()) { dblValue = value.as_integer(); } else if (value.is_double()) { dblValue = value.as_double(); } else if (value.is_number()) { dblValue = value.as_number().to_double(); } else if (value.is_boolean()) { dblValue = value.as_bool() ? 1.0 : 0.0; } this->fetchDouble(dblValue, binding); break; } }
void Cask::CdapOdbc::DataReader::fetchInt(SQLINTEGER value, const ColumnBinding& binding) { assert(binding.getTargetType() == SQL_C_SLONG || binding.getTargetType() == SQL_DEFAULT); *(reinterpret_cast<SQLINTEGER*>(binding.getTargetValuePtr())) = value; }
void Cask::CdapOdbc::DataReader::fetchDouble(SQLDOUBLE value, const ColumnBinding& binding) { assert(binding.getTargetType() == SQL_DOUBLE || binding.getTargetType() == SQL_DEFAULT); *(reinterpret_cast<SQLDOUBLE*>(binding.getTargetValuePtr())) = value; }
void Cask::CdapOdbc::DataReader::fetchSmallint(SQLSMALLINT value, const ColumnBinding& binding) { assert(binding.getTargetType() == SQL_C_SSHORT || binding.getTargetType() == SQL_DEFAULT); *(reinterpret_cast<SQLSMALLINT*>(binding.getTargetValuePtr())) = value; }