IGNITE-2223: Better support for the NUMERIC type.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2a1f1c0f Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2a1f1c0f Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2a1f1c0f Branch: refs/heads/ignite-1786 Commit: 2a1f1c0f5f32c56ba5a44588d6ed4702c9678a1d Parents: 0ea8e06 Author: isapego <[email protected]> Authored: Mon Jan 11 18:52:36 2016 +0300 Committer: isapego <[email protected]> Committed: Mon Jan 11 18:52:36 2016 +0300 ---------------------------------------------------------------------- .../include/ignite/odbc/type_traits.h | 30 ++++++++++---------- .../src/app/application_data_buffer.cpp | 26 +++++++++++++++++ 2 files changed, 41 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/2a1f1c0f/modules/platforms/cpp/odbc/odbc-driver/include/ignite/odbc/type_traits.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/include/ignite/odbc/type_traits.h b/modules/platforms/cpp/odbc/odbc-driver/include/ignite/odbc/type_traits.h index 0bdb5ab..7dac73f 100644 --- a/modules/platforms/cpp/odbc/odbc-driver/include/ignite/odbc/type_traits.h +++ b/modules/platforms/cpp/odbc/odbc-driver/include/ignite/odbc/type_traits.h @@ -55,49 +55,49 @@ namespace ignite /** Alias for the SQL_C_USHORT type. */ IGNITE_ODBC_C_TYPE_UNSIGNED_SHORT, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_SLONG type. */ IGNITE_ODBC_C_TYPE_SIGNED_LONG, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_ULONG type. */ IGNITE_ODBC_C_TYPE_UNSIGNED_LONG, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_FLOAT type. */ IGNITE_ODBC_C_TYPE_FLOAT, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_DOUBLE type. */ IGNITE_ODBC_C_TYPE_DOUBLE, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_BIT type. */ IGNITE_ODBC_C_TYPE_BIT, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_STINYINT type. */ IGNITE_ODBC_C_TYPE_SIGNED_TINYINT, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_UTINYINT type. */ IGNITE_ODBC_C_TYPE_UNSIGNED_TINYINT, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_SBIGINT type. */ IGNITE_ODBC_C_TYPE_SIGNED_BIGINT, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_UBIGINT type. */ IGNITE_ODBC_C_TYPE_UNSIGNED_BIGINT, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_BINARY type. */ IGNITE_ODBC_C_TYPE_BINARY, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_TDATE type. */ IGNITE_ODBC_C_TYPE_TDATE, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_TTIME type. */ IGNITE_ODBC_C_TYPE_TTIME, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_TTIMESTAMP type. */ IGNITE_ODBC_C_TYPE_TTIMESTAMP, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_NUMERIC type. */ IGNITE_ODBC_C_TYPE_NUMERIC, - /** Alias for the SQL_C_WCHAR type. */ + /** Alias for the SQL_C_GUID type. */ IGNITE_ODBC_C_TYPE_GUID, /** Alias for the SQL_DEFAULT. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/2a1f1c0f/modules/platforms/cpp/odbc/odbc-driver/src/app/application_data_buffer.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/app/application_data_buffer.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/app/application_data_buffer.cpp index 36204cb..e3e4400 100644 --- a/modules/platforms/cpp/odbc/odbc-driver/src/app/application_data_buffer.cpp +++ b/modules/platforms/cpp/odbc/odbc-driver/src/app/application_data_buffer.cpp @@ -154,6 +154,8 @@ namespace ignite out->scale = 0; out->sign = value > 0 ? 1 : 0; + memset(out->val, 0, SQL_MAX_NUMERIC_LEN); + // TODO: implement propper conversation to numeric type. int64_t intVal = static_cast<int64_t>(std::abs(value)); @@ -541,6 +543,7 @@ namespace ignite break; } + case IGNITE_ODBC_C_TYPE_NUMERIC: case IGNITE_ODBC_C_TYPE_DOUBLE: { std::stringstream converter; @@ -701,6 +704,29 @@ namespace ignite break; } + case IGNITE_ODBC_C_TYPE_NUMERIC: + { + const SQL_NUMERIC_STRUCT* numeric = + reinterpret_cast<const SQL_NUMERIC_STRUCT*>(GetData()); + + int64_t resInt; + + // TODO: implement propper conversation from numeric type. + memcpy(&resInt, numeric->val, std::min<int>(SQL_MAX_NUMERIC_LEN, sizeof(resInt))); + + if (numeric->sign) + resInt *= -1; + + double resDouble = static_cast<double>(resInt); + + for (SQLSCHAR scale = numeric->scale; scale > 0; --scale) + resDouble /= 10.0; + + res = static_cast<T>(resDouble); + + break; + } + default: break; }
