void setTextParam(char const * s, std::size_t size, char * buf_, XSQLVAR * var) { //std::cerr << "setTextParam: var->sqltype=" << var->sqltype << std::endl; short sz = 0; if (size < static_cast<std::size_t>(var->sqllen)) { sz = static_cast<short>(size); } else { sz = var->sqllen; } if ((var->sqltype & ~1) == SQL_VARYING) { std::memcpy(buf_, &sz, sizeof(short)); std::memcpy(buf_ + sizeof(short), s, sz); } else if ((var->sqltype & ~1) == SQL_TEXT) { std::memcpy(buf_, s, sz); if (sz < var->sqllen) { std::memset(buf_+sz, ' ', var->sqllen - sz); } } else if ((var->sqltype & ~1) == SQL_SHORT) { parse_decimal<short, unsigned short>(buf_, var, s); } else if ((var->sqltype & ~1) == SQL_LONG) { parse_decimal<int, unsigned int>(buf_, var, s); } else if ((var->sqltype & ~1) == SQL_INT64) { parse_decimal<long long, unsigned long long>(buf_, var, s); } else if ((var->sqltype & ~1) == SQL_TIMESTAMP || (var->sqltype & ~1) == SQL_TYPE_DATE) { unsigned short year, month, day, hour, min, sec; if (std::sscanf(s, "%hu-%hu-%hu %hu:%hu:%hu", &year, &month, &day, &hour, &min, &sec) != 6) { if (std::sscanf(s, "%hu-%hu-%huT%hu:%hu:%hu", &year, &month, &day, &hour, &min, &sec) != 6) { hour = min = sec = 0; if (std::sscanf(s, "%hu-%hu-%hu", &year, &month, &day) != 3) { throw soci_error("Could not parse timestamp value."); } } } std::tm t; std::memset(&t, 0, sizeof(t)); t.tm_year = year - 1900; t.tm_mon = month - 1; t.tm_mday = day; t.tm_hour = hour; t.tm_min = min; t.tm_sec = sec; std::memcpy(buf_, &t, sizeof(t)); tmEncode(var->sqltype, &t, buf_); } else if ((var->sqltype & ~1) == SQL_TYPE_TIME) { unsigned short hour, min, sec; if (std::sscanf(s, "%hu:%hu:%hu", &hour, &min, &sec) != 3) { throw soci_error("Could not parse timestamp value."); } std::tm t; std::memset(&t, 0, sizeof(t)); t.tm_hour = hour; t.tm_min = min; t.tm_sec = sec; std::memcpy(buf_, &t, sizeof(t)); tmEncode(var->sqltype, &t, buf_); } else { throw soci_error("Unexpected string type."); } }
void setTextParam(char const * s, std::size_t size, char * buf_, XSQLVAR * var) { int const sqltype = var->sqltype & ~1; if (sqltype == SQL_VARYING || sqltype == SQL_TEXT) { if (size > static_cast<std::size_t>(var->sqllen)) { std::ostringstream msg; msg << "Value \"" << s << "\" is too long (" << size << " bytes) to be stored in column of size " << var->sqllen << " bytes"; throw soci_error(msg.str()); } short const sz = static_cast<short>(size); if (sqltype == SQL_VARYING) { std::memcpy(buf_, &sz, sizeof(short)); std::memcpy(buf_ + sizeof(short), s, sz); } else // sqltype == SQL_TEXT { std::memcpy(buf_, s, sz); if (sz < var->sqllen) { std::memset(buf_+sz, ' ', var->sqllen - sz); } } } else if (sqltype == SQL_SHORT) { parse_decimal<short, unsigned short>(buf_, var, s); } else if (sqltype == SQL_LONG) { parse_decimal<int, unsigned int>(buf_, var, s); } else if (sqltype == SQL_INT64) { parse_decimal<long long, unsigned long long>(buf_, var, s); } else if (sqltype == SQL_TIMESTAMP || sqltype == SQL_TYPE_DATE) { unsigned short year, month, day, hour, min, sec; if (std::sscanf(s, "%hu-%hu-%hu %hu:%hu:%hu", &year, &month, &day, &hour, &min, &sec) != 6) { if (std::sscanf(s, "%hu-%hu-%huT%hu:%hu:%hu", &year, &month, &day, &hour, &min, &sec) != 6) { hour = min = sec = 0; if (std::sscanf(s, "%hu-%hu-%hu", &year, &month, &day) != 3) { throw soci_error("Could not parse timestamp value."); } } } std::tm t; std::memset(&t, 0, sizeof(t)); t.tm_year = year - 1900; t.tm_mon = month - 1; t.tm_mday = day; t.tm_hour = hour; t.tm_min = min; t.tm_sec = sec; std::memcpy(buf_, &t, sizeof(t)); tmEncode(var->sqltype, &t, buf_); } else if (sqltype == SQL_TYPE_TIME) { unsigned short hour, min, sec; if (std::sscanf(s, "%hu:%hu:%hu", &hour, &min, &sec) != 3) { throw soci_error("Could not parse timestamp value."); } std::tm t; std::memset(&t, 0, sizeof(t)); t.tm_hour = hour; t.tm_min = min; t.tm_sec = sec; std::memcpy(buf_, &t, sizeof(t)); tmEncode(var->sqltype, &t, buf_); } else { throw soci_error("Unexpected string type."); } }