diff options
author | randomdan <randomdan@localhost> | 2010-09-13 19:57:25 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2010-09-13 19:57:25 +0000 |
commit | 95bc5ac789c2f29220f76c94fc93d6379dcd00c6 (patch) | |
tree | 2af19c25a48dfb13b2db681544ad6fa82407c567 /libodbcpp/selectcommand.cpp | |
parent | Use the right header for BUFSIZ (diff) | |
download | libdbpp-odbc-95bc5ac789c2f29220f76c94fc93d6379dcd00c6.tar.bz2 libdbpp-odbc-95bc5ac789c2f29220f76c94fc93d6379dcd00c6.tar.xz libdbpp-odbc-95bc5ac789c2f29220f76c94fc93d6379dcd00c6.zip |
Remove duplication in ODBC::Connection constructors
Remove pointless specialisation on _Column for strings
Set cursor type to scrollable (required to refetch a row)
Resize binds if fetched data is truncated
Support scrolling fetch (default is old 'next record' behaviour)
Diffstat (limited to 'libodbcpp/selectcommand.cpp')
-rw-r--r-- | libodbcpp/selectcommand.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/libodbcpp/selectcommand.cpp b/libodbcpp/selectcommand.cpp index 88a071f..3b903d6 100644 --- a/libodbcpp/selectcommand.cpp +++ b/libodbcpp/selectcommand.cpp @@ -3,6 +3,7 @@ #include "column.h" #include <sqlext.h> #include <stdio.h> +#include <string.h> ODBC::SelectCommand::SelectCommand(const Connection & c, const std::string & s) : Command(c, s) @@ -26,12 +27,12 @@ ODBC::SelectCommand::~SelectCommand() } bool -ODBC::SelectCommand::fetch() +ODBC::SelectCommand::fetch(SQLSMALLINT orientation, SQLLEN offset) { if (columns.size() == 0) { execute(); } - RETCODE rc = SQLFetch(hStmt); + RETCODE rc = SQLFetchScroll(hStmt, orientation, offset); switch (rc) { case SQL_SUCCESS: for (Columns::iterator i = columns.begin(); i != columns.end(); i++) { @@ -42,6 +43,18 @@ ODBC::SelectCommand::fetch() case SQL_NO_DATA: return false; default: + { + SQLCHAR sqlstatus[5]; + RETCODE diagrc = SQLGetDiagRec(SQL_HANDLE_STMT, hStmt, 1, sqlstatus, NULL, NULL, 0, NULL); + if (SQL_SUCCEEDED(diagrc)) { + if (!strncmp((const char*)sqlstatus, "01004", 5)) { + for (Columns::iterator i = columns.begin(); i != columns.end(); i++) { + (*i)->resize(hStmt); + } + return fetch(SQL_FETCH_RELATIVE, 0); + } + } + } throw Error(rc, SQL_HANDLE_STMT, hStmt, "%s: SQLFetch", __FUNCTION__); } @@ -87,7 +100,7 @@ ODBC::SelectCommand::execute() case SQL_VARCHAR: case SQL_LONGVARCHAR: { - _Column<SQLCHARVEC>* s = new _Column<SQLCHARVEC>(colName, col); + StringColumn* s = new StringColumn(colName, col); s->value.resize(bindSize + 1); s->bind(hStmt, sqlcol, SQL_C_CHAR, &s->value[0], bindSize + 1); columns[col] = s; |