IGNITE-6188: ODBC: Fix for SQLFreeStmt(SQL_CLOSE).
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/dc6b73b9 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/dc6b73b9 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/dc6b73b9 Branch: refs/heads/ignite-5896 Commit: dc6b73b94c091875d02965afd3bc4668a890fa52 Parents: 9d35ea0 Author: Igor Sapego <[email protected]> Authored: Mon Sep 4 15:34:59 2017 +0300 Committer: Igor Sapego <[email protected]> Committed: Mon Sep 4 15:34:59 2017 +0300 ---------------------------------------------------------------------- .../cpp/odbc-test/src/queries_test.cpp | 51 ++++++++++++++++++++ .../cpp/odbc/include/ignite/odbc/cursor.h | 7 +++ modules/platforms/cpp/odbc/src/cursor.cpp | 5 ++ .../platforms/cpp/odbc/src/query/data_query.cpp | 2 +- 4 files changed, 64 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/dc6b73b9/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 5d10a66..c7892ac 100644 --- a/modules/platforms/cpp/odbc-test/src/queries_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/queries_test.cpp @@ -1996,6 +1996,57 @@ BOOST_AUTO_TEST_CASE(TestExecuteAfterCursorClose) BOOST_CHECK_EQUAL(ret, SQL_NO_DATA); } +BOOST_AUTO_TEST_CASE(TestCloseNonFullFetch) +{ + TestType in1; + TestType in2; + + in1.strField = "str1"; + in2.strField = "str2"; + + cache1.Put(1, in1); + cache1.Put(2, in2); + + Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache"); + + int64_t key = 0; + char strField[1024] = { 0 }; + SQLLEN strFieldLen = 0; + + // Binding columns. + SQLRETURN ret = SQLBindCol(stmt, 1, SQL_C_SLONG, &key, 0, 0); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + // Binding columns. + ret = SQLBindCol(stmt, 2, SQL_C_CHAR, &strField, sizeof(strField), &strFieldLen); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + // Just selecting everything to make sure everything is OK + SQLCHAR selectReq[] = "SELECT _key, strField FROM TestType ORDER BY _key"; + + ret = SQLExecDirect(stmt, selectReq, sizeof(selectReq)); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + ret = SQLFetch(stmt); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + BOOST_CHECK_EQUAL(key, 1); + BOOST_CHECK_EQUAL(std::string(strField, strFieldLen), "str1"); + + ret = SQLFreeStmt(stmt, SQL_CLOSE); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); +} + BOOST_AUTO_TEST_CASE(TestBindNullParameter) { Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache"); http://git-wip-us.apache.org/repos/asf/ignite/blob/dc6b73b9/modules/platforms/cpp/odbc/include/ignite/odbc/cursor.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/cursor.h b/modules/platforms/cpp/odbc/include/ignite/odbc/cursor.h index fa6de30..c387f92 100644 --- a/modules/platforms/cpp/odbc/include/ignite/odbc/cursor.h +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/cursor.h @@ -70,6 +70,13 @@ namespace ignite bool HasData() const; /** + * Check whether cursor closed remotely. + * + * @return true, if the cursor closed remotely. + */ + bool IsClosedRemotely() const; + + /** * Get query ID. * * @return Query ID. http://git-wip-us.apache.org/repos/asf/ignite/blob/dc6b73b9/modules/platforms/cpp/odbc/src/cursor.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/src/cursor.cpp b/modules/platforms/cpp/odbc/src/cursor.cpp index 2648278..b41f5b1 100644 --- a/modules/platforms/cpp/odbc/src/cursor.cpp +++ b/modules/platforms/cpp/odbc/src/cursor.cpp @@ -64,6 +64,11 @@ namespace ignite currentPagePos < currentPage->GetSize(); } + bool Cursor::IsClosedRemotely() const + { + return currentPage.get() && currentPage->IsLast(); + } + void Cursor::UpdateData(std::auto_ptr<ResultPage>& newPage) { currentPage = newPage; http://git-wip-us.apache.org/repos/asf/ignite/blob/dc6b73b9/modules/platforms/cpp/odbc/src/query/data_query.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/src/query/data_query.cpp b/modules/platforms/cpp/odbc/src/query/data_query.cpp index f14d004..b9d551b 100644 --- a/modules/platforms/cpp/odbc/src/query/data_query.cpp +++ b/modules/platforms/cpp/odbc/src/query/data_query.cpp @@ -156,7 +156,7 @@ namespace ignite SqlResult::Type result = SqlResult::AI_SUCCESS; - if (cursor->HasData()) + if (!cursor->IsClosedRemotely()) result = MakeRequestClose(); if (result == SqlResult::AI_SUCCESS)
