diff --git a/src/backends/firebird/common.cpp b/src/backends/firebird/common.cpp index a5549244a..df0c7051d 100644 --- a/src/backends/firebird/common.cpp +++ b/src/backends/firebird/common.cpp @@ -10,7 +10,9 @@ #include // FireBird #include #include +#include #include +#include #include namespace soci @@ -82,6 +84,7 @@ void tmDecode(short type, void * src, std::tm * dst) 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(var->sqllen)) { @@ -105,6 +108,39 @@ void setTextParam(char const * s, std::size_t size, char * buf_, memset(buf_+sz, ' ', var->sqllen - sz); } } + else if ((var->sqltype & ~1) == SQL_INT64) + { + long long t; + std::stringstream input(s); + input >> t; + if (input.bad()) + throw soci_error("Could not parse integer value."); + memcpy(buf_, &t, sizeof(t)); + to_isc(buf_, var); + } + else if ((var->sqltype & ~1) == SQL_TIMESTAMP) + { + unsigned short year, month, day, hour, min, sec; + if (std::sscanf(s, "%hu-%hu-%huT%hu:%hu:%hu", + &year, &month, &day, &hour, &min, &sec) != 6) + { + if (std::sscanf(s, "%hu-%hu-%hu %hu:%hu:%hu", + &year, &month, &day, &hour, &min, &sec) != 6) + { + throw soci_error("Could not parse timestamp value."); + } + } + std::tm t; + 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; + memcpy(buf_, &t, sizeof(t)); + tmEncode(var->sqltype, &t, buf_); + } else { throw soci_error("Unexpected string type."); @@ -113,6 +149,7 @@ void setTextParam(char const * s, std::size_t size, char * buf_, std::string getTextParam(XSQLVAR const *var) { + std::cerr << "getTextParam: var->sqltype=" << var->sqltype << std::endl; short size; std::size_t offset = 0; diff --git a/src/backends/firebird/standard-use-type.cpp b/src/backends/firebird/standard-use-type.cpp index 1511e791e..282e29877 100644 --- a/src/backends/firebird/standard-use-type.cpp +++ b/src/backends/firebird/standard-use-type.cpp @@ -77,6 +77,7 @@ void firebird_standard_use_type_backend::bind_by_name( void firebird_standard_use_type_backend::pre_use(indicator const * ind) { + indISCHolder_ = 0; if (ind) { switch (*ind) @@ -97,6 +98,9 @@ void firebird_standard_use_type_backend::exchangeData() { XSQLVAR *var = statement_.sqlda2p_->sqlvar+position_; + if (0 != indISCHolder_) + return; + switch (type_) { case x_char: diff --git a/src/backends/firebird/statement.cpp b/src/backends/firebird/statement.cpp index a222e5467..13ed0ac19 100644 --- a/src/backends/firebird/statement.cpp +++ b/src/backends/firebird/statement.cpp @@ -10,6 +10,7 @@ #include "error-firebird.h" #include #include +#include using namespace soci; using namespace soci::details; @@ -286,6 +287,7 @@ void firebird_statement_backend::rewriteQuery( void firebird_statement_backend::prepare(std::string const & query, statement_type /* eType */) { + std::cerr << "prepare: query=" << query << std::endl; // clear named parametes names_.clear();