fix: support bigger numbers, SQL_BIGINT
there was an overflow and some values resulted into negative ones.
TODO: there is still a problem with big negative numbers – this needs to be addressed in relpipe-lib-writer/relpipe-lib-reader
--- a/src/PreparedStatement.cpp Sat Oct 24 00:08:19 2020 +0200
+++ b/src/PreparedStatement.cpp Mon Oct 26 00:00:35 2020 +0100
@@ -63,8 +63,8 @@
}
void PreparedStatement::setInteger(int parameterNumber, relpipe::reader::integer_t value) {
- integerParameters.emplace_back(value);
- SQLRETURN result = SQLBindParameter(statement, parameterNumber, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &integerParameters.back(), 0, nullptr);
+ integerParameters.emplace_back(std::to_string(value));
+ SQLRETURN result = SQLBindParameter(statement, parameterNumber, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_BIGINT, 0, 0, (void *) integerParameters.back().c_str(), 0, nullptr);
if (OdbcCommon::isNotSuccessful(result)) throw SqlException(L"Unable to set integer parameter in prepared statement", result, SQL_HANDLE_STMT, statement);
}
--- a/src/PreparedStatement.h Sat Oct 24 00:08:19 2020 +0200
+++ b/src/PreparedStatement.h Mon Oct 26 00:00:35 2020 +0100
@@ -35,7 +35,7 @@
void* statement;
std::wstring_convert<std::codecvt_utf8<wchar_t>> convertor; // TODO: support also other encodings
std::list<relpipe::reader::boolean_t> booleanParameters;
- std::list<relpipe::reader::integer_t> integerParameters;
+ std::list<std::string> integerParameters;
std::list<std::pair<std::string, long>> stringParameters;
public:
PreparedStatement(void* stmt);
--- a/src/ResultSet.cpp Sat Oct 24 00:08:19 2020 +0200
+++ b/src/ResultSet.cpp Mon Oct 26 00:00:35 2020 +0100
@@ -55,7 +55,7 @@
// TODO: get integer directly from SQLGetData() without string conversion
relpipe::writer::string_t s = getString(columnNumber, isNull);
if (isNull && *isNull) return 0;
- else return std::stol(s);
+ else return std::stoll(s);
}
relpipe::writer::string_t ResultSet::getString(unsigned short columnNumber, bool* isNull) {