Repository: ignite Updated Branches: refs/heads/ignite-1786 40beea346 -> 06a3e9178
GNITE-2747: ODBC: Fixed time cast issues. This closes #536. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/06a3e917 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/06a3e917 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/06a3e917 Branch: refs/heads/ignite-1786 Commit: 06a3e91782dd00ddada54be031cb7f2a79e4a10a Parents: 40beea3 Author: isapego <[email protected]> Authored: Mon Mar 21 10:48:13 2016 +0300 Committer: vozerov-gridgain <[email protected]> Committed: Mon Mar 21 10:48:13 2016 +0300 ---------------------------------------------------------------------- .../include/ignite/impl/binary/binary_utils.h | 170 +++++++++- .../cpp/binary/src/impl/binary/binary_utils.cpp | 68 +++- .../cpp/common/include/ignite/common/utils.h | 34 ++ .../platforms/cpp/common/os/linux/src/utils.cpp | 24 ++ .../platforms/cpp/common/os/win/src/utils.cpp | 26 ++ .../cpp/core-test/src/cache_query_test.cpp | 334 ++++++++++++++----- .../src/application_data_buffer_test.cpp | 122 +++---- .../cpp/odbc-test/src/queries_test.cpp | 22 +- .../platforms/cpp/odbc/include/ignite/odbc.h | 1 - .../cpp/odbc/include/ignite/odbc/utility.h | 16 +- .../odbc/src/app/application_data_buffer.cpp | 66 ++-- modules/platforms/cpp/odbc/src/utility.cpp | 10 - 12 files changed, 690 insertions(+), 203 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h index fde3353..403d534 100644 --- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h +++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_utils.h @@ -20,6 +20,8 @@ #include <stdint.h> +#include "ignite/common/utils.h" + #include "ignite/guid.h" #include "ignite/date.h" #include "ignite/timestamp.h" @@ -370,9 +372,175 @@ namespace ignite * @param len Length. */ static void WriteString(interop::InteropOutputStream* stream, const char* val, const int32_t len); + + /** + * Convert Date type to standard C type time_t. + * + * @param date Date type value. + * @return Corresponding value of time_t. + */ + static inline time_t DateToCTime(const Date& date) + { + return static_cast<time_t>(date.GetSeconds()); + } + + /** + * Convert Timestamp type to standard C type time_t. + * + * @param ts Timestamp type value. + * @return Corresponding value of time_t. + */ + static inline time_t TimestampToCTime(const Timestamp& ts) + { + return static_cast<time_t>(ts.GetSeconds()); + } + + /** + * Convert Date type to standard C type time_t. + * + * @param date Date type value. + * @param ctime Corresponding value of struct tm. + * @return True on success. + */ + static inline bool DateToCTm(const Date& date, tm& ctime) + { + time_t tmt = DateToCTime(date); + + return common::utils::IgniteGmTime(tmt, ctime); + } + + /** + * Convert Timestamp type to standard C type struct tm. + * + * @param ts Timestamp type value. + * @param ctime Corresponding value of struct tm. + * @return True on success. + */ + static inline bool TimestampToCTm(const Timestamp& ts, tm& ctime) + { + time_t tmt = TimestampToCTime(ts); + + return common::utils::IgniteGmTime(tmt, ctime); + } + + /** + * Convert standard C type time_t to Date struct tm. + * + * @param ctime Standard C type time_t. + * @return Corresponding value of Date. + */ + static inline Date CTimeToDate(time_t ctime) + { + return Date(ctime * 1000); + } + + /** + * Convert standard C type time_t to Timestamp type. + * + * @param ctime Standard C type time_t. + * @param ns Nanoseconds second fraction. + * @return Corresponding value of Timestamp. + */ + static inline Timestamp CTimeToTimestamp(time_t ctime, int32_t ns) + { + return Timestamp(ctime, ns); + } + + /** + * Convert standard C type struct tm to Date type. + * + * @param ctime Standard C type struct tm. + * @return Corresponding value of Date. + */ + static inline Date CTmToDate(const tm& ctime) + { + time_t time = common::utils::IgniteTimeGm(ctime); + + return CTimeToDate(time); + } + + /** + * Convert standard C type struct tm to Timestamp type. + * + * @param ctime Standard C type struct tm. + * @param ns Nanoseconds second fraction. + * @return Corresponding value of Timestamp. + */ + static inline Timestamp CTmToTimestamp(const tm& ctime, int32_t ns) + { + time_t time = common::utils::IgniteTimeGm(ctime); + + return CTimeToTimestamp(time, ns); + } + + /** + * Make Date in human understandable way. + * + * Created Date uses GMT timezone. + * + * @param year Year. + * @param month Month. + * @param day Day. + * @param hour Hour. + * @param min Min. + * @param sec Sec. + * @return Date. + */ + static Date MakeDateGmt(int year = 1900, int month = 1, + int day = 1, int hour = 0, int min = 0, int sec = 0); + + /** + * Make Date in human understandable way. + * + * Created Date uses local timezone. + * + * @param year Year. + * @param month Month. + * @param day Day. + * @param hour Hour. + * @param min Min. + * @param sec Sec. + * @return Date. + */ + static Date MakeDateLocal(int year = 1900, int month = 1, + int day = 1, int hour = 0, int min = 0, int sec = 0); + + /** + * Make Date in human understandable way. + * + * Created Timestamp uses GMT timezone. + * + * @param year Year. + * @param month Month. + * @param day Day. + * @param hour Hour. + * @param min Minute. + * @param sec Second. + * @param ns Nanosecond. + * @return Timestamp. + */ + static Timestamp MakeTimestampGmt(int year = 1900, int month = 1, + int day = 1, int hour = 0, int min = 0, int sec = 0, long ns = 0); + + /** + * Make Date in human understandable way. + * + * Created Timestamp uses Local timezone. + * + * @param year Year. + * @param month Month. + * @param day Day. + * @param hour Hour. + * @param min Minute. + * @param sec Second. + * @param ns Nanosecond. + * @return Timestamp. + */ + static Timestamp MakeTimestampLocal(int year = 1900, int month = 1, + int day = 1, int hour = 0, int min = 0, int sec = 0, long ns = 0); }; } } } -#endif \ No newline at end of file +#endif http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp b/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp index bfb9726..dc876ef 100644 --- a/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp +++ b/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp @@ -15,6 +15,8 @@ * limitations under the License. */ +#include <time.h> + #include "ignite/impl/interop/interop.h" #include "ignite/impl/binary/binary_utils.h" @@ -232,6 +234,70 @@ namespace ignite stream->WriteInt32(len); stream->WriteInt8Array(reinterpret_cast<const int8_t*>(val), len); } + + Date BinaryUtils::MakeDateGmt(int year, int month, int day, int hour, + int min, int sec) + { + tm date = { 0 }; + + date.tm_year = year - 1900; + date.tm_mon = month - 1; + date.tm_mday = day; + date.tm_hour = hour; + date.tm_min = min; + date.tm_sec = sec; + + return CTmToDate(date); + } + + Date BinaryUtils::MakeDateLocal(int year, int month, int day, int hour, + int min, int sec) + { + tm date = { 0 }; + + date.tm_year = year - 1900; + date.tm_mon = month - 1; + date.tm_mday = day; + date.tm_hour = hour; + date.tm_min = min; + date.tm_sec = sec; + + time_t localTime = common::utils::IgniteTimeLocal(date); + + return CTimeToDate(localTime); + } + + Timestamp BinaryUtils::MakeTimestampGmt(int year, int month, int day, + int hour, int min, int sec, long ns) + { + tm date = { 0 }; + + date.tm_year = year - 1900; + date.tm_mon = month - 1; + date.tm_mday = day; + date.tm_hour = hour; + date.tm_min = min; + date.tm_sec = sec; + + return CTmToTimestamp(date, ns); + } + + Timestamp BinaryUtils::MakeTimestampLocal(int year, int month, int day, + int hour, int min, int sec, long ns) + { + tm date = { 0 }; + + date.tm_year = year - 1900; + date.tm_mon = month - 1; + date.tm_mday = day; + date.tm_hour = hour; + date.tm_min = min; + date.tm_sec = sec; + + time_t localTime = common::utils::IgniteTimeLocal(date); + + return CTimeToTimestamp(localTime, ns); + } } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/common/include/ignite/common/utils.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/common/include/ignite/common/utils.h b/modules/platforms/cpp/common/include/ignite/common/utils.h index 05f3595..06d7c56 100644 --- a/modules/platforms/cpp/common/include/ignite/common/utils.h +++ b/modules/platforms/cpp/common/include/ignite/common/utils.h @@ -86,6 +86,40 @@ namespace ignite } /** + * Convert struct tm to time_t (UTC). + * + * @param time Standard C type struct tm value. + * @return Standard C type time_t value. + */ + IGNITE_IMPORT_EXPORT time_t IgniteTimeGm(const tm& time); + + /** + * Convert struct tm to time_t (Local time). + * + * @param time Standard C type struct tm value. + * @return Standard C type time_t value. + */ + IGNITE_IMPORT_EXPORT time_t IgniteTimeLocal(const tm& time); + + /** + * Convert time_t to struct tm (UTC). + * + * @param in Standard C type time_t value. + * @param out Standard C type struct tm value. + * @return True on success. + */ + IGNITE_IMPORT_EXPORT bool IgniteGmTime(time_t in, tm& out); + + /** + * Convert time_t to struct tm (Local time). + * + * @param in Standard C type time_t value. + * @param out Standard C type struct tm value. + * @return True on success. + */ + IGNITE_IMPORT_EXPORT bool IgniteLocalTime(time_t in, tm& out); + + /** * Get number of leading zeroes in octet. * * @param octet Octet. http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/common/os/linux/src/utils.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/common/os/linux/src/utils.cpp b/modules/platforms/cpp/common/os/linux/src/utils.cpp index 5c6df36..534786f 100644 --- a/modules/platforms/cpp/common/os/linux/src/utils.cpp +++ b/modules/platforms/cpp/common/os/linux/src/utils.cpp @@ -296,6 +296,30 @@ namespace ignite return res; } + time_t IgniteTimeGm(const tm& time) + { + tm tmc = time; + + return timegm(&tmc); + } + + time_t IgniteTimeLocal(const tm& time) + { + tm tmc = time; + + return mktime(&tmc); + } + + bool IgniteGmTime(time_t in, tm& out) + { + return gmtime_r(&in, &out) != NULL; + } + + bool IgniteLocalTime(time_t in, tm& out) + { + return localtime_r(&in, &out) == 0; + } + int LeadingZeroesForOctet(int8_t octet) { if (octet == 0) return 8; http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/common/os/win/src/utils.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/common/os/win/src/utils.cpp b/modules/platforms/cpp/common/os/win/src/utils.cpp index 2f28645..13aede3 100644 --- a/modules/platforms/cpp/common/os/win/src/utils.cpp +++ b/modules/platforms/cpp/common/os/win/src/utils.cpp @@ -17,6 +17,8 @@ #include <windows.h> +#include <time.h> + #include <ignite/common/utils.h> namespace ignite @@ -290,6 +292,30 @@ namespace ignite return res; } + time_t IgniteTimeGm(const tm& time) + { + tm tmc = time; + + return _mkgmtime(&tmc); + } + + time_t IgniteTimeLocal(const tm& time) + { + tm tmc = time; + + return mktime(&tmc); + } + + bool IgniteGmTime(time_t in, tm& out) + { + return gmtime_s(&out, &in) == 0; + } + + bool IgniteLocalTime(time_t in, tm& out) + { + return localtime_s(&out, &in) == 0; + } + int LeadingZeroesForOctet(int8_t octet) { if (octet == 0) return 8; http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/core-test/src/cache_query_test.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/core-test/src/cache_query_test.cpp b/modules/platforms/cpp/core-test/src/cache_query_test.cpp index a22ddad..f989f7b 100644 --- a/modules/platforms/cpp/core-test/src/cache_query_test.cpp +++ b/modules/platforms/cpp/core-test/src/cache_query_test.cpp @@ -40,6 +40,8 @@ using namespace ignite::cache; using namespace ignite::cache::query; using namespace ignite::common::utils; +using ignite::impl::binary::BinaryUtils; + /** * Person class for query tests. */ @@ -520,61 +522,6 @@ void CheckMultipleGetAll(Cursor& cur, int key1, const std::string& name1, } } -/** - * Make Date in human understandable way. - * - * @param year Year. - * @param month Month. - * @param day Day. - * @param hour Hour. - * @param min Min. - * @param sec Sec. - * @return Date. - */ -Date MakeDate(int year = 1900, int month = 1, int day = 1, int hour = 0, int min = 0, int sec = 0) -{ - tm date; - - date.tm_year = year - 1900; - date.tm_mon = month - 1; - date.tm_mday = day; - date.tm_hour = hour; - date.tm_min = min; - date.tm_sec = sec; - - time_t ct = mktime(&date); - - return Date(ct * 1000); -} - -/** - * Make Date in human understandable way. - * - * @param year Year. - * @param month Month. - * @param day Day. - * @param hour Hour. - * @param min Minute. - * @param sec Second. - * @param ns Nanosecond. - * @return Timestamp. - */ -Timestamp MakeTimestamp(int year = 1900, int month = 1, int day = 1, int hour = 0, int min = 0, int sec = 0, long ns = 0) -{ - tm date; - - date.tm_year = year - 1900; - date.tm_mon = month - 1; - date.tm_mday = day; - date.tm_hour = hour; - date.tm_min = min; - date.tm_sec = sec; - - time_t ct = mktime(&date); - - return Timestamp(ct, ns); -} - BOOST_FIXTURE_TEST_SUITE(CacheQueryTestSuite, CacheQueryTestSuiteFixture) /** @@ -594,8 +541,8 @@ BOOST_AUTO_TEST_CASE(TestSqlQuery) CheckEmptyGetAll(cursor); // Test simple query. - cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685))); - cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201))); + cache.Put(1, QueryPerson("A1", 10, BinaryUtils::MakeDateLocal(1990, 03, 18), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 34, 579304685))); + cache.Put(2, QueryPerson("A2", 20, BinaryUtils::MakeDateLocal(1989, 10, 26), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 35, 678403201))); cursor = cache.Query(qry); CheckSingle(cursor, 1, "A1", 10); @@ -650,8 +597,8 @@ BOOST_AUTO_TEST_CASE(TestTextQuery) CheckEmptyGetAll(cursor); // Test simple query. - cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685))); - cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201))); + cache.Put(1, QueryPerson("A1", 10, BinaryUtils::MakeDateLocal(1990, 03, 18), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 34, 579304685))); + cache.Put(2, QueryPerson("A2", 20, BinaryUtils::MakeDateLocal(1989, 10, 26), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 35, 678403201))); cursor = cache.Query(qry); CheckSingle(cursor, 1, "A1", 10); @@ -696,7 +643,7 @@ BOOST_AUTO_TEST_CASE(TestScanQuery) CheckEmptyGetAll(cursor); // Test simple query. - cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685))); + cache.Put(1, QueryPerson("A1", 10, BinaryUtils::MakeDateLocal(1990, 03, 18), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 34, 579304685))); cursor = cache.Query(qry); CheckSingle(cursor, 1, "A1", 10); @@ -705,7 +652,7 @@ BOOST_AUTO_TEST_CASE(TestScanQuery) CheckSingleGetAll(cursor, 1, "A1", 10); // Test query returning multiple entries. - cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201))); + cache.Put(2, QueryPerson("A2", 20, BinaryUtils::MakeDateLocal(1989, 10, 26), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 35, 678403201))); cursor = cache.Query(qry); CheckMultiple(cursor, 1, "A1", 10, 2, "A2", 20); @@ -731,7 +678,7 @@ BOOST_AUTO_TEST_CASE(TestScanQueryPartitioned) stream << "A" << i; - cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1970 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60))); + cache.Put(i, QueryPerson(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1970 + i), BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60))); } // Iterate over all partitions and collect data. @@ -778,7 +725,7 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySingle) CheckEmpty(cursor); // Test simple query. - cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685))); + cache.Put(1, QueryPerson("A1", 10, BinaryUtils::MakeDateLocal(1990, 03, 18), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 34, 579304685))); cursor = cache.Query(qry); @@ -823,7 +770,7 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryExceptions) CheckEmpty(cursor); // Test simple query. - cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685))); + cache.Put(1, QueryPerson("A1", 10, BinaryUtils::MakeDateLocal(1990, 03, 18), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 34, 579304685))); cursor = cache.Query(qry); @@ -868,8 +815,8 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryTwo) CheckEmpty(cursor); // Test simple query. - cache.Put(1, QueryPerson("A1", 10, MakeDate(1990, 03, 18), MakeTimestamp(2016, 02, 10, 17, 39, 34, 579304685))); - cache.Put(2, QueryPerson("A2", 20, MakeDate(1989, 10, 26), MakeTimestamp(2016, 02, 10, 17, 39, 35, 678403201))); + cache.Put(1, QueryPerson("A1", 10, BinaryUtils::MakeDateLocal(1990, 03, 18), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 34, 579304685))); + cache.Put(2, QueryPerson("A2", 20, BinaryUtils::MakeDateLocal(1989, 10, 26), BinaryUtils::MakeTimestampLocal(2016, 02, 10, 17, 39, 35, 678403201))); cursor = cache.Query(qry); @@ -938,7 +885,10 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySeveral) stream << "A" << i; - cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1970 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60))); + QueryPerson val(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1980 + i, 1, 1), + BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60)); + + cache.Put(i, val); } cursor = cache.Query(qry); @@ -982,7 +932,7 @@ BOOST_AUTO_TEST_CASE(TestFieldsQuerySeveral) /** * Test query for Date type. */ -BOOST_AUTO_TEST_CASE(TestFieldsQueryDate) +BOOST_AUTO_TEST_CASE(TestFieldsQueryDateLess) { // Test simple query. Cache<int, QueryPerson> cache = GetCache(); @@ -1001,7 +951,10 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryDate) stream << "A" << i; - cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1980 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60))); + QueryPerson val(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1980 + i, 1, 1), + BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60)); + + cache.Put(i, val); } cursor = cache.Query(qry); @@ -1023,9 +976,9 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryDate) Date birthday = row.GetNext<Date>(error); BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); - BOOST_CHECK(birthday == MakeDate(1980 + resultSetSize)); + BOOST_CHECK(birthday == BinaryUtils::MakeDateLocal(1980 + resultSetSize, 1, 1)); - BOOST_CHECK(birthday < MakeDate(1990, 1, 1)); + BOOST_CHECK(birthday < BinaryUtils::MakeDateLocal(1990, 1, 1)); BOOST_REQUIRE(!row.HasNext()); @@ -1038,9 +991,122 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryDate) } /** + * Test query for Date type. + */ +BOOST_AUTO_TEST_CASE(TestFieldsQueryDateMore) +{ + // Test simple query. + Cache<int, QueryPerson> cache = GetCache(); + + // Test query with field of type 'Date'. + SqlFieldsQuery qry("select birthday from QueryPerson where birthday>'2070-01-01'"); + + QueryFieldsCursor cursor = cache.Query(qry); + CheckEmpty(cursor); + + int32_t entryCnt = 100; // Number of entries. + + for (int i = 0; i < entryCnt; i++) + { + std::stringstream stream; + + stream << "A" << i; + + QueryPerson val(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1980 + i, 1, 1), + BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60)); + + cache.Put(i, val); + } + + cursor = cache.Query(qry); + + IgniteError error; + + int32_t resultSetSize = 0; // Number of entries in query result set. + + while (cursor.HasNext(error)) + { + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + QueryFieldsRow row = cursor.GetNext(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + BOOST_REQUIRE(row.HasNext(error)); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + Date birthday = row.GetNext<Date>(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + BOOST_CHECK(birthday == BinaryUtils::MakeDateLocal(2071 + resultSetSize, 1, 1)); + + BOOST_CHECK(birthday > BinaryUtils::MakeDateLocal(2070, 1, 1)); + + BOOST_REQUIRE(!row.HasNext()); + + ++resultSetSize; + } + + BOOST_CHECK_EQUAL(resultSetSize, 9); + + CheckEmpty(cursor); +} + +/** + * Test query for Date type. + */ +BOOST_AUTO_TEST_CASE(TestFieldsQueryDateEqual) +{ + // Test simple query. + Cache<int, QueryPerson> cache = GetCache(); + + // Test query with field of type 'Date'. + SqlFieldsQuery qry("select birthday from QueryPerson where birthday='2032-01-01'"); + + QueryFieldsCursor cursor = cache.Query(qry); + CheckEmpty(cursor); + + int32_t entryCnt = 100; // Number of entries. + + for (int i = 0; i < entryCnt; i++) + { + std::stringstream stream; + + stream << "A" << i; + + QueryPerson val(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1980 + i, 1, 1), + BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60)); + + cache.Put(i, val); + } + + cursor = cache.Query(qry); + + IgniteError error; + + BOOST_REQUIRE(cursor.HasNext(error)); + + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + QueryFieldsRow row = cursor.GetNext(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + BOOST_REQUIRE(row.HasNext(error)); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + Date birthday = row.GetNext<Date>(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + BOOST_CHECK(birthday == BinaryUtils::MakeDateLocal(2032, 1, 1)); + + BOOST_REQUIRE(!row.HasNext()); + + CheckEmpty(cursor); +} + +/** * Test query for Timestamp type. */ -BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestamp) +BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestampLess) { // Test simple query. Cache<int, QueryPerson> cache = GetCache(); @@ -1059,7 +1125,10 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestamp) stream << "A" << i; - cache.Put(i, QueryPerson(stream.str(), i * 10, MakeDate(1980 + i), MakeTimestamp(2016, 1, 1, i / 60, i % 60))); + QueryPerson val(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1980 + i, 1, 1), + BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60)); + + cache.Put(i, val); } cursor = cache.Query(qry); @@ -1081,9 +1150,9 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestamp) Timestamp recordCreated = row.GetNext<Timestamp>(error); BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); - BOOST_CHECK(recordCreated == MakeTimestamp(2016, 1, 1, 0, resultSetSize % 60, 0)); + BOOST_CHECK(recordCreated == BinaryUtils::MakeTimestampLocal(2016, 1, 1, 0, resultSetSize % 60, 0)); - BOOST_CHECK(recordCreated < MakeTimestamp(2016, 1, 1, 1, 0, 0)); + BOOST_CHECK(recordCreated < BinaryUtils::MakeTimestampLocal(2016, 1, 1, 1, 0, 0)); BOOST_REQUIRE(!row.HasNext()); @@ -1095,4 +1164,119 @@ BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestamp) CheckEmpty(cursor); } +/** + * Test query for Timestamp type. + */ +BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestampMore) +{ + // Test simple query. + Cache<int, QueryPerson> cache = GetCache(); + + // Test query with field of type 'Timestamp'. + SqlFieldsQuery qry("select recordCreated from QueryPerson where recordCreated>'2016-01-01 15:30:00'"); + + QueryFieldsCursor cursor = cache.Query(qry); + CheckEmpty(cursor); + + int32_t entryCnt = 1000; // Number of entries. + + for (int i = 0; i < entryCnt; i++) + { + std::stringstream stream; + + stream << "A" << i; + + QueryPerson val(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1980 + i, 1, 1), + BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60)); + + cache.Put(i, val); + } + + cursor = cache.Query(qry); + + IgniteError error; + + int32_t resultSetSize = 0; // Number of entries in query result set. + + while (cursor.HasNext(error)) + { + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + QueryFieldsRow row = cursor.GetNext(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + BOOST_REQUIRE(row.HasNext(error)); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + Timestamp recordCreated = row.GetNext<Timestamp>(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + int32_t minutes = resultSetSize + 31; + + BOOST_CHECK(recordCreated == BinaryUtils::MakeTimestampLocal(2016, 1, 1, 15 + minutes / 60, minutes % 60, 0)); + + BOOST_CHECK(recordCreated > BinaryUtils::MakeTimestampLocal(2016, 1, 1, 15, 30, 0)); + + BOOST_REQUIRE(!row.HasNext()); + + ++resultSetSize; + } + + BOOST_CHECK_EQUAL(resultSetSize, 69); + + CheckEmpty(cursor); +} + +/** + * Test query for Timestamp type. + */ +BOOST_AUTO_TEST_CASE(TestFieldsQueryTimestampEqual) +{ + // Test simple query. + Cache<int, QueryPerson> cache = GetCache(); + + // Test query with field of type 'Timestamp'. + SqlFieldsQuery qry("select recordCreated from QueryPerson where recordCreated='2016-01-01 09:18:00'"); + + QueryFieldsCursor cursor = cache.Query(qry); + CheckEmpty(cursor); + + int32_t entryCnt = 1000; // Number of entries. + + for (int i = 0; i < entryCnt; i++) + { + std::stringstream stream; + + stream << "A" << i; + + QueryPerson val(stream.str(), i * 10, BinaryUtils::MakeDateLocal(1980 + i, 1, 1), + BinaryUtils::MakeTimestampLocal(2016, 1, 1, i / 60, i % 60)); + + cache.Put(i, val); + } + + cursor = cache.Query(qry); + + IgniteError error; + + BOOST_REQUIRE(cursor.HasNext(error)); + + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + QueryFieldsRow row = cursor.GetNext(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + BOOST_REQUIRE(row.HasNext(error)); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + Timestamp recordCreated = row.GetNext<Timestamp>(error); + BOOST_REQUIRE(error.GetCode() == IgniteError::IGNITE_SUCCESS); + + BOOST_CHECK(recordCreated == BinaryUtils::MakeTimestampLocal(2016, 1, 1, 9, 18, 0)); + + BOOST_REQUIRE(!row.HasNext()); + + CheckEmpty(cursor); +} + BOOST_AUTO_TEST_SUITE_END() http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp b/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp index 1eac1de..8b128f7 100644 --- a/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/application_data_buffer_test.cpp @@ -37,7 +37,7 @@ using namespace ignite::odbc; using namespace ignite::odbc::app; using namespace ignite::odbc::type_traits; -using namespace test_utils; +using ignite::impl::binary::BinaryUtils; BOOST_AUTO_TEST_SUITE(ApplicationDataBufferTestSuite) @@ -407,7 +407,7 @@ BOOST_AUTO_TEST_CASE(TestPutDateToString) ApplicationDataBuffer appBuf(IGNITE_ODBC_C_TYPE_CHAR, &strBuf, sizeof(strBuf), &reslen, 0); - Date date = MakeDate(1999, 2, 22); + Date date = BinaryUtils::MakeDateGmt(1999, 2, 22); appBuf.PutDate(date); @@ -421,7 +421,7 @@ BOOST_AUTO_TEST_CASE(TestPutTimestampToString) ApplicationDataBuffer appBuf(IGNITE_ODBC_C_TYPE_CHAR, &strBuf, sizeof(strBuf), &reslen, 0); - Timestamp date = MakeTimestamp(2018, 11, 1, 17, 45, 59); + Timestamp date = BinaryUtils::MakeTimestampGmt(2018, 11, 1, 17, 45, 59); appBuf.PutTimestamp(date); @@ -438,7 +438,7 @@ BOOST_AUTO_TEST_CASE(TestPutDateToDate) ApplicationDataBuffer appBuf(IGNITE_ODBC_C_TYPE_TDATE, &buf, sizeof(buf), &reslen, &offsetPtr); - Date date = MakeDate(1984, 5, 27); + Date date = BinaryUtils::MakeDateGmt(1984, 5, 27); appBuf.PutDate(date); @@ -457,7 +457,7 @@ BOOST_AUTO_TEST_CASE(TestPutTimestampToDate) ApplicationDataBuffer appBuf(IGNITE_ODBC_C_TYPE_TDATE, &buf, sizeof(buf), &reslen, &offsetPtr); - Timestamp ts = MakeTimestamp(2004, 8, 14, 6, 34, 51, 573948623); + Timestamp ts = BinaryUtils::MakeTimestampGmt(2004, 8, 14, 6, 34, 51, 573948623); appBuf.PutTimestamp(ts); @@ -476,7 +476,7 @@ BOOST_AUTO_TEST_CASE(TestPutTimestampToTimestamp) ApplicationDataBuffer appBuf(IGNITE_ODBC_C_TYPE_TTIMESTAMP, &buf, sizeof(buf), &reslen, &offsetPtr); - Timestamp ts = MakeTimestamp(2004, 8, 14, 6, 34, 51, 573948623); + Timestamp ts = BinaryUtils::MakeTimestampGmt(2004, 8, 14, 6, 34, 51, 573948623); appBuf.PutTimestamp(ts); @@ -500,7 +500,7 @@ BOOST_AUTO_TEST_CASE(TestPutDateToTimestamp) ApplicationDataBuffer appBuf(IGNITE_ODBC_C_TYPE_TTIMESTAMP, &buf, sizeof(buf), &reslen, &offsetPtr); - Date date = MakeDate(1984, 5, 27); + Date date = BinaryUtils::MakeDateGmt(1984, 5, 27); appBuf.PutDate(date); @@ -822,18 +822,18 @@ BOOST_AUTO_TEST_CASE(TestGetDateFromString) Date date = appBuf.GetDate(); - time_t cTime = utility::DateToCTime(date); + tm tmDate; - tm *tmDate = std::gmtime(&cTime); + bool success = BinaryUtils::DateToCTm(date, tmDate); - BOOST_REQUIRE(tmDate != 0); + BOOST_REQUIRE(success); - BOOST_CHECK_EQUAL(1999, tmDate->tm_year + 1900); - BOOST_CHECK_EQUAL(2, tmDate->tm_mon + 1); - BOOST_CHECK_EQUAL(22, tmDate->tm_mday); - BOOST_CHECK_EQUAL(0, tmDate->tm_hour); - BOOST_CHECK_EQUAL(0, tmDate->tm_min); - BOOST_CHECK_EQUAL(0, tmDate->tm_sec); + BOOST_CHECK_EQUAL(1999, tmDate.tm_year + 1900); + BOOST_CHECK_EQUAL(2, tmDate.tm_mon + 1); + BOOST_CHECK_EQUAL(22, tmDate.tm_mday); + BOOST_CHECK_EQUAL(0, tmDate.tm_hour); + BOOST_CHECK_EQUAL(0, tmDate.tm_min); + BOOST_CHECK_EQUAL(0, tmDate.tm_sec); } BOOST_AUTO_TEST_CASE(TestGetTimestampFromString) @@ -853,18 +853,18 @@ BOOST_AUTO_TEST_CASE(TestGetTimestampFromString) Timestamp date = appBuf.GetTimestamp(); - time_t cTime = utility::TimestampToCTime(date); + tm tmDate; - tm *tmDate = std::gmtime(&cTime); + bool success = BinaryUtils::TimestampToCTm(date, tmDate); - BOOST_REQUIRE(tmDate != 0); + BOOST_REQUIRE(success); - BOOST_CHECK_EQUAL(2018, tmDate->tm_year + 1900); - BOOST_CHECK_EQUAL(11, tmDate->tm_mon + 1); - BOOST_CHECK_EQUAL(1, tmDate->tm_mday); - BOOST_CHECK_EQUAL(17, tmDate->tm_hour); - BOOST_CHECK_EQUAL(45, tmDate->tm_min); - BOOST_CHECK_EQUAL(59, tmDate->tm_sec); + BOOST_CHECK_EQUAL(2018, tmDate.tm_year + 1900); + BOOST_CHECK_EQUAL(11, tmDate.tm_mon + 1); + BOOST_CHECK_EQUAL(1, tmDate.tm_mday); + BOOST_CHECK_EQUAL(17, tmDate.tm_hour); + BOOST_CHECK_EQUAL(45, tmDate.tm_min); + BOOST_CHECK_EQUAL(59, tmDate.tm_sec); } BOOST_AUTO_TEST_CASE(TestGetDateFromDate) @@ -884,18 +884,18 @@ BOOST_AUTO_TEST_CASE(TestGetDateFromDate) Date date = appBuf.GetDate(); - time_t cTime = utility::DateToCTime(date); + tm tmDate; - tm *tmDate = std::gmtime(&cTime); + bool success = BinaryUtils::DateToCTm(date, tmDate); - BOOST_REQUIRE(tmDate != 0); + BOOST_REQUIRE(success); - BOOST_CHECK_EQUAL(1984, tmDate->tm_year + 1900); - BOOST_CHECK_EQUAL(5, tmDate->tm_mon + 1); - BOOST_CHECK_EQUAL(27, tmDate->tm_mday); - BOOST_CHECK_EQUAL(0, tmDate->tm_hour); - BOOST_CHECK_EQUAL(0, tmDate->tm_min); - BOOST_CHECK_EQUAL(0, tmDate->tm_sec); + BOOST_CHECK_EQUAL(1984, tmDate.tm_year + 1900); + BOOST_CHECK_EQUAL(5, tmDate.tm_mon + 1); + BOOST_CHECK_EQUAL(27, tmDate.tm_mday); + BOOST_CHECK_EQUAL(0, tmDate.tm_hour); + BOOST_CHECK_EQUAL(0, tmDate.tm_min); + BOOST_CHECK_EQUAL(0, tmDate.tm_sec); } BOOST_AUTO_TEST_CASE(TestGetTimestampFromDate) @@ -915,18 +915,18 @@ BOOST_AUTO_TEST_CASE(TestGetTimestampFromDate) Timestamp ts = appBuf.GetTimestamp(); - time_t cTime = utility::TimestampToCTime(ts); + tm tmDate; - tm *tmDate = std::gmtime(&cTime); + bool success = BinaryUtils::TimestampToCTm(ts, tmDate); - BOOST_REQUIRE(tmDate != 0); + BOOST_REQUIRE(success); - BOOST_CHECK_EQUAL(1984, tmDate->tm_year + 1900); - BOOST_CHECK_EQUAL(5, tmDate->tm_mon + 1); - BOOST_CHECK_EQUAL(27, tmDate->tm_mday); - BOOST_CHECK_EQUAL(0, tmDate->tm_hour); - BOOST_CHECK_EQUAL(0, tmDate->tm_min); - BOOST_CHECK_EQUAL(0, tmDate->tm_sec); + BOOST_CHECK_EQUAL(1984, tmDate.tm_year + 1900); + BOOST_CHECK_EQUAL(5, tmDate.tm_mon + 1); + BOOST_CHECK_EQUAL(27, tmDate.tm_mday); + BOOST_CHECK_EQUAL(0, tmDate.tm_hour); + BOOST_CHECK_EQUAL(0, tmDate.tm_min); + BOOST_CHECK_EQUAL(0, tmDate.tm_sec); } BOOST_AUTO_TEST_CASE(TestGetTimestampFromTimestamp) @@ -950,18 +950,18 @@ BOOST_AUTO_TEST_CASE(TestGetTimestampFromTimestamp) Timestamp ts = appBuf.GetTimestamp(); - time_t cTime = utility::TimestampToCTime(ts); + tm tmDate; - tm *tmDate = std::gmtime(&cTime); + bool success = BinaryUtils::TimestampToCTm(ts, tmDate); - BOOST_REQUIRE(tmDate != 0); + BOOST_REQUIRE(success); - BOOST_CHECK_EQUAL(2004, tmDate->tm_year + 1900); - BOOST_CHECK_EQUAL(8, tmDate->tm_mon + 1); - BOOST_CHECK_EQUAL(14, tmDate->tm_mday); - BOOST_CHECK_EQUAL(6, tmDate->tm_hour); - BOOST_CHECK_EQUAL(34, tmDate->tm_min); - BOOST_CHECK_EQUAL(51, tmDate->tm_sec); + BOOST_CHECK_EQUAL(2004, tmDate.tm_year + 1900); + BOOST_CHECK_EQUAL(8, tmDate.tm_mon + 1); + BOOST_CHECK_EQUAL(14, tmDate.tm_mday); + BOOST_CHECK_EQUAL(6, tmDate.tm_hour); + BOOST_CHECK_EQUAL(34, tmDate.tm_min); + BOOST_CHECK_EQUAL(51, tmDate.tm_sec); BOOST_CHECK_EQUAL(573948623, ts.GetSecondFraction()); } @@ -986,18 +986,18 @@ BOOST_AUTO_TEST_CASE(TestGetDateFromTimestamp) Date date = appBuf.GetDate(); - time_t cTime = utility::DateToCTime(date); + tm tmDate; - tm *tmDate = std::gmtime(&cTime); + bool success = BinaryUtils::DateToCTm(date, tmDate); - BOOST_REQUIRE(tmDate != 0); + BOOST_REQUIRE(success); - BOOST_CHECK_EQUAL(2004, tmDate->tm_year + 1900); - BOOST_CHECK_EQUAL(8, tmDate->tm_mon + 1); - BOOST_CHECK_EQUAL(14, tmDate->tm_mday); - BOOST_CHECK_EQUAL(6, tmDate->tm_hour); - BOOST_CHECK_EQUAL(34, tmDate->tm_min); - BOOST_CHECK_EQUAL(51, tmDate->tm_sec); + BOOST_CHECK_EQUAL(2004, tmDate.tm_year + 1900); + BOOST_CHECK_EQUAL(8, tmDate.tm_mon + 1); + BOOST_CHECK_EQUAL(14, tmDate.tm_mday); + BOOST_CHECK_EQUAL(6, tmDate.tm_hour); + BOOST_CHECK_EQUAL(34, tmDate.tm_min); + BOOST_CHECK_EQUAL(51, tmDate.tm_sec); } BOOST_AUTO_TEST_SUITE_END() http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/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 0ca5dad..55d1b92 100644 --- a/modules/platforms/cpp/odbc-test/src/queries_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/queries_test.cpp @@ -172,8 +172,11 @@ struct QueriesTestSuiteFixture { SQLRETURN ret; - testCache.Put(1, TestType(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456))); - testCache.Put(2, TestType(8, 7, 6, 5, "4", 3.0f, 2.0, false, Guid(1, 0), MakeDate(1976, 1, 12), MakeTimestamp(1978, 8, 21, 23, 13, 45, 456))); + TestType in1(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456)); + TestType in2(8, 7, 6, 5, "4", 3.0f, 2.0, false, Guid(1, 0), MakeDate(1976, 1, 12), MakeTimestamp(1978, 8, 21, 23, 13, 45, 456)); + + testCache.Put(1, in1); + testCache.Put(2, in2); const size_t columnsCnt = 11; @@ -318,8 +321,11 @@ BOOST_AUTO_TEST_CASE(TestTwoRowsString) { SQLRETURN ret; - testCache.Put(1, TestType(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456))); - testCache.Put(2, TestType(8, 7, 6, 5, "4", 3.0f, 2.0, false, Guid(1, 0), MakeDate(1976, 1, 12), MakeTimestamp(1978, 8, 21, 23, 13, 45, 999999999))); + TestType in1(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456)); + TestType in2(8, 7, 6, 5, "4", 3.0f, 2.0, false, Guid(1, 0), MakeDate(1976, 1, 12), MakeTimestamp(1978, 8, 21, 23, 13, 45, 999999999)); + + testCache.Put(1, in1); + testCache.Put(2, in2); const size_t columnsCnt = 11; @@ -408,7 +414,9 @@ BOOST_AUTO_TEST_CASE(TestOneRowString) { SQLRETURN ret; - testCache.Put(1, TestType(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456))); + TestType in(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456)); + + testCache.Put(1, in); const size_t columnsCnt = 11; @@ -467,7 +475,9 @@ BOOST_AUTO_TEST_CASE(TestOneRowStringLen) { SQLRETURN ret; - testCache.Put(1, TestType(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456))); + TestType in(1, 2, 3, 4, "5", 6.0f, 7.0, true, Guid(8, 9), MakeDate(1987, 6, 5), MakeTimestamp(1998, 12, 27, 1, 2, 3, 456)); + + testCache.Put(1, in); const size_t columnsCnt = 11; http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/odbc/include/ignite/odbc.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc.h b/modules/platforms/cpp/odbc/include/ignite/odbc.h index f613491..da662cf 100644 --- a/modules/platforms/cpp/odbc/include/ignite/odbc.h +++ b/modules/platforms/cpp/odbc/include/ignite/odbc.h @@ -20,7 +20,6 @@ #include "ignite/odbc/system/odbc_constants.h" - /** * @file odbc.h * http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/odbc/include/ignite/odbc/utility.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/utility.h b/modules/platforms/cpp/odbc/include/ignite/odbc/utility.h index 43fdb96..f266a8f 100644 --- a/modules/platforms/cpp/odbc/include/ignite/odbc/utility.h +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/utility.h @@ -174,21 +174,7 @@ namespace ignite * @return Standard string containing the same data. */ std::string SqlStringToString(const unsigned char* sqlStr, int32_t sqlStrLen); - - /** - * Convert Date type to standard C type time_t. - * - * @return Corresponding value of time_t. - */ - time_t DateToCTime(const Date& date); - - /** - * Convert Timestamp type to standard C type time_t. - * - * @return Corresponding value of time_t. - */ - time_t TimestampToCTime(const Timestamp& ts); } } -#endif \ No newline at end of file +#endif http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/modules/platforms/cpp/odbc/src/app/application_data_buffer.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/src/app/application_data_buffer.cpp b/modules/platforms/cpp/odbc/src/app/application_data_buffer.cpp index d108f39..600dc86 100644 --- a/modules/platforms/cpp/odbc/src/app/application_data_buffer.cpp +++ b/modules/platforms/cpp/odbc/src/app/application_data_buffer.cpp @@ -1,4 +1,4 @@ -/* +/* * 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. @@ -19,6 +19,8 @@ #include <string> #include <sstream> +#include "ignite/impl/binary/binary_utils.h" + #include "ignite/odbc/system/odbc_constants.h" #include "ignite/odbc/app/application_data_buffer.h" #include "ignite/odbc/utility.h" @@ -29,6 +31,8 @@ namespace ignite { namespace app { + using ignite::impl::binary::BinaryUtils; + ApplicationDataBuffer::ApplicationDataBuffer() : type(type_traits::IGNITE_ODBC_C_TYPE_UNSUPPORTED), buffer(0), buflen(0), reslen(0), offset(0) { @@ -577,9 +581,9 @@ namespace ignite { using namespace type_traits; - time_t time = utility::DateToCTime(value); + tm tmTime; - tm* tmTime = std::gmtime(&time); + BinaryUtils::DateToCTm(value, tmTime); switch (type) { @@ -589,7 +593,7 @@ namespace ignite if (buffer) { - strftime(buffer, GetSize(), "%Y-%m-%d", tmTime); + strftime(buffer, GetSize(), "%Y-%m-%d", &tmTime); if (GetResLen()) *GetResLen() = strlen(buffer); @@ -608,7 +612,7 @@ namespace ignite { std::string tmp(GetSize(), 0); - strftime(&tmp[0], GetSize(), "%Y-%m-%d", tmTime); + strftime(&tmp[0], GetSize(), "%Y-%m-%d", &tmTime); SqlLen toCopy = std::min(static_cast<SqlLen>(strlen(tmp.c_str()) + 1), GetSize()); @@ -630,9 +634,9 @@ namespace ignite { SQL_DATE_STRUCT* buffer = reinterpret_cast<SQL_DATE_STRUCT*>(GetData()); - buffer->year = tmTime->tm_year + 1900; - buffer->month = tmTime->tm_mon + 1; - buffer->day = tmTime->tm_mday; + buffer->year = tmTime.tm_year + 1900; + buffer->month = tmTime.tm_mon + 1; + buffer->day = tmTime.tm_mday; break; } @@ -641,12 +645,12 @@ namespace ignite { SQL_TIMESTAMP_STRUCT* buffer = reinterpret_cast<SQL_TIMESTAMP_STRUCT*>(GetData()); - buffer->year = tmTime->tm_year + 1900; - buffer->month = tmTime->tm_mon + 1; - buffer->day = tmTime->tm_mday; - buffer->hour = tmTime->tm_hour; - buffer->minute = tmTime->tm_min; - buffer->second = tmTime->tm_sec; + buffer->year = tmTime.tm_year + 1900; + buffer->month = tmTime.tm_mon + 1; + buffer->day = tmTime.tm_mday; + buffer->hour = tmTime.tm_hour; + buffer->minute = tmTime.tm_min; + buffer->second = tmTime.tm_sec; buffer->fraction = 0; break; @@ -688,9 +692,9 @@ namespace ignite { using namespace type_traits; - time_t time = utility::TimestampToCTime(value); + tm tmTime; - tm* tmTime = std::gmtime(&time); + BinaryUtils::TimestampToCTm(value, tmTime); switch (type) { @@ -700,7 +704,7 @@ namespace ignite if (buffer) { - strftime(buffer, GetSize(), "%Y-%m-%d %H:%M:%S", tmTime); + strftime(buffer, GetSize(), "%Y-%m-%d %H:%M:%S", &tmTime); if (GetResLen()) *GetResLen() = strlen(buffer); @@ -719,7 +723,7 @@ namespace ignite { std::string tmp(GetSize(), 0); - strftime(&tmp[0], GetSize(), "%Y-%m-%d %H:%M:%S", tmTime); + strftime(&tmp[0], GetSize(), "%Y-%m-%d %H:%M:%S", &tmTime); SqlLen toCopy = std::min(static_cast<SqlLen>(strlen(tmp.c_str()) + 1), GetSize()); @@ -741,9 +745,9 @@ namespace ignite { SQL_DATE_STRUCT* buffer = reinterpret_cast<SQL_DATE_STRUCT*>(GetData()); - buffer->year = tmTime->tm_year + 1900; - buffer->month = tmTime->tm_mon + 1; - buffer->day = tmTime->tm_mday; + buffer->year = tmTime.tm_year + 1900; + buffer->month = tmTime.tm_mon + 1; + buffer->day = tmTime.tm_mday; break; } @@ -752,12 +756,12 @@ namespace ignite { SQL_TIMESTAMP_STRUCT* buffer = reinterpret_cast<SQL_TIMESTAMP_STRUCT*>(GetData()); - buffer->year = tmTime->tm_year + 1900; - buffer->month = tmTime->tm_mon + 1; - buffer->day = tmTime->tm_mday; - buffer->hour = tmTime->tm_hour; - buffer->minute = tmTime->tm_min; - buffer->second = tmTime->tm_sec; + buffer->year = tmTime.tm_year + 1900; + buffer->month = tmTime.tm_mon + 1; + buffer->day = tmTime.tm_mday; + buffer->hour = tmTime.tm_hour; + buffer->minute = tmTime.tm_min; + buffer->second = tmTime.tm_sec; buffer->fraction = value.GetSecondFraction(); break; @@ -1136,9 +1140,7 @@ namespace ignite break; } - time_t cTime = mktime(&tmTime) - timezone; - - return Date(cTime * 1000); + return BinaryUtils::CTmToDate(tmTime); } Timestamp ApplicationDataBuffer::GetTimestamp() const @@ -1197,9 +1199,7 @@ namespace ignite break; } - time_t cTime = mktime(&tmTime) - timezone; - - return Timestamp(cTime, nanos); + return BinaryUtils::CTmToTimestamp(tmTime, nanos); } template<typename T> http://git-wip-us.apache.org/repos/asf/ignite/blob/06a3e917/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 b33b742..8cdfdb6 100644 --- a/modules/platforms/cpp/odbc/src/utility.cpp +++ b/modules/platforms/cpp/odbc/src/utility.cpp @@ -125,16 +125,6 @@ namespace ignite return res; } - - time_t DateToCTime(const Date& date) - { - return static_cast<time_t>(date.GetSeconds()); - } - - time_t TimestampToCTime(const Timestamp& ts) - { - return static_cast<time_t>(ts.GetSeconds()); - } } }
