示例#1
0
文件: common.cpp 项目: AimuTran/avbot
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.");
    }
}
示例#2
0
文件: common.cpp 项目: ravselj/soci
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.");
    }
}