#include "odbc-column.h" #include "column.h" #include "odbc-error.h" #include "odbc-param_fwd.h" #include "odbc-selectcommand.h" #include #include #include #include namespace Glib { class ustring; } ODBC::Column::Column(SelectCommand * sc, const Glib::ustring & s, unsigned int i) : DB::Column(s, i), selectCmd(sc) { bindLen = 0; } bool ODBC::Column::resize() { return false; } bool ODBC::CharArrayColumn::resize() { if (bindLen >= SQLLEN(data.size())) { data.resize(static_cast(bindLen + 1)); Column::bind(); if (paramCmd) { paramBound = false; Param::bind(); } return true; } return false; } bool ODBC::Column::isNull() const { return (bindLen == SQL_NULL_DATA); } void ODBC::Column::bind() { RETCODE rc = SQLBindCol(selectCmd->hStmt, static_cast(colNo + 1), ctype(), rwDataAddress(), static_cast(size()), &bindLen); if (!SQL_SUCCEEDED(rc)) { throw Error(rc, SQL_HANDLE_STMT, selectCmd->hStmt); } } void ODBC::SignedIntegerColumn::apply(DB::HandleField & h) const { if (isNull()) { return h.null(); } h.integer(data); } void ODBC::FloatingPointColumn::apply(DB::HandleField & h) const { if (isNull()) { return h.null(); } h.floatingpoint(data); } void ODBC::CharArrayColumn::apply(DB::HandleField & h) const { if (isNull()) { return h.null(); } h.string({data.data(), static_cast(bindLen)}); } void ODBC::TimeStampColumn::apply(DB::HandleField & h) const { if (isNull()) { return h.null(); } h.timestamp(boost::posix_time::ptime( boost::gregorian::date(static_cast(data.year), static_cast(data.month), static_cast(data.day)), boost::posix_time::time_duration(data.hour, data.minute, data.second, data.fraction))); } void ODBC::IntervalColumn::apply(DB::HandleField & h) const { if (isNull()) { return h.null(); } auto dur = boost::posix_time::time_duration((24 * data.intval.day_second.day) + data.intval.day_second.hour, data.intval.day_second.minute, data.intval.day_second.second, data.intval.day_second.fraction); h.interval(data.interval_sign ? -dur : dur); }