fix: support bigger numbers, SQL_BIGINT v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Mon, 26 Oct 2020 00:00:35 +0100
branchv_0
changeset 53 cc6ffeba0fe5
parent 52 656b5aecd4a2
child 54 bc6e11cccdf4
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
src/PreparedStatement.cpp
src/PreparedStatement.h
src/ResultSet.cpp
--- 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) {