IGNITE-4471: Fixed ODBC string-reading utility function This closes #1377
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8cffe900 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8cffe900 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8cffe900 Branch: refs/heads/ignite-2.0 Commit: 8cffe90010e1f0dbb0b93c33fe6a08bd27fa9477 Parents: dbc8a0f Author: Igor Sapego <[email protected]> Authored: Fri Dec 23 13:51:39 2016 +0300 Committer: Pavel Tupitsyn <[email protected]> Committed: Fri Dec 23 13:51:39 2016 +0300 ---------------------------------------------------------------------- .../processors/odbc/OdbcRequestHandler.java | 2 +- .../internal/processors/odbc/OdbcTableMeta.java | 15 +- .../cpp/odbc-test/config/queries-default.xml | 145 +++++++++++++++++++ .../odbc-test/config/queries-test-noodbc.xml | 84 +---------- .../cpp/odbc-test/config/queries-test.xml | 122 +--------------- .../cpp/odbc-test/src/queries_test.cpp | 76 ++++++++++ .../cpp/odbc-test/src/utility_test.cpp | 27 +++- modules/platforms/cpp/odbc/src/utility.cpp | 10 ++ 8 files changed, 271 insertions(+), 210 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequestHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequestHandler.java index 2e0fd10..f922d9a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequestHandler.java @@ -388,7 +388,7 @@ public class OdbcRequestHandler { if (!matches("TABLE", req.tableType())) continue; - OdbcTableMeta tableMeta = new OdbcTableMeta(req.catalog(), cacheName, table.name(), "TABLE"); + OdbcTableMeta tableMeta = new OdbcTableMeta(null, cacheName, table.name(), "TABLE"); if (!meta.contains(tableMeta)) meta.add(tableMeta); http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java index fb7df50..ca630dd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java @@ -19,6 +19,8 @@ package org.apache.ignite.internal.processors.odbc; import org.apache.ignite.internal.binary.BinaryRawWriterEx; +import java.util.Objects; + /** * ODBC table-related metadata. */ @@ -50,11 +52,11 @@ public class OdbcTableMeta { /** {@inheritDoc} */ @Override public int hashCode() { - int hash = catalog.hashCode(); + int hash = Objects.hashCode(catalog); - hash = 31 * hash + schema.hashCode(); - hash = 31 * hash + table.hashCode(); - hash = 31 * hash + tableType.hashCode(); + hash = 31 * hash + Objects.hashCode(schema); + hash = 31 * hash + Objects.hashCode(table); + hash = 31 * hash + Objects.hashCode(tableType); return hash; } @@ -64,8 +66,9 @@ public class OdbcTableMeta { if (o instanceof OdbcTableMeta) { OdbcTableMeta other = (OdbcTableMeta) o; - return this == other || catalog.equals(other.catalog) && schema.equals(other.schema) && - table.equals(other.table) && tableType.equals(other.tableType); + return this == other || + Objects.equals(catalog, other.catalog) && Objects.equals(schema, other.schema) && + Objects.equals(table, other.table) && Objects.equals(tableType, other.tableType); } return false; http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/modules/platforms/cpp/odbc-test/config/queries-default.xml ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc-test/config/queries-default.xml b/modules/platforms/cpp/odbc-test/config/queries-default.xml new file mode 100644 index 0000000..6614e93 --- /dev/null +++ b/modules/platforms/cpp/odbc-test/config/queries-default.xml @@ -0,0 +1,145 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/util + http://www.springframework.org/schema/util/spring-util.xsd"> + + <bean abstract="true" id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> + <property name="localHost" value="127.0.0.1"/> + <property name="connectorConfiguration"><null/></property> + <!--<property name="odbcConfiguration"><null/></property>--> + + <property name="cacheConfiguration"> + <list> + <bean class="org.apache.ignite.configuration.CacheConfiguration"> + <property name="name" value="cache"/> + <property name="cacheMode" value="PARTITIONED"/> + <property name="atomicityMode" value="TRANSACTIONAL"/> + <property name="writeSynchronizationMode" value="FULL_SYNC"/> + + <!-- Configure type metadata to enable queries. --> + <property name="queryEntities"> + <list> + <bean class="org.apache.ignite.cache.QueryEntity"> + <property name="keyType" value="java.lang.Long"/> + <property name="valueType" value="TestType"/> + + <property name="fields"> + <map> + <entry key="i8Field" value="java.lang.Byte"/> + <entry key="i16Field" value="java.lang.Short"/> + <entry key="i32Field" value="java.lang.Integer"/> + <entry key="i64Field" value="java.lang.Long"/> + <entry key="strField" value="java.lang.String"/> + <entry key="floatField" value="java.lang.Float"/> + <entry key="doubleField" value="java.lang.Double"/> + <entry key="boolField" value="java.lang.Boolean"/> + <entry key="guidField" value="java.util.UUID"/> + <entry key="dateField" value="java.util.Date"/> + <entry key="timestampField" value="java.sql.Timestamp"/> + </map> + </property> + + <property name="keyFields"> + <list></list> + </property> + + <property name="indexes"> + <list> + <bean class="org.apache.ignite.cache.QueryIndex"> + <constructor-arg value="i32Field"/> + </bean> + <bean class="org.apache.ignite.cache.QueryIndex"> + <constructor-arg value="i64Field"/> + </bean> + </list> + </property> + </bean> + </list> + </property> + </bean> + + <bean class="org.apache.ignite.configuration.CacheConfiguration"> + <property name="name" value="cache2"/> + <property name="cacheMode" value="PARTITIONED"/> + <property name="atomicityMode" value="TRANSACTIONAL"/> + <property name="writeSynchronizationMode" value="FULL_SYNC"/> + + <!-- Configure type metadata to enable queries. --> + <property name="queryEntities"> + <list> + <bean class="org.apache.ignite.cache.QueryEntity"> + <property name="keyType" value="java.lang.Long"/> + <property name="valueType" value="ComplexType"/> + + <property name="fields"> + <map> + <entry key="i32Field" value="java.lang.Integer"/> + <entry key="objField" value="TestObject"/> + <entry key="strField" value="java.lang.String"/> + </map> + </property> + + <property name="keyFields"> + <list></list> + </property> + + <property name="indexes"> + <list> + <bean class="org.apache.ignite.cache.QueryIndex"> + <constructor-arg value="i32Field"/> + </bean> + </list> + </property> + </bean> + </list> + </property> + </bean> + </list> + </property> + + <!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --> + <property name="discoverySpi"> + <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> + <property name="ipFinder"> + <!-- + Ignite provides several options for automatic discovery that can be used + instead os static IP based discovery. + --> + <!-- Uncomment static IP finder to enable static-based discovery of initial nodes. --> + <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> + <property name="addresses"> + <list> + <!-- In distributed environment, replace with actual host IP address. --> + <value>127.0.0.1:47500</value> + </list> + </property> + </bean> + </property> + <property name="socketTimeout" value="300" /> + </bean> + </property> + </bean> +</beans> http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/modules/platforms/cpp/odbc-test/config/queries-test-noodbc.xml ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc-test/config/queries-test-noodbc.xml b/modules/platforms/cpp/odbc-test/config/queries-test-noodbc.xml index 82173de..b21287f 100644 --- a/modules/platforms/cpp/odbc-test/config/queries-test-noodbc.xml +++ b/modules/platforms/cpp/odbc-test/config/queries-test-noodbc.xml @@ -22,86 +22,10 @@ xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/util - http://www.springframework.org/schema/util/spring-util.xsd"> - <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> - <property name="localHost" value="127.0.0.1"/> - <property name="connectorConfiguration"><null/></property> - <property name="odbcConfiguration"><null/></property> + http://www.springframework.org/schema/beans/spring-beans.xsd"> - <property name="cacheConfiguration"> - <list> - <bean class="org.apache.ignite.configuration.CacheConfiguration"> - <property name="name" value="cache"/> - <property name="cacheMode" value="PARTITIONED"/> - <property name="atomicityMode" value="TRANSACTIONAL"/> - <property name="writeSynchronizationMode" value="FULL_SYNC"/> + <!-- Imports no-ODBC Ignite configuration --> + <import resource="queries-default.xml"/> - <!-- Configure type metadata to enable queries. --> - <property name="queryEntities"> - <list> - <bean class="org.apache.ignite.cache.QueryEntity"> - <property name="keyType" value="java.lang.Long"/> - <property name="valueType" value="TestType"/> - - <property name="fields"> - <map> - <entry key="i8Field" value="java.lang.Byte"/> - <entry key="i16Field" value="java.lang.Short"/> - <entry key="i32Field" value="java.lang.Integer"/> - <entry key="i64Field" value="java.lang.Long"/> - <entry key="strField" value="java.lang.String"/> - <entry key="floatField" value="java.lang.Float"/> - <entry key="doubleField" value="java.lang.Double"/> - <entry key="boolField" value="java.lang.Boolean"/> - <entry key="guidField" value="java.util.UUID"/> - <entry key="dateField" value="java.util.Date"/> - <entry key="timestampField" value="java.sql.Timestamp"/> - </map> - </property> - - <property name="keyFields"> - <list></list> - </property> - - <property name="indexes"> - <list> - <bean class="org.apache.ignite.cache.QueryIndex"> - <constructor-arg value="i32Field"/> - </bean> - <bean class="org.apache.ignite.cache.QueryIndex"> - <constructor-arg value="i64Field"/> - </bean> - </list> - </property> - </bean> - </list> - </property> - </bean> - </list> - </property> - - <!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --> - <property name="discoverySpi"> - <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> - <property name="ipFinder"> - <!-- - Ignite provides several options for automatic discovery that can be used - instead os static IP based discovery. - --> - <!-- Uncomment static IP finder to enable static-based discovery of initial nodes. --> - <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> - <property name="addresses"> - <list> - <!-- In distributed environment, replace with actual host IP address. --> - <value>127.0.0.1:47500</value> - </list> - </property> - </bean> - </property> - <property name="socketTimeout" value="300" /> - </bean> - </property> - </bean> + <bean parent="ignite.cfg"/> </beans> http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/modules/platforms/cpp/odbc-test/config/queries-test.xml ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc-test/config/queries-test.xml b/modules/platforms/cpp/odbc-test/config/queries-test.xml index 906fadf..d08d4f1 100644 --- a/modules/platforms/cpp/odbc-test/config/queries-test.xml +++ b/modules/platforms/cpp/odbc-test/config/queries-test.xml @@ -22,129 +22,17 @@ xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/util - http://www.springframework.org/schema/util/spring-util.xsd"> - <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> - <property name="localHost" value="127.0.0.1"/> - <property name="connectorConfiguration"><null/></property> + http://www.springframework.org/schema/beans/spring-beans.xsd"> + <!-- Imports no-ODBC Ignite configuration --> + <import resource="queries-default.xml"/> + + <bean parent="ignite.cfg"> <!-- Enabling ODBC. --> <property name="odbcConfiguration"> <bean class="org.apache.ignite.configuration.OdbcConfiguration"> <property name="endpointAddress" value="127.0.0.1:11110"/> </bean> </property> - - <property name="cacheConfiguration"> - <list> - <bean class="org.apache.ignite.configuration.CacheConfiguration"> - <property name="name" value="cache"/> - <property name="cacheMode" value="PARTITIONED"/> - <property name="atomicityMode" value="TRANSACTIONAL"/> - <property name="writeSynchronizationMode" value="FULL_SYNC"/> - - <!-- Configure type metadata to enable queries. --> - <property name="queryEntities"> - <list> - <bean class="org.apache.ignite.cache.QueryEntity"> - <property name="keyType" value="java.lang.Long"/> - <property name="valueType" value="TestType"/> - - <property name="fields"> - <map> - <entry key="i8Field" value="java.lang.Byte"/> - <entry key="i16Field" value="java.lang.Short"/> - <entry key="i32Field" value="java.lang.Integer"/> - <entry key="i64Field" value="java.lang.Long"/> - <entry key="strField" value="java.lang.String"/> - <entry key="floatField" value="java.lang.Float"/> - <entry key="doubleField" value="java.lang.Double"/> - <entry key="boolField" value="java.lang.Boolean"/> - <entry key="guidField" value="java.util.UUID"/> - <entry key="dateField" value="java.util.Date"/> - <entry key="timestampField" value="java.sql.Timestamp"/> - </map> - </property> - - <property name="keyFields"> - <list></list> - </property> - - <property name="indexes"> - <list> - <bean class="org.apache.ignite.cache.QueryIndex"> - <constructor-arg value="i32Field"/> - </bean> - <bean class="org.apache.ignite.cache.QueryIndex"> - <constructor-arg value="i64Field"/> - </bean> - </list> - </property> - </bean> - </list> - </property> - </bean> - - <bean class="org.apache.ignite.configuration.CacheConfiguration"> - <property name="name" value="cache2"/> - <property name="cacheMode" value="PARTITIONED"/> - <property name="atomicityMode" value="TRANSACTIONAL"/> - <property name="writeSynchronizationMode" value="FULL_SYNC"/> - - <!-- Configure type metadata to enable queries. --> - <property name="queryEntities"> - <list> - <bean class="org.apache.ignite.cache.QueryEntity"> - <property name="keyType" value="java.lang.Long"/> - <property name="valueType" value="ComplexType"/> - - <property name="fields"> - <map> - <entry key="i32Field" value="java.lang.Integer"/> - <entry key="objField" value="TestObject"/> - <entry key="strField" value="java.lang.String"/> - </map> - </property> - - <property name="keyFields"> - <list></list> - </property> - - <property name="indexes"> - <list> - <bean class="org.apache.ignite.cache.QueryIndex"> - <constructor-arg value="i32Field"/> - </bean> - </list> - </property> - </bean> - </list> - </property> - </bean> - </list> - </property> - - <!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --> - <property name="discoverySpi"> - <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> - <property name="ipFinder"> - <!-- - Ignite provides several options for automatic discovery that can be used - instead os static IP based discovery. - --> - <!-- Uncomment static IP finder to enable static-based discovery of initial nodes. --> - <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> - <property name="addresses"> - <list> - <!-- In distributed environment, replace with actual host IP address. --> - <value>127.0.0.1:47500</value> - </list> - </property> - </bean> - </property> - <property name="socketTimeout" value="300" /> - </bean> - </property> </bean> </beans> http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/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 52b885d..a304229 100644 --- a/modules/platforms/cpp/odbc-test/src/queries_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/queries_test.cpp @@ -1342,4 +1342,80 @@ BOOST_AUTO_TEST_CASE(TestInsertMergeSelect) BOOST_CHECK_EQUAL(recordsNum, selectedRecordsNum); } +template<size_t n, size_t k> +void CheckMeta(char columns[n][k], SQLLEN columnsLen[n]) +{ + std::string catalog(columns[0], columnsLen[0]); + std::string schema(columns[1], columnsLen[1]); + std::string table(columns[2], columnsLen[2]); + std::string tableType(columns[3], columnsLen[3]); + + BOOST_CHECK_EQUAL(catalog, std::string("")); + BOOST_CHECK_EQUAL(tableType, std::string("TABLE")); + BOOST_CHECK_EQUAL(columnsLen[4], SQL_NULL_DATA); + + if (schema == "\"cache\"") + { + BOOST_CHECK_EQUAL(table, std::string("TestType")); + } + else if (schema == "\"cache2\"") + { + BOOST_CHECK_EQUAL(table, std::string("ComplexType")); + } + else + { + BOOST_FAIL("Unknown schema: " + schema); + } +} + +BOOST_AUTO_TEST_CASE(TestTablesMeta) +{ + Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;CACHE=cache2"); + + SQLRETURN ret; + + enum { COLUMNS_NUM = 5 }; + + // Five collumns: TABLE_CAT, TABLE_SCHEM, TABLE_NAME, TABLE_TYPE, REMARKS + char columns[COLUMNS_NUM][ODBC_BUFFER_SIZE]; + SQLLEN columnsLen[COLUMNS_NUM]; + + // Binding columns. + for (size_t i = 0; i < COLUMNS_NUM; ++i) + { + columnsLen[i] = ODBC_BUFFER_SIZE; + + ret = SQLBindCol(stmt, static_cast<SQLSMALLINT>(i + 1), SQL_C_CHAR, columns[i], columnsLen[i], &columnsLen[i]); + + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + } + + SQLCHAR catalogPattern[] = ""; + SQLCHAR schemaPattern[] = ""; + SQLCHAR tablePattern[] = ""; + SQLCHAR tableTypePattern[] = ""; + + ret = SQLTables(stmt, catalogPattern, SQL_NTS, schemaPattern, + SQL_NTS, tablePattern, SQL_NTS, tableTypePattern, SQL_NTS); + + 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)); + + CheckMeta<COLUMNS_NUM, ODBC_BUFFER_SIZE>(columns, columnsLen); + + ret = SQLFetch(stmt); + if (!SQL_SUCCEEDED(ret)) + BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt)); + + CheckMeta<COLUMNS_NUM, ODBC_BUFFER_SIZE>(columns, columnsLen); + + ret = SQLFetch(stmt); + BOOST_CHECK(ret == SQL_NO_DATA); +} + BOOST_AUTO_TEST_SUITE_END() http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/modules/platforms/cpp/odbc-test/src/utility_test.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc-test/src/utility_test.cpp b/modules/platforms/cpp/odbc-test/src/utility_test.cpp index 6c4d104..a66860f 100644 --- a/modules/platforms/cpp/odbc-test/src/utility_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/utility_test.cpp @@ -54,28 +54,43 @@ BOOST_AUTO_TEST_CASE(TestUtilityCopyStringToBuffer) BOOST_REQUIRE(!strcmp(buffer, str.substr(0, 10).c_str())); } -BOOST_AUTO_TEST_CASE(TestUtilityReadString) +BOOST_AUTO_TEST_CASE(TestUtilityWriteReadString) { using namespace ignite::impl::binary; using namespace ignite::impl::interop; - std::string inputStr("Hello World!"); - std::string outputStr; + std::string inStr1("Hello World!"); + std::string inStr2; + std::string inStr3("Lorem ipsum"); + + std::string outStr1; + std::string outStr2; + std::string outStr3; + std::string outStr4; ignite::impl::interop::InteropUnpooledMemory mem(1024); InteropOutputStream outStream(&mem); BinaryWriterImpl writer(&outStream, 0); - writer.WriteString(inputStr.data(), static_cast<int32_t>(inputStr.size())); + WriteString(writer, inStr1); + WriteString(writer, inStr2); + WriteString(writer, inStr3); + writer.WriteNull(); outStream.Synchronize(); InteropInputStream inStream(&mem); BinaryReaderImpl reader(&inStream); - ReadString(reader, outputStr); + ReadString(reader, outStr1); + ReadString(reader, outStr2); + ReadString(reader, outStr3); + ReadString(reader, outStr4); - BOOST_REQUIRE(inputStr == outputStr); + BOOST_REQUIRE(inStr1 == outStr1); + BOOST_REQUIRE(inStr2 == outStr2); + BOOST_REQUIRE(inStr3 == outStr3); + BOOST_REQUIRE(outStr4.empty()); } BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/8cffe900/modules/platforms/cpp/odbc/src/utility.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/src/utility.cpp b/modules/platforms/cpp/odbc/src/utility.cpp index 22191eb..756ab36 100644 --- a/modules/platforms/cpp/odbc/src/utility.cpp +++ b/modules/platforms/cpp/odbc/src/utility.cpp @@ -56,6 +56,7 @@ namespace ignite void ReadString(ignite::impl::binary::BinaryReaderImpl& reader, std::string& str) { int32_t strLen = reader.ReadString(0, 0); + if (strLen > 0) { str.resize(strLen); @@ -63,7 +64,16 @@ namespace ignite reader.ReadString(&str[0], static_cast<int32_t>(str.size())); } else + { str.clear(); + + if (strLen == 0) + { + char dummy; + + reader.ReadString(&dummy, sizeof(dummy)); + } + } } void WriteString(ignite::impl::binary::BinaryWriterImpl& writer, const std::string & str)
