IGNITE-4113: Added tests. Added Statement::Set/GetAttribute.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a98804a2 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a98804a2 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a98804a2 Branch: refs/heads/ignite-4242 Commit: a98804a249496ba9bafbc96daa7aaf25b3d36724 Parents: fc7ce5a Author: Igor Sapego <[email protected]> Authored: Mon Nov 7 14:00:00 2016 +0300 Committer: Igor Sapego <[email protected]> Committed: Mon Nov 7 14:00:00 2016 +0300 ---------------------------------------------------------------------- .../cpp/odbc-test/src/api_robustness_test.cpp | 63 ++++++++ .../cpp/odbc-test/src/queries_test.cpp | 9 +- .../cpp/odbc/include/ignite/odbc/statement.h | 42 ++++++ modules/platforms/cpp/odbc/src/odbc.cpp | 116 +------------- modules/platforms/cpp/odbc/src/statement.cpp | 151 +++++++++++++++++++ 5 files changed, 268 insertions(+), 113 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/a98804a2/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp b/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp index 008cf25..fbd5f12 100644 --- a/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp @@ -161,6 +161,54 @@ struct ApiRobustnessTestSuiteFixture } /** + * Check that SQLFetchScroll does not crash with unsupported orientation. + * + * @param orientation Fetch orientation. + */ + void CheckFetchScrollUnsupportedOrientation(SQLUSMALLINT orientation) + { + Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;CACHE=cache"); + + SQLRETURN ret; + + const int64_t recordsNum = 100; + + for (int i = 0; i < recordsNum; ++i) + { + TestType val; + + val.i32Field = i * 10; + + testCache.Put(i, val); + } + + int32_t i32Field = -1; + + // Binding column. + ret = SQLBindCol(stmt, 1, SQL_C_SLONG, &i32Field, 0, 0); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + SQLCHAR request[] = "SELECT i32Field FROM TestType ORDER BY _key"; + + ret = SQLExecDirect(stmt, request, SQL_NTS); + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + ret = SQLFetchScroll(stmt, SQL_FETCH_NEXT, 0); + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + BOOST_CHECK_EQUAL(i32Field, 0); + + ret = SQLFetchScroll(stmt, orientation, 0); + + // Operation is not supported. However, there should be no crash. + BOOST_CHECK(ret == SQL_ERROR); + } + + /** * Destructor. */ ~ApiRobustnessTestSuiteFixture() @@ -1003,4 +1051,19 @@ BOOST_AUTO_TEST_CASE(TestSQLSpecialColumns) SQLCloseCursor(stmt); } +BOOST_AUTO_TEST_CASE(TestFetchScrollLast) +{ + CheckFetchScrollUnsupportedOrientation(SQL_FETCH_LAST); +} + +BOOST_AUTO_TEST_CASE(TestFetchScrollPrior) +{ + CheckFetchScrollUnsupportedOrientation(SQL_FETCH_PRIOR); +} + +BOOST_AUTO_TEST_CASE(TestFetchScrollFirst) +{ + CheckFetchScrollUnsupportedOrientation(SQL_FETCH_FIRST); +} + BOOST_AUTO_TEST_SUITE_END() http://git-wip-us.apache.org/repos/asf/ignite/blob/a98804a2/modules/platforms/cpp/odbc-test/src/queries_test.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc-test/src/queries_test.cpp b/modules/platforms/cpp/odbc-test/src/queries_test.cpp index eb6e153..82e9972 100644 --- a/modules/platforms/cpp/odbc-test/src/queries_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/queries_test.cpp @@ -200,6 +200,8 @@ struct QueriesTestSuiteFixture "floatField, doubleField, boolField, guidField, dateField, timestampField FROM TestType"; ret = SQLExecDirect(stmt, reinterpret_cast<SQLCHAR*>(request), SQL_NTS); + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); if (!SQL_SUCCEEDED(ret)) BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); @@ -364,6 +366,8 @@ BOOST_AUTO_TEST_CASE(TestTwoRowsString) "floatField, doubleField, boolField, guidField, dateField, timestampField FROM TestType"; ret = SQLExecDirect(stmt, request, SQL_NTS); + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); if (!SQL_SUCCEEDED(ret)) BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); @@ -460,6 +464,8 @@ BOOST_AUTO_TEST_CASE(TestOneRowString) "floatField, doubleField, boolField, guidField, dateField, timestampField FROM TestType"; ret = SQLExecDirect(stmt, request, SQL_NTS); + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); ret = SQLFetch(stmt); if (!SQL_SUCCEEDED(ret)) @@ -522,6 +528,8 @@ BOOST_AUTO_TEST_CASE(TestOneRowStringLen) "floatField, doubleField, boolField, guidField, dateField, timestampField FROM TestType"; ret = SQLExecDirect(stmt, request, SQL_NTS); + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); ret = SQLFetch(stmt); if (!SQL_SUCCEEDED(ret)) @@ -666,5 +674,4 @@ BOOST_AUTO_TEST_CASE(TestDataAtExecution) BOOST_CHECK(ret == SQL_NO_DATA); } - BOOST_AUTO_TEST_SUITE_END() http://git-wip-us.apache.org/repos/asf/ignite/blob/a98804a2/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h b/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h index 35f1e98..db6205e 100644 --- a/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h @@ -118,6 +118,25 @@ namespace ignite void UnbindAllParameters(); /** + * Set statement attribute. + * + * @param attr Attribute type. + * @param value Value pointer. + * @param valueLen Value length. + */ + void SetAttribute(int attr, void* value, SQLINTEGER valueLen); + + /** + * Get statement attribute. + * + * @param attr Attribute type. + * @param buf Buffer for value. + * @param bufLen Buffer length. + * @param valueLen Resulting value length. + */ + void GetAttribute(int attr, void* buf, SQLINTEGER bufLen, SQLINTEGER *valueLen); + + /** * Get number of binded parameters. * * @return Number of binded parameters. @@ -356,6 +375,29 @@ namespace ignite SqlResult InternalBindParameter(uint16_t paramIdx, const app::Parameter& param); /** + * Set statement attribute. + * Internal call. + * + * @param attr Attribute type. + * @param value Value pointer. + * @param valueLen Value length. + * @return Operation result. + */ + SqlResult InternalSetAttribute(int attr, void* value, SQLINTEGER valueLen); + + /** + * Get statement attribute. + * Internal call. + * + * @param attr Attribute type. + * @param buf Buffer for value. + * @param bufLen Buffer length. + * @param valueLen Resulting value length. + * @return Operation result. + */ + SqlResult InternalGetAttribute(int attr, void* buf, SQLINTEGER bufLen, SQLINTEGER* valueLen); + + /** * Get value of the column in the result set. * * @param columnIdx Column index. http://git-wip-us.apache.org/repos/asf/ignite/blob/a98804a2/modules/platforms/cpp/odbc/src/odbc.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/src/odbc.cpp b/modules/platforms/cpp/odbc/src/odbc.cpp index 7416ad2..612d51a 100644 --- a/modules/platforms/cpp/odbc/src/odbc.cpp +++ b/modules/platforms/cpp/odbc/src/odbc.cpp @@ -854,73 +854,9 @@ namespace ignite if (!statement) return SQL_INVALID_HANDLE; - if (!valueBuf) - return SQL_ERROR; - - switch (attr) - { - case SQL_ATTR_APP_ROW_DESC: - case SQL_ATTR_APP_PARAM_DESC: - case SQL_ATTR_IMP_ROW_DESC: - case SQL_ATTR_IMP_PARAM_DESC: - { - SQLPOINTER *val = reinterpret_cast<SQLPOINTER*>(valueBuf); - - *val = static_cast<SQLPOINTER>(stmt); - - break; - } - - case SQL_ATTR_ROW_ARRAY_SIZE: - { - SQLINTEGER *val = reinterpret_cast<SQLINTEGER*>(valueBuf); - - *val = static_cast<SQLINTEGER>(1); - - break; - } - - case SQL_ATTR_ROWS_FETCHED_PTR: - { - SQLULEN** val = reinterpret_cast<SQLULEN**>(valueBuf); - - *val = reinterpret_cast<SQLULEN*>(statement->GetRowsFetchedPtr()); - - break; - } + statement->GetAttribute(attr, valueBuf, valueBufLen, valueResLen); - case SQL_ATTR_ROW_STATUS_PTR: - { - SQLUSMALLINT** val = reinterpret_cast<SQLUSMALLINT**>(valueBuf); - - *val = reinterpret_cast<SQLUSMALLINT*>(statement->GetRowStatusesPtr()); - - break; - } - - case SQL_ATTR_PARAM_BIND_OFFSET_PTR: - { - SQLULEN** val = reinterpret_cast<SQLULEN**>(valueBuf); - - *val = reinterpret_cast<SQLULEN*>(statement->GetParamBindOffsetPtr()); - - break; - } - - case SQL_ATTR_ROW_BIND_OFFSET_PTR: - { - SQLULEN** val = reinterpret_cast<SQLULEN**>(valueBuf); - - *val = reinterpret_cast<SQLULEN*>(statement->GetColumnBindOffsetPtr()); - - break; - } - - default: - return SQL_ERROR; - } - - return SQL_SUCCESS; + return statement->GetDiagnosticRecords().GetReturnCode(); } SQLRETURN SQLSetStmtAttr(SQLHSTMT stmt, @@ -943,53 +879,9 @@ namespace ignite if (!statement) return SQL_INVALID_HANDLE; - switch (attr) - { - case SQL_ATTR_ROW_ARRAY_SIZE: - { - SQLULEN val = reinterpret_cast<SQLULEN>(value); - - LOG_MSG("Value: %d\n", val); - - if (val != 1) - return SQL_ERROR; - - break; - } - - case SQL_ATTR_ROWS_FETCHED_PTR: - { - statement->SetRowsFetchedPtr(reinterpret_cast<size_t*>(value)); - - break; - } - - case SQL_ATTR_ROW_STATUS_PTR: - { - statement->SetRowStatusesPtr(reinterpret_cast<uint16_t*>(value)); - - break; - } - - case SQL_ATTR_PARAM_BIND_OFFSET_PTR: - { - statement->SetParamBindOffsetPtr(reinterpret_cast<int*>(value)); - - break; - } - - case SQL_ATTR_ROW_BIND_OFFSET_PTR: - { - statement->SetColumnBindOffsetPtr(reinterpret_cast<int*>(value)); + statement->SetAttribute(attr, value, valueLen); - break; - } - - default: - return SQL_ERROR; - } - - return SQL_SUCCESS; + return statement->GetDiagnosticRecords().GetReturnCode(); } SQLRETURN SQLPrimaryKeys(SQLHSTMT stmt, http://git-wip-us.apache.org/repos/asf/ignite/blob/a98804a2/modules/platforms/cpp/odbc/src/statement.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/src/statement.cpp b/modules/platforms/cpp/odbc/src/statement.cpp index 32f7c3f..f1a577a 100644 --- a/modules/platforms/cpp/odbc/src/statement.cpp +++ b/modules/platforms/cpp/odbc/src/statement.cpp @@ -145,6 +145,157 @@ namespace ignite paramBindings.clear(); } + void Statement::SetAttribute(int attr, void* value, SQLINTEGER valueLen) + { + IGNITE_ODBC_API_CALL(InternalSetAttribute(attr, value, valueLen)); + } + + SqlResult Statement::InternalSetAttribute(int attr, void* value, SQLINTEGER valueLen) + { + switch (attr) + { + case SQL_ATTR_ROW_ARRAY_SIZE: + { + SQLULEN val = reinterpret_cast<SQLULEN>(value); + + LOG_MSG("SQL_ATTR_ROW_ARRAY_SIZE: %d\n", val); + + if (val != 1) + { + AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, + "Fetching of more than one row by call is not supported."); + + return SQL_RESULT_ERROR; + } + + break; + } + + case SQL_ATTR_ROWS_FETCHED_PTR: + { + SetRowsFetchedPtr(reinterpret_cast<size_t*>(value)); + + break; + } + + case SQL_ATTR_ROW_STATUS_PTR: + { + SetRowStatusesPtr(reinterpret_cast<uint16_t*>(value)); + + break; + } + + case SQL_ATTR_PARAM_BIND_OFFSET_PTR: + { + SetParamBindOffsetPtr(reinterpret_cast<int*>(value)); + + break; + } + + case SQL_ATTR_ROW_BIND_OFFSET_PTR: + { + SetColumnBindOffsetPtr(reinterpret_cast<int*>(value)); + + break; + } + + default: + { + AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, + "Specified attribute is not supported."); + + return SQL_RESULT_ERROR; + } + } + + return SQL_RESULT_SUCCESS; + } + + void Statement::GetAttribute(int attr, void* buf, SQLINTEGER bufLen, SQLINTEGER* valueLen) + { + IGNITE_ODBC_API_CALL(InternalGetAttribute(attr, buf, bufLen, valueLen)); + } + + SqlResult Statement::InternalGetAttribute(int attr, void* buf, SQLINTEGER bufLen, SQLINTEGER* valueLen) + { + if (!buf) + { + AddStatusRecord(SQL_STATE_HY000_GENERAL_ERROR, "Data buffer is NULL."); + + return SQL_RESULT_ERROR; + } + + switch (attr) + { + case SQL_ATTR_APP_ROW_DESC: + case SQL_ATTR_APP_PARAM_DESC: + case SQL_ATTR_IMP_ROW_DESC: + case SQL_ATTR_IMP_PARAM_DESC: + { + SQLPOINTER *val = reinterpret_cast<SQLPOINTER*>(buf); + + *val = static_cast<SQLPOINTER>(this); + + break; + } + + case SQL_ATTR_ROW_ARRAY_SIZE: + { + SQLINTEGER *val = reinterpret_cast<SQLINTEGER*>(buf); + + *val = static_cast<SQLINTEGER>(1); + + break; + } + + case SQL_ATTR_ROWS_FETCHED_PTR: + { + SQLULEN** val = reinterpret_cast<SQLULEN**>(buf); + + *val = reinterpret_cast<SQLULEN*>(GetRowsFetchedPtr()); + + break; + } + + case SQL_ATTR_ROW_STATUS_PTR: + { + SQLUSMALLINT** val = reinterpret_cast<SQLUSMALLINT**>(buf); + + *val = reinterpret_cast<SQLUSMALLINT*>(GetRowStatusesPtr()); + + break; + } + + case SQL_ATTR_PARAM_BIND_OFFSET_PTR: + { + SQLULEN** val = reinterpret_cast<SQLULEN**>(buf); + + *val = reinterpret_cast<SQLULEN*>(GetParamBindOffsetPtr()); + + break; + } + + case SQL_ATTR_ROW_BIND_OFFSET_PTR: + { + SQLULEN** val = reinterpret_cast<SQLULEN**>(buf); + + *val = reinterpret_cast<SQLULEN*>(GetColumnBindOffsetPtr()); + + break; + } + + default: + { + AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, + "Specified attribute is not supported."); + + return SQL_RESULT_ERROR; + } + } + + return SQL_RESULT_SUCCESS; + } + uint16_t Statement::GetParametersNumber() { IGNITE_ODBC_API_CALL_ALWAYS_SUCCESS;
