summaryrefslogtreecommitdiff
path: root/libodbcpp/odbc-column.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libodbcpp/odbc-column.cpp')
-rw-r--r--libodbcpp/odbc-column.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/libodbcpp/odbc-column.cpp b/libodbcpp/odbc-column.cpp
new file mode 100644
index 0000000..20c68f0
--- /dev/null
+++ b/libodbcpp/odbc-column.cpp
@@ -0,0 +1,106 @@
+#include <sqlext.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "odbc-column.h"
+#include "odbc-command.h"
+#include "odbc-selectcommand.h"
+#include "odbc-error.h"
+
+ODBC::Column::Column(SelectCommand * sc, const Glib::ustring & s, unsigned int i) :
+ DB::Column(s, i),
+ selectCmd(sc)
+{
+ bindLen = 0;
+}
+
+ODBC::Column::~Column()
+{
+}
+
+bool
+ODBC::Column::resize()
+{
+ return false;
+}
+
+bool
+ODBC::CharArrayColumn::resize()
+{
+ if (bindLen >= SQLLEN(data.size())) {
+ data.resize(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::rebind(DB::Command * cmd, unsigned int idx) const
+{
+ meAsAParam()->paramCmd = dynamic_cast<ODBC::Command *>(cmd);
+ meAsAParam()->paramIdx = idx;
+ meAsAParam()->bind();
+}
+
+void
+ODBC::Column::bind()
+{
+ RETCODE rc = SQLBindCol(selectCmd->hStmt, colNo + 1, ctype(), rwDataAddress(), size(), &bindLen);
+ if (!SQL_SUCCEEDED(rc)) {
+ throw Error(rc, SQL_HANDLE_STMT, selectCmd->hStmt, "ODBC::Column::bind");
+ }
+}
+
+ODBC::TimeStampColumn::operator boost::posix_time::ptime() const
+{
+ return boost::posix_time::ptime(
+ boost::gregorian::date(data.year, data.month, data.day),
+ boost::posix_time::time_duration(data.hour, data.minute, data.second, data.fraction));
+}
+ODBC::IntervalColumn::operator boost::posix_time::time_duration() const
+{
+ 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);
+ return (data.interval_sign ? -dur : dur);
+}
+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.front(), bindLen);
+}
+void
+ODBC::TimeStampColumn::apply(DB::HandleField & h) const
+{
+ if (isNull()) return h.null();
+ h.timestamp(*this);
+}
+void
+ODBC::IntervalColumn::apply(DB::HandleField & h) const
+{
+ if (isNull()) return h.null();
+ h.interval(*this);
+}