You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by av...@apache.org on 2016/11/24 13:24:18 UTC

[08/50] [abbrv] ignite git commit: IGNITE-4113: Added tests. Added Statement::Set/GetAttribute.

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 <is...@gridgain.com>
Authored: Mon Nov 7 14:00:00 2016 +0300
Committer: Igor Sapego <is...@gridgain.com>
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;