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)

Reply via email to