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;