You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2017/02/02 07:54:17 UTC

[13/16] ignite git commit: IGNITE-4046: Added DML support to CPP platform. This closes #1432.

IGNITE-4046: Added DML support to CPP platform. This closes #1432.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b0bc6f0c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b0bc6f0c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b0bc6f0c

Branch: refs/heads/ignite-4436-2
Commit: b0bc6f0cb1bdcc3038f48ec0eb34f9a01044ded0
Parents: 529a545
Author: isapego <ig...@gmail.com>
Authored: Wed Feb 1 18:04:20 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Feb 1 18:04:20 2017 +0300

----------------------------------------------------------------------
 modules/platforms/cpp/binary/Makefile.am        |   1 +
 .../platforms/cpp/binary/include/Makefile.am    |   3 +
 .../binary/binary_array_identity_resolver.h     |  64 +++
 .../ignite/binary/binary_identity_resolver.h    |  61 +++
 .../include/ignite/binary/binary_object.h       |   5 +-
 .../binary/include/ignite/binary/binary_type.h  |  16 -
 .../ignite/impl/binary/binary_object_impl.h     |   9 +-
 .../ignite/impl/binary/binary_type_impl.h       | 149 ++++++
 .../ignite/impl/binary/binary_type_snapshot.h   |  18 +-
 .../include/ignite/impl/binary/binary_utils.h   | 175 +------
 .../ignite/impl/binary/binary_writer_impl.h     |  11 +-
 .../ignite/impl/interop/interop_output_stream.h |  10 +-
 .../cpp/binary/project/vs/binary.vcxproj        |   4 +
 .../binary/project/vs/binary.vcxproj.filters    |  12 +
 .../binary/binary_array_identity_resolver.cpp   |  42 ++
 .../cpp/binary/src/binary/binary_type.cpp       |   4 +-
 .../src/impl/binary/binary_object_impl.cpp      |  10 +-
 .../src/impl/binary/binary_type_manager.cpp     |  12 +-
 .../cpp/binary/src/impl/binary/binary_utils.cpp |  80 +--
 .../src/impl/binary/binary_writer_impl.cpp      |   2 -
 .../src/impl/interop/interop_output_stream.cpp  |   5 +
 modules/platforms/cpp/common/Makefile.am        |   5 +-
 .../platforms/cpp/common/include/Makefile.am    |   1 +
 .../include/ignite/common/platform_utils.h      |  79 +++
 .../cpp/common/include/ignite/common/utils.h    | 251 +++++++--
 .../os/linux/src/common/platform_utils.cpp      |  81 +++
 .../cpp/common/os/linux/src/common/utils.cpp    | 148 ------
 .../common/os/win/src/common/platform_utils.cpp |  88 ++++
 .../cpp/common/os/win/src/common/utils.cpp      | 154 ------
 .../cpp/common/project/vs/common.vcxproj        |   4 +-
 .../common/project/vs/common.vcxproj.filters    |  12 +-
 .../platforms/cpp/common/src/common/utils.cpp   | 153 ++++++
 modules/platforms/cpp/core-test/Makefile.am     |   4 +-
 .../cpp/core-test/config/cache-identity.xml     | 121 +++++
 .../cpp/core-test/config/cache-query.xml        |  10 -
 .../cpp/core-test/include/ignite/test_utils.h   |  63 +++
 .../cpp/core-test/project/vs/core-test.vcxproj  |   4 +
 .../project/vs/core-test.vcxproj.filters        |  15 +
 .../src/binary_identity_resolver_test.cpp       | 522 +++++++++++++++++++
 .../cpp/core-test/src/binary_object_test.cpp    |  20 +-
 .../cpp/core-test/src/binary_session_test.cpp   |   4 +-
 .../cpp/core-test/src/cache_query_test.cpp      | 149 +++---
 .../platforms/cpp/core-test/src/cache_test.cpp  |  43 +-
 .../cpp/core-test/src/continuous_query_test.cpp |  31 +-
 .../cpp/core-test/src/ignition_test.cpp         |  19 +-
 .../cpp/core-test/src/interop_test.cpp          |  42 +-
 .../platforms/cpp/core-test/src/test_utils.cpp  |  79 +++
 .../cpp/core-test/src/transactions_test.cpp     |  23 +-
 .../platforms/cpp/core/src/impl/ignite_impl.cpp |   4 +-
 .../cpp/odbc-test/include/test_utils.h          |  51 +-
 .../cpp/odbc-test/src/api_robustness_test.cpp   |  35 +-
 .../src/application_data_buffer_test.cpp        |  24 +-
 .../cpp/odbc-test/src/queries_test.cpp          |  71 +--
 .../src/sql_aggregate_functions_test.cpp        |   1 +
 .../src/sql_date_time_functions_test.cpp        |  26 +-
 .../src/sql_esc_convert_function_test.cpp       |   4 +-
 .../src/sql_numeric_functions_test.cpp          |   1 +
 .../cpp/odbc-test/src/sql_outer_join_test.cpp   |   1 +
 .../odbc-test/src/sql_string_functions_test.cpp |   1 +
 .../odbc-test/src/sql_test_suite_fixture.cpp    |  40 +-
 .../cpp/odbc-test/src/sql_types_test.cpp        |  10 +-
 .../platforms/cpp/odbc-test/src/test_utils.cpp  |  60 ++-
 .../odbc/src/app/application_data_buffer.cpp    |   8 +-
 63 files changed, 2100 insertions(+), 1055 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/Makefile.am b/modules/platforms/cpp/binary/Makefile.am
index cee87cd..c13a1bb 100644
--- a/modules/platforms/cpp/binary/Makefile.am
+++ b/modules/platforms/cpp/binary/Makefile.am
@@ -52,6 +52,7 @@ libignite_binary_la_SOURCES = \
     src/binary/binary_reader.cpp \
     src/binary/binary_type.cpp \
     src/binary/binary_raw_reader.cpp \
+    src/binary/binary_array_identity_resolver.cpp \
     src/impl/binary/binary_type_manager.cpp \
     src/impl/binary/binary_utils.cpp \
     src/impl/binary/binary_reader_impl.cpp \

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/Makefile.am b/modules/platforms/cpp/binary/include/Makefile.am
index 2795cbc..a25a753 100644
--- a/modules/platforms/cpp/binary/include/Makefile.am
+++ b/modules/platforms/cpp/binary/include/Makefile.am
@@ -27,6 +27,8 @@ nobase_include_HEADERS = \
     ignite/binary/binary_consts.h \
     ignite/binary/binary_type.h \
     ignite/binary/binary_object.h \
+    ignite/binary/binary_identity_resolver.h \
+    ignite/binary/binary_array_identity_resolver.h \
     ignite/impl/binary/binary_type_handler.h \
     ignite/impl/binary/binary_id_resolver.h \
     ignite/impl/binary/binary_type_manager.h \
@@ -39,6 +41,7 @@ nobase_include_HEADERS = \
     ignite/impl/binary/binary_utils.h \
     ignite/impl/binary/binary_object_header.h \
     ignite/impl/binary/binary_object_impl.h \
+    ignite/impl/binary/binary_type_impl.h \
     ignite/impl/interop/interop_memory.h \
     ignite/impl/interop/interop.h \
     ignite/impl/interop/interop_stream_position_guard.h \

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/binary/binary_array_identity_resolver.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_array_identity_resolver.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_array_identity_resolver.h
new file mode 100644
index 0000000..70c5ed4
--- /dev/null
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_array_identity_resolver.h
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+
+/**
+ * @file
+ * Declares ignite::binary::BinaryArrayIdentityResolver class template.
+ */
+
+#ifndef _IGNITE_BINARY_BINARY_ARRAY_IDENTITY_RESOLVER
+#define _IGNITE_BINARY_BINARY_ARRAY_IDENTITY_RESOLVER
+
+#include <stdint.h>
+
+#include <ignite/common/common.h>
+#include <ignite/binary/binary_identity_resolver.h>
+
+namespace ignite
+{
+    namespace binary
+    {
+        class BinaryObject;
+
+        /**
+         * Binary array identity resolver.
+         */
+        class IGNITE_IMPORT_EXPORT BinaryArrayIdentityResolver : public BinaryIdentityResolver
+        {
+        public:
+            /**
+             * Default constructor.
+             */
+            BinaryArrayIdentityResolver();
+
+            /**
+             * Destructor.
+             */
+            virtual ~BinaryArrayIdentityResolver();
+
+            /**
+             * Get binary object hash code.
+             *
+             * @param obj Binary object.
+             * @return Hash code.
+             */
+            virtual int32_t GetHashCode(const BinaryObject& obj);
+        };
+    }
+}
+
+#endif //_IGNITE_BINARY_BINARY_ARRAY_IDENTITY_RESOLVER

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/binary/binary_identity_resolver.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_identity_resolver.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_identity_resolver.h
new file mode 100644
index 0000000..ce10012
--- /dev/null
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_identity_resolver.h
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+/**
+ * @file
+ * Declares ignite::binary::BinaryIdentityResolver class.
+ */
+
+#ifndef _IGNITE_BINARY_BINARY_IDENTITY_RESOLVER
+#define _IGNITE_BINARY_BINARY_IDENTITY_RESOLVER
+
+#include <stdint.h>
+
+#include <ignite/common/common.h>
+
+#include <ignite/binary/binary_object.h>
+
+namespace ignite
+{
+    namespace binary
+    {
+        /**
+         * Binary identity resolver.
+         */
+        class IGNITE_IMPORT_EXPORT BinaryIdentityResolver
+        {
+        public:
+            /**
+             * Destructor.
+             */
+            virtual ~BinaryIdentityResolver()
+            {
+                // No-op.
+            }
+
+            /**
+             * Get binary object hash code.
+             *
+             * @param obj Binary object.
+             * @return Hash code.
+             */
+            virtual int32_t GetHashCode(const BinaryObject& obj) = 0;
+        };
+    }
+}
+
+#endif //_IGNITE_BINARY_BINARY_IDENTITY_RESOLVER

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/binary/binary_object.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_object.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_object.h
index 41907d0..08b503e 100644
--- a/modules/platforms/cpp/binary/include/ignite/binary/binary_object.h
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_object.h
@@ -25,14 +25,14 @@
 
 #include <stdint.h>
 
-#include <ignite/impl/interop/interop.h>
-#include <ignite/impl/binary/binary_reader_impl.h>
 #include <ignite/impl/binary/binary_object_impl.h>
 
 namespace ignite
 {
     namespace binary
     {
+        class BinaryArrayIdentityResolver;
+
         /**
          * Binary object.
          *
@@ -41,6 +41,7 @@ namespace ignite
          */
         class IGNITE_IMPORT_EXPORT BinaryObject : private impl::binary::BinaryObjectImpl
         {
+            friend class BinaryArrayIdentityResolver;
         public:
             /// @cond INTERNAL
             /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h b/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h
index 978a928..1c37f6d 100644
--- a/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h
+++ b/modules/platforms/cpp/binary/include/ignite/binary/binary_type.h
@@ -189,17 +189,6 @@ namespace ignite
             }
 
             /**
-             * Get binary object hash code.
-             *
-             * @param obj Binary object.
-             * @return Hash code.
-             */
-            int32_t GetHashCode(const T& obj)
-            {
-                return 0;
-            }
-
-            /**
              * Write binary object.
              *
              * @param writer Writer.
@@ -275,11 +264,6 @@ namespace ignite
                 return typ.GetFieldId(name);
             }
 
-            int32_t GetHashCode(T* const& obj)
-            {
-                return typ.GetHashCode(*obj);
-            }
-
             void Write(BinaryWriter& writer, T* const& obj)
             {
                 typ.Write(writer, *obj);

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_object_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_object_impl.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_object_impl.h
index 288ba26..efe1f49 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_object_impl.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_object_impl.h
@@ -72,7 +72,6 @@ namespace ignite
 
                 /**
                  * Get object data.
-                 * @throw IgniteError if the object is not in a valid state.
                  *
                  * @return Pointer to object data.
                  */
@@ -86,6 +85,14 @@ namespace ignite
                  */
                 int32_t GetLength() const;
 
+                /**
+                 * Get object hash code.
+                 * @throw IgniteError if the object is not in a valid state.
+                 *
+                 * @return Object hash code.
+                 */
+                int32_t GetHashCode() const;
+
             private:
                 IGNITE_NO_COPY_ASSIGNMENT(BinaryObjectImpl)
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_impl.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_impl.h
new file mode 100644
index 0000000..d0cbb86
--- /dev/null
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_impl.h
@@ -0,0 +1,149 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_IMPL_BINARY_BINARY_TYPE_IMP
+#define _IGNITE_IMPL_BINARY_BINARY_TYPE_IMP
+
+#include <stdint.h>
+
+#include <ignite/common/utils.h>
+
+#include <ignite/binary/binary_type.h>
+#include <ignite/binary/binary_object.h>
+#include <ignite/binary/binary_array_identity_resolver.h>
+
+#include <ignite/reference.h>
+
+/**
+ * Some SFINAE magic to check existence of the specified method with the
+ * specified signature in the BinaryType<T> class.
+ *
+ * This macro declares checker for the method.
+ */
+#define IGNITE_DECLARE_BINARY_TYPE_METHOD_CHECKER(method, sign)                         \
+    template<typename T>                                                                \
+    class IsDeclaredBinaryType##method                                                  \
+    {                                                                                   \
+        typedef char one;                                                               \
+        typedef char two[2];                                                            \
+                                                                                        \
+        template<class U, U> struct test;                                               \
+                                                                                        \
+        template<typename C> static one& helper(test<sign, &C::method>*);               \
+        template<typename C> static two& helper(...);                                   \
+                                                                                        \
+    public:                                                                             \
+        const static bool value =                                                       \
+            (sizeof(helper< ignite::binary::BinaryType<T> >(0)) == sizeof(one));        \
+    }
+
+namespace ignite
+{
+    namespace impl
+    {
+        namespace binary
+        {
+            IGNITE_DECLARE_BINARY_TYPE_METHOD_CHECKER(GetHashCode, int32_t(ignite::binary::BinaryType<T>::*)(const T&));
+            IGNITE_DECLARE_BINARY_TYPE_METHOD_CHECKER(GetIdentityResolver,
+                ignite::Reference<ignite::binary::BinaryIdentityResolver>(ignite::binary::BinaryType<T>::*)());
+
+            /**
+             * This type is used to get hash code for binary types which have not
+             * GetHashCode nor GetIdentityResolver methods defined.
+             */
+            template<typename T>
+            struct HashCodeGetterDefault
+            {
+                static int32_t Get(const T&, const ignite::binary::BinaryObject& obj)
+                {
+                    ignite::binary::BinaryArrayIdentityResolver arrayResolver;
+
+                    return arrayResolver.GetHashCode(obj);
+                }
+            };
+
+            /**
+             * This type is used to get hash code for binary types which have not
+             * GetIdentityResolver method defined but have GetHashCode.
+             */
+            template<typename T>
+            struct HashCodeGetterHashCode
+            {
+                static int32_t Get(const T& obj, const ignite::binary::BinaryObject&)
+                {
+                    ignite::binary::BinaryType<T> bt;
+
+                    return bt.GetHashCode(obj);
+                }
+            };
+
+            /**
+             * This type is used to get hash code for binary types which have
+             * GetIdentityResolver method defined.
+             */
+            template<typename T>
+            struct HashCodeGetterResolver
+            {
+                static int32_t Get(const T&, const ignite::binary::BinaryObject& obj)
+                {
+                    ignite::binary::BinaryType<T> bt;
+                    ignite::Reference<ignite::binary::BinaryIdentityResolver> resolver = bt.GetIdentityResolver();
+
+                    return resolver.Get().GetHashCode(obj);
+                }
+            };
+
+            /**
+             * Get hash code for the specified object.
+             * Determines the best method to use based on user-defined methods.
+             *
+             * @param obj Object reference.
+             * @param binObj Binary representation reference.
+             * @return Hash code for the object.
+             */
+            template<typename T>
+            int32_t GetHashCode(const T& obj, const ignite::binary::BinaryObject& binObj)
+            {
+                using namespace common;
+
+                typedef typename Conditional<
+                    // Checking if the BinaryType<T>::GetIdentityResolver declared
+                    IsDeclaredBinaryTypeGetIdentityResolver<T>::value,
+
+                    // True case. Using user-provided resolver.
+                    HashCodeGetterResolver<T>,
+
+                    // False case. Adding condition.
+                    typename Conditional<
+                        // Checking if the BinaryType<T>::GetHashCode declared
+                        IsDeclaredBinaryTypeGetHashCode<T>::value,
+
+                        // True case - using BinaryType<T>::GetHashCode().
+                        HashCodeGetterHashCode<T>,
+
+                        // False case. Using default getter.
+                        HashCodeGetterDefault<T> 
+                    >::type
+                >::type HashCodeGetter;
+
+                return HashCodeGetter::Get(obj, binObj);
+            }
+        }
+    }
+}
+
+#endif //_IGNITE_IMPL_BINARY_BINARY_TYPE_IMP

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_snapshot.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_snapshot.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_snapshot.h
index 4a8b41f..f1959fc 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_snapshot.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_type_snapshot.h
@@ -27,13 +27,13 @@
 #include <ignite/common/concurrent.h>
 
 namespace ignite
-{    
+{
     namespace impl
     {
         namespace binary
         {
             /**
-             * Type snapshot. 
+             * Type snapshot.
              */
             class BinaryTypeSnapshot
             {
@@ -48,7 +48,7 @@ namespace ignite
                  */
                 BinaryTypeSnapshot(std::string typeName, int32_t typeId, std::set<int32_t>* fieldIds, 
                     std::map<std::string, int32_t>* fields);
-                
+
                 /**
                  * Destructor.
                  */
@@ -65,7 +65,7 @@ namespace ignite
                 /**
                  * Get type name.
                  *
-                 * @param Type name.
+                 * @return Type name.
                  */
                 std::string GetTypeName();
 
@@ -79,14 +79,14 @@ namespace ignite
                 /**
                  * Whether snapshot contains any fields.
                  *
-                 * @param True if fields exist.
+                 * @return True if fields exist.
                  */
                 bool HasFields();
 
                 /** 
                  * Get field IDs.
                  *
-                 * @param Field IDs.
+                 * @return Field IDs.
                  */
                 std::set<int32_t>* GetFieldIds();
 
@@ -99,8 +99,8 @@ namespace ignite
 
             private:
                 /** Type name. */
-                std::string typeName;                   
-                
+                std::string typeName;
+
                 /** Type ID. */
                 int32_t typeId;
 
@@ -116,7 +116,7 @@ namespace ignite
             typedef BinaryTypeSnapshot Snap;
             typedef ignite::common::concurrent::SharedPointer<Snap> SPSnap;
         }
-    }    
+    }
 }
 
 #endif //_IGNITE_IMPL_BINARY_BINARY_TYPE_SNAPSHOT
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/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 9599fce..b541483 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
@@ -48,6 +48,15 @@ namespace ignite
             {
             public:
                 /**
+                 * Get data hash code.
+                 *
+                 * @param data Data pointer.
+                 * @param size Data size in bytes.
+                 * @return Hash code.
+                 */
+                static int32_t GetDataHashCode(const void* data, size_t size);
+
+                /**
                  * Utility method to read signed 8-bit integer from stream.
                  *
                  * @param stream Stream.
@@ -437,172 +446,6 @@ namespace ignite
                 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::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::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::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::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);
-
-                /**
                  * Get default value for the type.
                  *
                  * @return Null value for non primitive types and zeroes for primitives.

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
index 6ee088d..fc38837 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/binary/binary_writer_impl.h
@@ -31,6 +31,7 @@
 #include "ignite/impl/binary/binary_type_manager.h"
 #include "ignite/impl/binary/binary_utils.h"
 #include "ignite/impl/binary/binary_schema.h"
+#include "ignite/impl/binary/binary_type_impl.h"
 #include "ignite/binary/binary_consts.h"
 #include "ignite/binary/binary_type.h"
 #include "ignite/guid.h"
@@ -669,15 +670,21 @@ namespace ignite
                         stream->WriteInt8(IGNITE_PROTO_VER);
                         stream->WriteInt16(IGNITE_BINARY_FLAG_USER_TYPE);
                         stream->WriteInt32(idRslvr.GetTypeId());
-                        stream->WriteInt32(type.GetHashCode(obj));
 
-                        // Reserve space for the Object Lenght, Schema ID and Schema or Raw Offsett.
+                        int32_t hashPos = stream->Reserve(4);
+
+                        // Reserve space for the Object Lenght, Schema ID and Schema or Raw Offset.
                         stream->Reserve(12);
 
                         type.Write(writer, obj);
 
                         writerImpl.PostWrite();
 
+                        stream->Synchronize();
+
+                        ignite::binary::BinaryObject binObj(*stream->GetMemory(), pos);
+                        stream->WriteInt32(hashPos, impl::binary::GetHashCode<T>(obj, binObj));
+
                         if (metaMgr)
                             metaMgr->SubmitHandler(type.GetTypeName(), idRslvr.GetTypeId(), metaHnd.Get());
                     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/include/ignite/impl/interop/interop_output_stream.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/include/ignite/impl/interop/interop_output_stream.h b/modules/platforms/cpp/binary/include/ignite/impl/interop/interop_output_stream.h
index c5bb884..9df3b1f 100644
--- a/modules/platforms/cpp/binary/include/ignite/impl/interop/interop_output_stream.h
+++ b/modules/platforms/cpp/binary/include/ignite/impl/interop/interop_output_stream.h
@@ -205,6 +205,14 @@ namespace ignite
                  * Synchronize data with underlying memory.
                  */
                 void Synchronize();
+
+                /**
+                 * Get underlying memory.
+                 *
+                 * @return Underlying memory.
+                 */
+                InteropMemory* GetMemory();
+
             private:
                 /** Memory. */
                 InteropMemory* mem; 
@@ -237,7 +245,7 @@ namespace ignite
                 /**
                  * Copy data to the stream shifting it along the way.
                  *
-                 * @param ptr Pointer to data.
+                 * @param src Pointer to data.
                  * @param off Offset.
                  * @param len Length.
                  */

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/project/vs/binary.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/project/vs/binary.vcxproj b/modules/platforms/cpp/binary/project/vs/binary.vcxproj
index 887eb96..6c1c433 100644
--- a/modules/platforms/cpp/binary/project/vs/binary.vcxproj
+++ b/modules/platforms/cpp/binary/project/vs/binary.vcxproj
@@ -181,6 +181,8 @@
     <ClInclude Include="..\..\include\ignite\binary\binary_consts.h" />
     <ClInclude Include="..\..\include\ignite\binary\binary_containers.h" />
     <ClInclude Include="..\..\include\ignite\binary\binary_object.h" />
+    <ClInclude Include="..\..\include\ignite\binary\binary_identity_resolver.h" />
+    <ClInclude Include="..\..\include\ignite\binary\binary_array_identity_resolver.h" />
     <ClInclude Include="..\..\include\ignite\binary\binary_raw_reader.h" />
     <ClInclude Include="..\..\include\ignite\binary\binary_raw_writer.h" />
     <ClInclude Include="..\..\include\ignite\binary\binary_reader.h" />
@@ -193,6 +195,7 @@
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_reader_impl.h" />
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_schema.h" />
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_type_handler.h" />
+    <ClInclude Include="..\..\include\ignite\impl\binary\binary_type_impl.h" />
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_type_manager.h" />
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_type_snapshot.h" />
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_type_updater.h" />
@@ -205,6 +208,7 @@
     <ClInclude Include="..\..\include\ignite\impl\interop\interop_stream_position_guard.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="..\..\src\binary\binary_array_identity_resolver.cpp" />
     <ClCompile Include="..\..\src\binary\binary_containers.cpp" />
     <ClCompile Include="..\..\src\binary\binary_raw_reader.cpp" />
     <ClCompile Include="..\..\src\binary\binary_raw_writer.cpp" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters b/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
index a1a83ef..c649c4d 100644
--- a/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
+++ b/modules/platforms/cpp/binary/project/vs/binary.vcxproj.filters
@@ -97,6 +97,15 @@
     <ClInclude Include="..\..\include\ignite\impl\binary\binary_object_impl.h">
       <Filter>Code\impl\binary</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\include\ignite\binary\binary_array_identity_resolver.h">
+      <Filter>Code\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\include\ignite\binary\binary_identity_resolver.h">
+      <Filter>Code\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\include\ignite\impl\binary\binary_type_impl.h">
+      <Filter>Code\impl\binary</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\src\binary\binary_containers.cpp">
@@ -156,5 +165,8 @@
     <ClCompile Include="..\..\src\impl\binary\binary_object_impl.cpp">
       <Filter>Code\impl\binary</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\binary\binary_array_identity_resolver.cpp">
+      <Filter>Code\binary</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/src/binary/binary_array_identity_resolver.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/binary/binary_array_identity_resolver.cpp b/modules/platforms/cpp/binary/src/binary/binary_array_identity_resolver.cpp
new file mode 100644
index 0000000..1d4e384
--- /dev/null
+++ b/modules/platforms/cpp/binary/src/binary/binary_array_identity_resolver.cpp
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+#include <ignite/binary/binary_object.h>
+#include <ignite/impl/binary/binary_utils.h>
+
+#include <ignite/binary/binary_array_identity_resolver.h>
+
+namespace ignite
+{
+    namespace binary
+    {
+        BinaryArrayIdentityResolver::BinaryArrayIdentityResolver()
+        {
+            // No-op.
+        }
+
+        BinaryArrayIdentityResolver::~BinaryArrayIdentityResolver()
+        {
+            // No-op.
+        }
+
+        int32_t BinaryArrayIdentityResolver::GetHashCode(const BinaryObject& obj)
+        {
+            return impl::binary::BinaryUtils::GetDataHashCode(obj.GetData(), obj.GetLength());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/src/binary/binary_type.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/binary/binary_type.cpp b/modules/platforms/cpp/binary/src/binary/binary_type.cpp
index 19d906d..0ea5a92 100644
--- a/modules/platforms/cpp/binary/src/binary/binary_type.cpp
+++ b/modules/platforms/cpp/binary/src/binary/binary_type.cpp
@@ -44,8 +44,8 @@ namespace ignite
 
                 return hash;
             }
-            else
-                return 0;
+
+            return 0;
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/src/impl/binary/binary_object_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/impl/binary/binary_object_impl.cpp b/modules/platforms/cpp/binary/src/impl/binary/binary_object_impl.cpp
index 652d54d..8167f8b 100644
--- a/modules/platforms/cpp/binary/src/impl/binary/binary_object_impl.cpp
+++ b/modules/platforms/cpp/binary/src/impl/binary/binary_object_impl.cpp
@@ -35,9 +35,6 @@ namespace ignite
 
             const int8_t* BinaryObjectImpl::GetData() const
             {
-                // Creating header here to validate object header layout.
-                BinaryObjectHeader header = BinaryObjectHeader::FromMemory(mem, start);
-
                 return mem.Data() + start + BinaryObjectHeader::SIZE;
             }
 
@@ -47,6 +44,13 @@ namespace ignite
 
                 return header.GetDataLength();
             }
+
+            int32_t BinaryObjectImpl::GetHashCode() const
+            {
+                BinaryObjectHeader header = BinaryObjectHeader::FromMemory(mem, start);
+
+                return header.GetHashCode();
+            }
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/src/impl/binary/binary_type_manager.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/impl/binary/binary_type_manager.cpp b/modules/platforms/cpp/binary/src/impl/binary/binary_type_manager.cpp
index 8b5dfc1..a6692d1 100644
--- a/modules/platforms/cpp/binary/src/impl/binary/binary_type_manager.cpp
+++ b/modules/platforms/cpp/binary/src/impl/binary/binary_type_manager.cpp
@@ -46,9 +46,7 @@ namespace ignite
 
             SharedPointer<BinaryTypeHandler> BinaryTypeManager::GetHandler(int32_t typeId)
             {
-                SharedPointer<std::map<int32_t, SPSnap> > snapshots0 = snapshots;
-
-                SPSnap snapshot = (*snapshots0.Get())[typeId];
+                SPSnap snapshot = (*snapshots.Get())[typeId];
 
                 return SharedPointer<BinaryTypeHandler>(new BinaryTypeHandler(snapshot));
             }
@@ -108,12 +106,12 @@ namespace ignite
             bool BinaryTypeManager::ProcessPendingUpdates(BinaryTypeUpdater* updater, IgniteError* err)
             {
                 bool success = true; // Optimistically assume that all will be fine.
-                
-                cs->Enter();
+
+                CsLockGuard guard(*cs);
 
                 for (std::vector<SPSnap>::iterator it = pending->begin(); it != pending->end(); ++it)
                 {
-                    Snap* pendingSnap = (*it).Get();
+                    Snap* pendingSnap = it->Get();
 
                     if (updater->Update(pendingSnap, err))
                     {
@@ -174,8 +172,6 @@ namespace ignite
                     ver = pendingVer;
                 }
 
-                cs->Leave();
-
                 return success;
             }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/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 bffd038..5fe8d83 100644
--- a/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp
+++ b/modules/platforms/cpp/binary/src/impl/binary/binary_utils.cpp
@@ -82,6 +82,22 @@ namespace ignite
     {
         namespace binary
         {
+            int32_t BinaryUtils::GetDataHashCode(const void * data, size_t size)
+            {
+                if (data)
+                {
+                    int32_t hash = 1;
+                    const int8_t* bytes = static_cast<const int8_t*>(data);
+
+                    for (int i = 0; i < size; ++i)
+                        hash = 31 * hash + bytes[i];
+
+                    return hash;
+                }
+
+                return 0;
+            }
+
             int8_t BinaryUtils::ReadInt8(InteropInputStream* stream)
             {
                 return stream->ReadInt8();
@@ -317,70 +333,6 @@ 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::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::IgniteTimeLocal(date);
-
-                return CTimeToTimestamp(localTime, ns);
-            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp b/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
index 20fb74d..b8f95b3 100644
--- a/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
+++ b/modules/platforms/cpp/binary/src/impl/binary/binary_writer_impl.cpp
@@ -709,8 +709,6 @@ namespace ignite
             {
                 int32_t lenWithoutSchema = stream->Position() - start;
 
-                int32_t nonRawLen = rawPos == -1 ? lenWithoutSchema : rawPos - start;
-
                 uint16_t flags = IGNITE_BINARY_FLAG_USER_TYPE;
 
                 if (rawPos > 0)

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/binary/src/impl/interop/interop_output_stream.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/binary/src/impl/interop/interop_output_stream.cpp b/modules/platforms/cpp/binary/src/impl/interop/interop_output_stream.cpp
index 374f634..ab58f1e 100644
--- a/modules/platforms/cpp/binary/src/impl/interop/interop_output_stream.cpp
+++ b/modules/platforms/cpp/binary/src/impl/interop/interop_output_stream.cpp
@@ -204,6 +204,11 @@ namespace ignite
                 mem->Length(pos);
             }
 
+            InteropMemory* InteropOutputStream::GetMemory()
+            {
+                return mem;
+            }
+
             void InteropOutputStream::EnsureCapacity(int32_t reqCap) {
                 if (reqCap > cap) {
                     int newCap = cap << 1;

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/Makefile.am b/modules/platforms/cpp/common/Makefile.am
index 9c27a57..8c79c3e 100644
--- a/modules/platforms/cpp/common/Makefile.am
+++ b/modules/platforms/cpp/common/Makefile.am
@@ -43,16 +43,17 @@ libignite_common_la_LDFLAGS = \
 
 libignite_common_la_SOURCES = \
     os/linux/src/common/concurrent_os.cpp \
-    os/linux/src/common/utils.cpp \
+    os/linux/src/common/platform_utils.cpp \
     src/common/big_integer.cpp \
     src/common/concurrent.cpp \
     src/common/decimal.cpp \
     src/common/bits.cpp \
+    src/common/utils.cpp \
     src/date.cpp \
     src/ignite_error.cpp \
     src/guid.cpp \
     src/timestamp.cpp
-	
+
 clean-local:
 	$(RM) *.gcno *.gcda
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/include/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/include/Makefile.am b/modules/platforms/cpp/common/include/Makefile.am
index a5073f6..7f7ab83 100644
--- a/modules/platforms/cpp/common/include/Makefile.am
+++ b/modules/platforms/cpp/common/include/Makefile.am
@@ -27,6 +27,7 @@ nobase_include_HEADERS = \
 	ignite/common/dynamic_size_array.h \
 	ignite/common/fixed_size_array.h \
 	ignite/common/utils.h \
+	ignite/common/platform_utils.h \
 	ignite/date.h \
 	ignite/guid.h \
 	ignite/ignite_error.h \

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/include/ignite/common/platform_utils.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/include/ignite/common/platform_utils.h b/modules/platforms/cpp/common/include/ignite/common/platform_utils.h
new file mode 100644
index 0000000..273a5e0
--- /dev/null
+++ b/modules/platforms/cpp/common/include/ignite/common/platform_utils.h
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+#ifndef _IGNITE_COMMON_PLATFORM_UTILS
+#define _IGNITE_COMMON_PLATFORM_UTILS
+
+#include <ignite/common/common.h>
+
+namespace ignite
+{
+    namespace common
+    {
+        /**
+         * 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);
+
+        /**
+         * Read system environment variable taking thread-safety in count.
+         *
+         * @param name Environment variable name.
+         * @param found Whether environment variable with such name was found.
+         * @return Environment variable value.
+         */
+        IGNITE_IMPORT_EXPORT std::string GetEnv(const std::string& name, bool& found);
+
+        /**
+         * Ensure that file on the given path exists in the system.
+         *
+         * @param path Path.
+         * @return True if file exists, false otherwise.
+         */
+        IGNITE_IMPORT_EXPORT bool FileExists(const std::string& path);
+    }
+}
+
+#endif //_IGNITE_COMMON_PLATFORM_UTILS
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/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 6ac3c17..bf1f39b 100644
--- a/modules/platforms/cpp/common/include/ignite/common/utils.h
+++ b/modules/platforms/cpp/common/include/ignite/common/utils.h
@@ -25,6 +25,10 @@
 #include <algorithm>
 
 #include <ignite/common/common.h>
+#include <ignite/common/platform_utils.h>
+
+#include <ignite/date.h>
+#include <ignite/timestamp.h>
 
 #ifdef IGNITE_FRIEND
 #   define IGNITE_FRIEND_EXPORT IGNITE_EXPORT
@@ -91,40 +95,6 @@ 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);
-
-        /**
          * Copy characters.
          *
          * @param val Value.
@@ -140,23 +110,6 @@ namespace ignite
         IGNITE_IMPORT_EXPORT void ReleaseChars(char* val);
 
         /**
-         * Read system environment variable taking thread-safety in count.
-         *
-         * @param name Environment variable name.
-         * @param found Whether environment variable with such name was found.
-         * @return Environment variable value.
-         */
-        IGNITE_IMPORT_EXPORT std::string GetEnv(const std::string& name, bool& found);
-
-        /**
-         * Ensure that file on the given path exists in the system.
-         *
-         * @param path Path.
-         * @return True if file exists, false otherwise.
-         */
-        IGNITE_IMPORT_EXPORT bool FileExists(const std::string& path);
-
-        /**
          * Casts value of one type to another type, using stringstream.
          *
          * @param val Input value.
@@ -206,12 +159,198 @@ namespace ignite
         }
 
         /**
-        * Converts 32-bit integer to big endian format
-        *
-        * @param value Input value
-        * @return Resulting value
-        */
+         * Converts 32-bit integer to big endian format
+         *
+         * @param value Input value
+         * @return Resulting value
+         */
         IGNITE_IMPORT_EXPORT uint32_t ToBigEndian(uint32_t value);
+
+        /**
+         * Convert Date type to standard C type time_t.
+         *
+         * @param date Date type value.
+         * @return Corresponding value of time_t.
+         */
+        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.
+         */
+        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.
+         */
+        inline bool DateToCTm(const Date& date, tm& ctime)
+        {
+            time_t tmt = DateToCTime(date);
+
+            return common::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.
+         */
+        inline bool TimestampToCTm(const Timestamp& ts, tm& ctime)
+        {
+            time_t tmt = TimestampToCTime(ts);
+
+            return common::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.
+         */
+        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.
+         */
+        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.
+         */
+        inline Date CTmToDate(const tm& ctime)
+        {
+            time_t time = common::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.
+         */
+        inline Timestamp CTmToTimestamp(const tm& ctime, int32_t ns)
+        {
+            time_t time = common::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.
+         */
+        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.
+         */
+        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.
+         */
+        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.
+         */
+        Timestamp MakeTimestampLocal(int year = 1900, int month = 1,
+            int day = 1, int hour = 0, int min = 0, int sec = 0, long ns = 0);
+
+        /**
+         * Meta-programming class.
+         * Defines T1 as ::type if the condition is true, otherwise
+         * defines T2 as ::type.
+         */
+        template<bool, typename T1, typename T2>
+        struct Conditional
+        {
+            typedef T1 type;
+        };
+
+        /**
+         * Specialization for the false case.
+         */
+        template<typename T1, typename T2>
+        struct Conditional<false, T1, T2>
+        {
+            typedef T2 type;
+        };
     }
 }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/os/linux/src/common/platform_utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/linux/src/common/platform_utils.cpp b/modules/platforms/cpp/common/os/linux/src/common/platform_utils.cpp
new file mode 100644
index 0000000..a3e1d17
--- /dev/null
+++ b/modules/platforms/cpp/common/os/linux/src/common/platform_utils.cpp
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+#include <time.h>
+
+#include <sys/stat.h>
+#include <dirent.h>
+#include <dlfcn.h>
+
+#include <ignite/common/utils.h>
+
+namespace ignite
+{
+    namespace common
+    {
+        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;
+        }
+
+        std::string GetEnv(const std::string& name, bool& found)
+        {
+            char* val = std::getenv(name.c_str());
+
+            if (val)
+            {
+                found = true;
+
+                return std::string(val);
+            }
+            else
+            {
+                found = false;
+
+                return std::string();
+            }
+        }
+
+        bool FileExists(const std::string& path)
+        {
+            struct stat s;
+
+            int res = stat(path.c_str(), &s);
+
+            return res != -1;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/os/linux/src/common/utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/linux/src/common/utils.cpp b/modules/platforms/cpp/common/os/linux/src/common/utils.cpp
deleted file mode 100644
index 0fa9231..0000000
--- a/modules/platforms/cpp/common/os/linux/src/common/utils.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * 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.
- */
-
-#include <time.h>
-
-#include <sys/stat.h>
-#include <dirent.h>
-#include <dlfcn.h>
-
-#include <ignite/common/utils.h>
-
-namespace ignite
-{
-    namespace common
-    {
-        /**
-         * Check if string ends with the given ending.
-         *
-         * @param str String to check.
-         * @param ending Ending.
-         * @return Result.
-         */
-        inline bool StringEndsWith(const std::string& str, const std::string& ending)
-        {
-            if (str.length() > ending.length())
-                return str.compare(str.length() - ending.length(), ending.length(), ending) == 0;
-
-            return false;
-        }
-
-        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;
-
-            int zeroes = 1;
-
-            if (octet >> 4 == 0) {
-                zeroes += 4;
-                octet <<= 4;
-            }
-
-            if (octet >> 6 == 0) {
-                zeroes += 2;
-                octet <<= 2;
-            }
-
-            zeroes -= octet >> 7;
-
-            return zeroes;
-        }
-
-        char* CopyChars(const char* val)
-        {
-            if (val) {
-                size_t len = strlen(val);
-                char* dest = new char[len + 1];
-                strcpy(dest, val);
-                *(dest + len) = 0;
-                return dest;
-            }
-            else
-                return NULL;
-        }
-
-        void ReleaseChars(char* val)
-        {
-            if (val)
-                delete[] val;
-        }
-
-        std::string GetEnv(const std::string& name, bool& found)
-        {
-            char* val = std::getenv(name.c_str());
-
-            if (val)
-            {
-                found = true;
-
-                return std::string(val);
-            }
-            else
-            {
-                found = false;
-
-                return std::string();
-            }
-        }
-
-        bool FileExists(const std::string& path)
-        {
-            struct stat s;
-
-            int res = stat(path.c_str(), &s);
-
-            return res != -1;
-        }
-
-        uint32_t ToBigEndian(uint32_t value)
-        {
-            // The answer is 42
-            static const int num = 42;
-            static const bool isLittleEndian = (*reinterpret_cast<const char*>(&num) == num);
-
-            if (isLittleEndian)
-                return ((value & 0xFF) << 24) | (((value >> 8) & 0xFF) << 16) | (((value >> 16) & 0xFF) << 8) | ((value >> 24) & 0xFF);
-
-            return value;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/os/win/src/common/platform_utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/win/src/common/platform_utils.cpp b/modules/platforms/cpp/common/os/win/src/common/platform_utils.cpp
new file mode 100644
index 0000000..16fd6ec
--- /dev/null
+++ b/modules/platforms/cpp/common/os/win/src/common/platform_utils.cpp
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ */
+
+#include <time.h>
+
+#include <windows.h>
+
+#include <ignite/common/platform_utils.h>
+
+namespace ignite
+{
+    namespace common
+    {
+        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;
+        }
+
+        std::string GetEnv(const std::string& name, bool& found)
+        {
+            char res0[32767];
+
+            DWORD envRes = GetEnvironmentVariableA(name.c_str(), res0, 32767);
+
+            if (envRes != 0)
+            {
+                found = true;
+
+                return std::string(res0);
+            }
+            else
+            {
+                found = false;
+
+                return std::string();
+            }
+        }
+
+        bool FileExists(const std::string& path)
+        {
+            WIN32_FIND_DATAA findres;
+
+            HANDLE hnd = FindFirstFileA(path.c_str(), &findres);
+
+            if (hnd == INVALID_HANDLE_VALUE)
+                return false;
+            else
+            {
+                FindClose(hnd);
+
+                return true;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/os/win/src/common/utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/win/src/common/utils.cpp b/modules/platforms/cpp/common/os/win/src/common/utils.cpp
deleted file mode 100644
index c6afce2..0000000
--- a/modules/platforms/cpp/common/os/win/src/common/utils.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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.
- */
-
-#include <time.h>
-
-#include <windows.h>
-
-#include <ignite/common/utils.h>
-
-namespace ignite
-{
-    namespace common
-    {
-        /**
-         * Check if string ends with the given ending.
-         *
-         * @param str String to check.
-         * @param ending Ending.
-         * @return Result.
-         */
-        inline bool StringEndsWith(const std::string& str, const std::string& ending)
-        {
-            if (str.length() > ending.length())
-                return str.compare(str.length() - ending.length(), ending.length(), ending) == 0;
-
-            return false;
-        }
-
-        void StripSurroundingWhitespaces(std::string& str)
-        {
-            std::string::size_type newBegin = 0;
-            while (newBegin < str.size() && ::isspace(str[newBegin]))
-                ++newBegin;
-
-            if (newBegin == str.size())
-            {
-                str.clear();
-
-                return;
-            }
-
-            std::string::size_type newEnd = str.size() - 1;
-            while (::isspace(str[newEnd]))
-                --newEnd;
-
-            str.assign(str, newBegin, (newEnd - newBegin) + 1);
-        }
-
-        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;
-        }
-
-        char* CopyChars(const char* val)
-        {
-            if (val) {
-                size_t len = strlen(val);
-                char* dest = new char[len + 1];
-                strcpy(dest, val);
-                *(dest + len) = 0;
-                return dest;
-            }
-            else
-                return NULL;
-        }
-
-        void ReleaseChars(char* val)
-        {
-            if (val)
-                delete[] val;
-        }
-
-        std::string GetEnv(const std::string& name, bool& found)
-        {
-            char res0[32767];
-
-            DWORD envRes = GetEnvironmentVariableA(name.c_str(), res0, 32767);
-
-            if (envRes != 0)
-            {
-                found = true;
-
-                return std::string(res0);
-            }
-            else
-            {
-                found = false;
-
-                return std::string();
-            }
-        }
-
-        bool FileExists(const std::string& path)
-        {
-            WIN32_FIND_DATAA findres;
-
-            HANDLE hnd = FindFirstFileA(path.c_str(), &findres);
-
-            if (hnd == INVALID_HANDLE_VALUE)
-                return false;
-            else
-            {
-                FindClose(hnd);
-
-                return true;
-            }
-        }
-
-        uint32_t ToBigEndian(uint32_t value)
-        {
-            // The answer is 42
-            static const int num = 42;
-            static const bool isLittleEndian = (*reinterpret_cast<const char*>(&num) == num);
-
-            if (isLittleEndian)
-                return ((value & 0xFF) << 24) | (((value >> 8) & 0xFF) << 16) | (((value >> 16) & 0xFF) << 8) | ((value >> 24) & 0xFF);
-
-            return value;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/project/vs/common.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/project/vs/common.vcxproj b/modules/platforms/cpp/common/project/vs/common.vcxproj
index b4431f8..7a57ac0 100644
--- a/modules/platforms/cpp/common/project/vs/common.vcxproj
+++ b/modules/platforms/cpp/common/project/vs/common.vcxproj
@@ -172,6 +172,7 @@
     <ClInclude Include="..\..\include\ignite\common\dynamic_size_array.h" />
     <ClInclude Include="..\..\include\ignite\common\fixed_size_array.h" />
     <ClInclude Include="..\..\include\ignite\common\bits.h" />
+    <ClInclude Include="..\..\include\ignite\common\platform_utils.h" />
     <ClInclude Include="..\..\include\ignite\common\reference_impl.h" />
     <ClInclude Include="..\..\include\ignite\common\utils.h" />
     <ClInclude Include="..\..\include\ignite\date.h" />
@@ -185,11 +186,12 @@
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\os\win\src\common\concurrent_os.cpp" />
-    <ClCompile Include="..\..\os\win\src\common\utils.cpp" />
+    <ClCompile Include="..\..\os\win\src\common\platform_utils.cpp" />
     <ClCompile Include="..\..\src\common\big_integer.cpp" />
     <ClCompile Include="..\..\src\common\bits.cpp" />
     <ClCompile Include="..\..\src\common\concurrent.cpp" />
     <ClCompile Include="..\..\src\common\decimal.cpp" />
+    <ClCompile Include="..\..\src\common\utils.cpp" />
     <ClCompile Include="..\..\src\date.cpp" />
     <ClCompile Include="..\..\src\guid.cpp" />
     <ClCompile Include="..\..\src\ignite_error.cpp" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/project/vs/common.vcxproj.filters b/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
index d99722b..f08471e 100644
--- a/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
+++ b/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
@@ -64,6 +64,9 @@
     <ClInclude Include="..\..\include\ignite\reference.h">
       <Filter>Code</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\include\ignite\common\platform_utils.h">
+      <Filter>Code\common</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\src\date.cpp">
@@ -78,9 +81,6 @@
     <ClCompile Include="..\..\os\win\src\common\concurrent_os.cpp">
       <Filter>Code\common</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\os\win\src\common\utils.cpp">
-      <Filter>Code\common</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\common\concurrent.cpp">
       <Filter>Code\common</Filter>
     </ClCompile>
@@ -96,5 +96,11 @@
     <ClCompile Include="..\..\src\common\bits.cpp">
       <Filter>Code\common</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\os\win\src\common\platform_utils.cpp">
+      <Filter>Code\common</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\common\utils.cpp">
+      <Filter>Code\common</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/common/src/common/utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/src/common/utils.cpp b/modules/platforms/cpp/common/src/common/utils.cpp
new file mode 100644
index 0000000..27d2473
--- /dev/null
+++ b/modules/platforms/cpp/common/src/common/utils.cpp
@@ -0,0 +1,153 @@
+/*
+ * 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.
+ */
+
+#include <ignite/common/utils.h>
+
+namespace ignite
+{
+    namespace common
+    {
+        /**
+         * Check if string ends with the given ending.
+         *
+         * @param str String to check.
+         * @param ending Ending.
+         * @return Result.
+         */
+        inline bool StringEndsWith(const std::string& str, const std::string& ending)
+        {
+            if (str.length() > ending.length())
+                return str.compare(str.length() - ending.length(), ending.length(), ending) == 0;
+
+            return false;
+        }
+
+        void StripSurroundingWhitespaces(std::string& str)
+        {
+            std::string::size_type newBegin = 0;
+            while (newBegin < str.size() && ::isspace(str[newBegin]))
+                ++newBegin;
+
+            if (newBegin == str.size())
+            {
+                str.clear();
+
+                return;
+            }
+
+            std::string::size_type newEnd = str.size() - 1;
+            while (::isspace(str[newEnd]))
+                --newEnd;
+
+            str.assign(str, newBegin, (newEnd - newBegin) + 1);
+        }
+
+        char* CopyChars(const char* val)
+        {
+            if (val) {
+                size_t len = strlen(val);
+                char* dest = new char[len + 1];
+                strcpy(dest, val);
+                *(dest + len) = 0;
+                return dest;
+            }
+
+            return NULL;
+        }
+
+        void ReleaseChars(char* val)
+        {
+            delete[] val;
+        }
+
+        uint32_t ToBigEndian(uint32_t value)
+        {
+            // The answer is 42
+            static const int num = 42;
+            static const bool isLittleEndian = (*reinterpret_cast<const char*>(&num) == num);
+
+            if (isLittleEndian)
+                return ((value & 0xFF) << 24) | (((value >> 8) & 0xFF) << 16) | (((value >> 16) & 0xFF) << 8) | ((value >> 24) & 0xFF);
+
+            return value;
+        }
+
+        Date 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 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::IgniteTimeLocal(date);
+
+            return CTimeToDate(localTime);
+        }
+
+        Timestamp 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 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::IgniteTimeLocal(date);
+
+            return CTimeToTimestamp(localTime, ns);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0bc6f0c/modules/platforms/cpp/core-test/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/Makefile.am b/modules/platforms/cpp/core-test/Makefile.am
index 4af2850..566a827 100644
--- a/modules/platforms/cpp/core-test/Makefile.am
+++ b/modules/platforms/cpp/core-test/Makefile.am
@@ -54,6 +54,7 @@ ignite_tests_LDFLAGS = \
 ignite_tests_SOURCES = \
     src/reference_test.cpp \
     src/bits_test.cpp \
+	src/binary_identity_resolver_test.cpp \
     src/cache_test.cpp \
     src/cache_query_test.cpp \
     src/continuous_query_test.cpp \
@@ -73,7 +74,8 @@ ignite_tests_SOURCES = \
     src/fixed_size_array_test.cpp \
     src/transactions_test.cpp \
     src/teamcity_messages.cpp \
-    src/teamcity_boost.cpp
+    src/teamcity_boost.cpp \
+	src/test_utils.cpp
 
 run-check: check
 	./ignite-tests -p