You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/01/27 11:39:48 UTC
[15/28] ignite git commit: IGNITE-2442: ODBC projects moved to main
cpp solution.
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-test/src/utility_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/odbc-test/src/utility_test.cpp b/modules/platforms/cpp/odbc/odbc-test/src/utility_test.cpp
deleted file mode 100644
index 6c4d104..0000000
--- a/modules/platforms/cpp/odbc/odbc-test/src/utility_test.cpp
+++ /dev/null
@@ -1,81 +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.
- */
-
-#ifndef _MSC_VER
-# define BOOST_TEST_DYN_LINK
-#endif
-
-#include <boost/test/unit_test.hpp>
-
-#include <ignite/impl/binary/binary_writer_impl.h>
-
-#include <ignite/odbc/utility.h>
-
-using namespace ignite::utility;
-
-BOOST_AUTO_TEST_SUITE(UtilityTestSuite)
-
-BOOST_AUTO_TEST_CASE(TestUtilityRemoveSurroundingSpaces)
-{
- std::string inStr(" \r \n \t some meaningfull data \n\n \t \r ");
- std::string expectedOutStr("some meaningfull data");
-
- std::string realOutStr(RemoveSurroundingSpaces(inStr.begin(), inStr.end()));
-
- BOOST_REQUIRE(expectedOutStr == realOutStr);
-}
-
-BOOST_AUTO_TEST_CASE(TestUtilityCopyStringToBuffer)
-{
- char buffer[1024];
-
- std::string str("Some data. And some more data here.");
-
- CopyStringToBuffer(str, buffer, sizeof(buffer));
-
- BOOST_REQUIRE(!strcmp(buffer, str.c_str()));
-
- CopyStringToBuffer(str, buffer, 11);
-
- BOOST_REQUIRE(!strcmp(buffer, str.substr(0, 10).c_str()));
-}
-
-BOOST_AUTO_TEST_CASE(TestUtilityReadString)
-{
- using namespace ignite::impl::binary;
- using namespace ignite::impl::interop;
-
- std::string inputStr("Hello World!");
- std::string outputStr;
-
- ignite::impl::interop::InteropUnpooledMemory mem(1024);
- InteropOutputStream outStream(&mem);
- BinaryWriterImpl writer(&outStream, 0);
-
- writer.WriteString(inputStr.data(), static_cast<int32_t>(inputStr.size()));
-
- outStream.Synchronize();
-
- InteropInputStream inStream(&mem);
- BinaryReaderImpl reader(&inStream);
-
- ReadString(reader, outputStr);
-
- BOOST_REQUIRE(inputStr == outputStr);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/os/linux/src/system/socket_client.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/os/linux/src/system/socket_client.cpp b/modules/platforms/cpp/odbc/os/linux/src/system/socket_client.cpp
new file mode 100644
index 0000000..a355625
--- /dev/null
+++ b/modules/platforms/cpp/odbc/os/linux/src/system/socket_client.cpp
@@ -0,0 +1,120 @@
+/*
+ * 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 <sys/socket.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <unistd.h>
+
+#include <cstring>
+
+#include <sstream>
+
+#include "ignite/odbc/system/socket_client.h"
+#include "ignite/odbc/utility.h"
+
+#define SOCKET_ERROR (-1)
+
+namespace ignite
+{
+ namespace odbc
+ {
+ namespace tcp
+ {
+
+ SocketClient::SocketClient() : socketHandle(SOCKET_ERROR)
+ {
+ // No-op.
+ }
+
+ SocketClient::~SocketClient()
+ {
+ Close();
+ }
+
+ bool SocketClient::Connect(const char* hostname, uint16_t port)
+ {
+ LOG_MSG("Host: %s, port: %d\n", hostname, port);
+
+ addrinfo hints;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+
+ std::stringstream converter;
+ converter << port;
+
+ // Resolve the server address and port
+ addrinfo *result = NULL;
+ int res = getaddrinfo(hostname, converter.str().c_str(), &hints, &result);
+
+ if (res != 0)
+ return false;
+
+ // Attempt to connect to an address until one succeeds
+ for (addrinfo *it = result; it != NULL; it = it->ai_next)
+ {
+ LOG_MSG("Addr: %u.%u.%u.%u\n", it->ai_addr->sa_data[2], it->ai_addr->sa_data[3],
+ it->ai_addr->sa_data[4], it->ai_addr->sa_data[5]);
+
+ // Create a SOCKET for connecting to server
+ socketHandle = socket(it->ai_family, it->ai_socktype, it->ai_protocol);
+
+ if (socketHandle == SOCKET_ERROR)
+ return false;
+
+ // Connect to server.
+ res = connect(socketHandle, it->ai_addr, (int)it->ai_addrlen);
+ if (res == SOCKET_ERROR)
+ {
+ Close();
+
+ continue;
+ }
+ break;
+ }
+
+ freeaddrinfo(result);
+
+ return socketHandle != SOCKET_ERROR;
+ }
+
+ void SocketClient::Close()
+ {
+ if (socketHandle != SOCKET_ERROR)
+ {
+ close(socketHandle);
+
+ socketHandle = SOCKET_ERROR;
+ }
+ }
+
+ int SocketClient::Send(const int8_t* data, size_t size)
+ {
+ return send(socketHandle, reinterpret_cast<const char*>(data), static_cast<int>(size), 0);
+ }
+
+ int SocketClient::Receive(int8_t* buffer, size_t size)
+ {
+ return recv(socketHandle, reinterpret_cast<char*>(buffer), static_cast<int>(size), 0);
+ }
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/os/win/src/system/socket_client.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/os/win/src/system/socket_client.cpp b/modules/platforms/cpp/odbc/os/win/src/system/socket_client.cpp
new file mode 100644
index 0000000..bc4cdc0
--- /dev/null
+++ b/modules/platforms/cpp/odbc/os/win/src/system/socket_client.cpp
@@ -0,0 +1,133 @@
+/*
+ * 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.
+ */
+
+#define WIN32_LEAN_AND_MEAN
+#define _WINSOCKAPI_
+
+#include <windows.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
+#include <cstring>
+
+#include <sstream>
+
+#include "ignite/odbc/system/socket_client.h"
+#include "ignite/odbc/utility.h"
+
+namespace ignite
+{
+ namespace odbc
+ {
+ namespace tcp
+ {
+
+ SocketClient::SocketClient() : socketHandle(INVALID_SOCKET)
+ {
+ // No-op.
+ }
+
+ SocketClient::~SocketClient()
+ {
+ Close();
+ }
+
+ bool SocketClient::Connect(const char* hostname, uint16_t port)
+ {
+ static bool networkInited = false;
+
+ // Initing networking if is not inited.
+ if (!networkInited)
+ {
+ WSADATA wsaData;
+
+ networkInited = (WSAStartup(MAKEWORD(2, 2), &wsaData) == 0);
+
+ if (!networkInited)
+ return false;
+ }
+
+ addrinfo *result = NULL;
+ addrinfo hints;
+
+ LOG_MSG("Host: %s, port: %d\n", hostname, port);
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+
+ std::stringstream converter;
+ converter << port;
+
+ // Resolve the server address and port
+ int res = getaddrinfo(hostname, converter.str().c_str(), &hints, &result);
+
+ if (res != 0)
+ return false;
+
+ // Attempt to connect to an address until one succeeds
+ for (addrinfo *it = result; it != NULL; it = it->ai_next)
+ {
+ LOG_MSG("Addr: %u.%u.%u.%u\n", it->ai_addr->sa_data[2], it->ai_addr->sa_data[3],
+ it->ai_addr->sa_data[4], it->ai_addr->sa_data[5]);
+
+ // Create a SOCKET for connecting to server
+ socketHandle = socket(it->ai_family, it->ai_socktype, it->ai_protocol);
+
+ if (socketHandle == INVALID_SOCKET)
+ return false;
+
+ // Connect to server.
+ res = connect(socketHandle, it->ai_addr, static_cast<int>(it->ai_addrlen));
+ if (res == SOCKET_ERROR)
+ {
+ Close();
+
+ continue;
+ }
+ break;
+ }
+
+ freeaddrinfo(result);
+
+ return socketHandle != INVALID_SOCKET;
+ }
+
+ void SocketClient::Close()
+ {
+ if (socketHandle != INVALID_SOCKET)
+ {
+ closesocket(socketHandle);
+
+ socketHandle = INVALID_SOCKET;
+ }
+ }
+
+ int SocketClient::Send(const int8_t* data, size_t size)
+ {
+ return send(socketHandle, reinterpret_cast<const char*>(data), static_cast<int>(size), 0);
+ }
+
+ int SocketClient::Receive(int8_t* buffer, size_t size)
+ {
+ return recv(socketHandle, reinterpret_cast<char*>(buffer), static_cast<int>(size), 0);
+ }
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/project/README.TXT
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/project/README.TXT b/modules/platforms/cpp/odbc/project/README.TXT
new file mode 100644
index 0000000..97f4c64
--- /dev/null
+++ b/modules/platforms/cpp/odbc/project/README.TXT
@@ -0,0 +1 @@
+Contains IDE projects artifacts.
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/project/vs/README.TXT
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/project/vs/README.TXT b/modules/platforms/cpp/odbc/project/vs/README.TXT
new file mode 100644
index 0000000..f4fb456
--- /dev/null
+++ b/modules/platforms/cpp/odbc/project/vs/README.TXT
@@ -0,0 +1 @@
+Contains Visual Studio project artifacts.
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/project/vs/module.def
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/project/vs/module.def b/modules/platforms/cpp/odbc/project/vs/module.def
new file mode 100644
index 0000000..9da4b35
--- /dev/null
+++ b/modules/platforms/cpp/odbc/project/vs/module.def
@@ -0,0 +1,69 @@
+
+LIBRARY odbc
+EXPORTS
+ ConfigDSN
+ SQLAllocConnect
+ SQLAllocEnv
+ SQLAllocStmt
+ SQLAllocHandle
+ SQLFreeConnect
+ SQLFreeEnv
+ SQLFreeStmt
+ SQLBindCol
+ SQLCancel
+ SQLConnect
+ SQLDescribeCol
+ SQLDisconnect
+ SQLError
+ SQLExecDirect
+ SQLExecute
+ SQLExtendedFetch
+ SQLFetch
+ SQLGetCursorName
+ SQLNumResultCols
+ SQLPrepare
+ SQLRowCount
+ SQLSetCursorName
+ SQLColumns
+ SQLDriverConnect
+ SQLGetData
+ SQLGetInfo
+ SQLGetTypeInfo
+ SQLParamData
+ SQLPutData
+ SQLStatistics
+ SQLTables
+ SQLBrowseConnect
+ SQLColumnPrivileges
+ SQLDescribeParam
+ SQLForeignKeys
+ SQLMoreResults
+ SQLNativeSql
+ SQLNumParams
+ SQLPrimaryKeys
+ SQLProcedureColumns
+ SQLProcedures
+ SQLSetPos
+ SQLTablePrivileges
+ SQLBindParameter
+ SQLCloseCursor
+ SQLColAttribute
+ SQLCopyDesc
+ SQLEndTran
+ SQLFetchScroll
+ SQLFreeHandle
+ SQLGetConnectAttr
+ SQLGetDescField
+ SQLGetDescRec
+ SQLGetDiagField
+ SQLGetDiagRec
+ SQLGetEnvAttr
+ SQLGetStmtAttr
+ SQLSetConnectAttr
+ SQLSetDescField
+ SQLSetDescRec
+ SQLSetEnvAttr
+ SQLSetStmtAttr
+ SQLBulkOperations
+ SQLSpecialColumns
+
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/project/vs/odbc.sln
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/project/vs/odbc.sln b/modules/platforms/cpp/odbc/project/vs/odbc.sln
deleted file mode 100644
index 89144a3..0000000
--- a/modules/platforms/cpp/odbc/project/vs/odbc.sln
+++ /dev/null
@@ -1,56 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "odbc-driver", "..\..\odbc-driver\project\vs\odbc-driver.vcxproj", "{12F77E12-38FE-42D3-B1DA-7E5979362961}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "odbc-test", "..\..\odbc-test\project\vs\odbc-test.vcxproj", "{309BEA40-495D-463F-98D5-4657F03F6D8F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "..\..\..\common\project\vs\common.vcxproj", "{4F7E4917-4612-4B96-9838-025711ADE391}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "binary", "..\..\..\binary\project\vs\binary.vcxproj", "{4F15669B-92EB-49F0-B774-8F19BAE0B960}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|x64 = Debug|x64
- Debug|Win32 = Debug|Win32
- Release|x64 = Release|x64
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Debug|x64.ActiveCfg = Debug|x64
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Debug|x64.Build.0 = Debug|x64
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Debug|Win32.ActiveCfg = Debug|Win32
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Debug|Win32.Build.0 = Debug|Win32
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Release|x64.ActiveCfg = Release|x64
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Release|x64.Build.0 = Release|x64
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Release|Win32.ActiveCfg = Release|Win32
- {12F77E12-38FE-42D3-B1DA-7E5979362961}.Release|Win32.Build.0 = Release|Win32
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Debug|x64.ActiveCfg = Debug|x64
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Debug|x64.Build.0 = Debug|x64
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Debug|Win32.ActiveCfg = Debug|Win32
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Debug|Win32.Build.0 = Debug|Win32
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Release|x64.ActiveCfg = Release|x64
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Release|x64.Build.0 = Release|x64
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Release|Win32.ActiveCfg = Release|Win32
- {309BEA40-495D-463F-98D5-4657F03F6D8F}.Release|Win32.Build.0 = Release|Win32
- {4F7E4917-4612-4B96-9838-025711ADE391}.Debug|x64.ActiveCfg = Debug|x64
- {4F7E4917-4612-4B96-9838-025711ADE391}.Debug|x64.Build.0 = Debug|x64
- {4F7E4917-4612-4B96-9838-025711ADE391}.Debug|Win32.ActiveCfg = Debug|Win32
- {4F7E4917-4612-4B96-9838-025711ADE391}.Debug|Win32.Build.0 = Debug|Win32
- {4F7E4917-4612-4B96-9838-025711ADE391}.Release|x64.ActiveCfg = Release|x64
- {4F7E4917-4612-4B96-9838-025711ADE391}.Release|x64.Build.0 = Release|x64
- {4F7E4917-4612-4B96-9838-025711ADE391}.Release|Win32.ActiveCfg = Release|Win32
- {4F7E4917-4612-4B96-9838-025711ADE391}.Release|Win32.Build.0 = Release|Win32
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Debug|x64.ActiveCfg = Debug|x64
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Debug|x64.Build.0 = Debug|x64
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Debug|Win32.ActiveCfg = Debug|Win32
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Debug|Win32.Build.0 = Debug|Win32
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Release|x64.ActiveCfg = Release|x64
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Release|x64.Build.0 = Release|x64
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Release|Win32.ActiveCfg = Release|Win32
- {4F15669B-92EB-49F0-B774-8F19BAE0B960}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj b/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj
new file mode 100644
index 0000000..f22b0b1
--- /dev/null
+++ b/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{12F77E12-38FE-42D3-B1DA-7E5979362961}</ProjectGuid>
+ <RootNamespace>odbc</RootNamespace>
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v100</PlatformToolset>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v100</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v100</PlatformToolset>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v100</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="Shared">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <SDLCheck>false</SDLCheck>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\..\common\include;$(ProjectDir)\..\..\..\common\os\win\include;$(ProjectDir)\..\..\src;$(ProjectDir)\..\..\os\win;$(ProjectDir)\..\..\..\binary\include;$(ProjectDir)\..\..\..\binary\os\win\include;$(ProjectDir)\..\..\include</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;IGNITE_FRIEND;ODBC_DEBUG;ODBC_LOG_PATH="D:\\odbc.log";_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+ <AdditionalDependencies>Ws2_32.lib;Mswsock.lib;Advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <SDLCheck>false</SDLCheck>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\..\common\include;$(ProjectDir)\..\..\..\common\os\win\include;$(ProjectDir)\..\..\src;$(ProjectDir)\..\..\os\win;$(ProjectDir)\..\..\..\binary\include;$(ProjectDir)\..\..\..\binary\os\win\include;$(ProjectDir)\..\..\include</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;IGNITE_FRIEND;ODBC_DEBUG;ODBC_LOG_PATH="D:\\odbc.log";_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+ <AdditionalDependencies>Ws2_32.lib;Mswsock.lib;Advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>false</SDLCheck>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\..\common\include;$(ProjectDir)\..\..\..\common\os\win\include;$(ProjectDir)\..\..\src;$(ProjectDir)\..\..\os\win;$(ProjectDir)\..\..\..\binary\include;$(ProjectDir)\..\..\..\binary\os\win\include;$(ProjectDir)\..\..\include</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;IGNITE_FRIEND;ODBC_DEBUG;ODBC_LOG_PATH="D:\\odbc.log";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+ <AdditionalDependencies>Ws2_32.lib;Mswsock.lib;Advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>false</SDLCheck>
+ <AdditionalIncludeDirectories>$(ProjectDir)\..\..\..\common\include;$(ProjectDir)\..\..\..\common\os\win\include;$(ProjectDir)\..\..\src;$(ProjectDir)\..\..\os\win;$(ProjectDir)\..\..\..\binary\include;$(ProjectDir)\..\..\..\binary\os\win\include;$(ProjectDir)\..\..\include</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;IGNITE_IMPL;IGNITE_FRIEND;ODBC_DEBUG;ODBC_LOG_PATH="D:\\odbc.log";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <ModuleDefinitionFile>module.def</ModuleDefinitionFile>
+ <AdditionalDependencies>Ws2_32.lib;Mswsock.lib;Advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\os\win\src\system\socket_client.cpp" />
+ <ClCompile Include="..\..\src\app\application_data_buffer.cpp" />
+ <ClCompile Include="..\..\src\app\parameter.cpp" />
+ <ClCompile Include="..\..\src\column.cpp" />
+ <ClCompile Include="..\..\src\common_types.cpp" />
+ <ClCompile Include="..\..\src\config\configuration.cpp" />
+ <ClCompile Include="..\..\src\config\connection_info.cpp" />
+ <ClCompile Include="..\..\src\connection.cpp" />
+ <ClCompile Include="..\..\src\cursor.cpp" />
+ <ClCompile Include="..\..\src\decimal.cpp" />
+ <ClCompile Include="..\..\src\diagnostic\diagnosable_adapter.cpp" />
+ <ClCompile Include="..\..\src\diagnostic\diagnostic_record.cpp" />
+ <ClCompile Include="..\..\src\diagnostic\diagnostic_record_storage.cpp" />
+ <ClCompile Include="..\..\src\environment.cpp" />
+ <ClCompile Include="..\..\src\meta\column_meta.cpp" />
+ <ClCompile Include="..\..\src\meta\table_meta.cpp" />
+ <ClCompile Include="..\..\src\odbc.cpp" />
+ <ClCompile Include="..\..\src\query\data_query.cpp" />
+ <ClCompile Include="..\..\src\query\column_metadata_query.cpp" />
+ <ClCompile Include="..\..\src\query\foreign_keys_query.cpp" />
+ <ClCompile Include="..\..\src\query\primary_keys_query.cpp" />
+ <ClCompile Include="..\..\src\query\special_columns_query.cpp" />
+ <ClCompile Include="..\..\src\query\table_metadata_query.cpp" />
+ <ClCompile Include="..\..\src\query\type_info_query.cpp" />
+ <ClCompile Include="..\..\src\result_page.cpp" />
+ <ClCompile Include="..\..\src\row.cpp" />
+ <ClCompile Include="..\..\src\statement.cpp" />
+ <ClCompile Include="..\..\src\type_traits.cpp" />
+ <ClCompile Include="..\..\src\utility.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="module.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\include\ignite\odbc\app\application_data_buffer.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\app\parameter.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\column.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\common_types.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\config\configuration.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\config\connection_info.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\connection.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\cursor.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\decimal.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnosable.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnosable_adapter.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnostic_record.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnostic_record_storage.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\environment.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\message.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\meta\column_meta.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\meta\primary_key_meta.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\meta\table_meta.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\parser.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\data_query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\column_metadata_query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\foreign_keys_query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\primary_keys_query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\special_columns_query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\table_metadata_query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\query\type_info_query.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\result_page.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\row.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\statement.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\system\odbc_constants.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\system\socket_client.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\type_traits.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\utility.h" />
+ <ClInclude Include="result_page.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\binary\project\vs\binary.vcxproj">
+ <Project>{4f15669b-92eb-49f0-b774-8f19bae0b960}</Project>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\common\project\vs\common.vcxproj">
+ <Project>{4f7e4917-4612-4b96-9838-025711ade391}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj.filters b/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj.filters
new file mode 100644
index 0000000..d47684a
--- /dev/null
+++ b/modules/platforms/cpp/odbc/project/vs/odbc.vcxproj.filters
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Code">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Misc">
+ <UniqueIdentifier>{3f714d15-6347-46a7-bc59-d87c1aea900c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Code\query">
+ <UniqueIdentifier>{b09a6b2e-c30c-4727-8e85-4b315e757706}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Code\meta">
+ <UniqueIdentifier>{71d6243f-e8c9-4f21-a5a3-3dc89641af28}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Code\config">
+ <UniqueIdentifier>{71117941-fa47-4768-afe8-901c94d431c7}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Code\app">
+ <UniqueIdentifier>{dbe40149-df23-4b89-92e4-16817775cd0e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Code\system">
+ <UniqueIdentifier>{7ab279dc-6586-4b32-aca7-0add0c0ab68a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Code\diagnostic">
+ <UniqueIdentifier>{df33e506-b5d8-423f-bcc5-1825242a3e28}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\src\odbc.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\connection.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\environment.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\statement.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\type_traits.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\common_types.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\utility.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\cursor.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\result_page.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\row.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\query\data_query.cpp">
+ <Filter>Code\query</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\query\column_metadata_query.cpp">
+ <Filter>Code\query</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\query\table_metadata_query.cpp">
+ <Filter>Code\query</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\meta\column_meta.cpp">
+ <Filter>Code\meta</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\meta\table_meta.cpp">
+ <Filter>Code\meta</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\config\configuration.cpp">
+ <Filter>Code\config</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\config\connection_info.cpp">
+ <Filter>Code\config</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\app\application_data_buffer.cpp">
+ <Filter>Code\app</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\app\parameter.cpp">
+ <Filter>Code\app</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\query\foreign_keys_query.cpp">
+ <Filter>Code\query</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\query\primary_keys_query.cpp">
+ <Filter>Code\query</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\diagnostic\diagnostic_record.cpp">
+ <Filter>Code\diagnostic</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\diagnostic\diagnostic_record_storage.cpp">
+ <Filter>Code\diagnostic</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\diagnostic\diagnosable_adapter.cpp">
+ <Filter>Code\diagnostic</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\os\win\src\system\socket_client.cpp">
+ <Filter>Code\system</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\decimal.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\query\type_info_query.cpp">
+ <Filter>Code\query</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\column.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\src\query\special_columns_query.cpp">
+ <Filter>Code\query</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="module.def">
+ <Filter>Misc</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="result_page.h" />
+ <ClInclude Include="..\..\include\ignite\odbc\common_types.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\connection.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\cursor.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\environment.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\message.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\parser.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\result_page.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\row.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\statement.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\type_traits.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\utility.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\data_query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\column_metadata_query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\table_metadata_query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\meta\column_meta.h">
+ <Filter>Code\meta</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\meta\table_meta.h">
+ <Filter>Code\meta</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\config\configuration.h">
+ <Filter>Code\config</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\config\connection_info.h">
+ <Filter>Code\config</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\app\application_data_buffer.h">
+ <Filter>Code\app</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\app\parameter.h">
+ <Filter>Code\app</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\foreign_keys_query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\primary_keys_query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\meta\primary_key_meta.h">
+ <Filter>Code\meta</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnostic_record.h">
+ <Filter>Code\diagnostic</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnostic_record_storage.h">
+ <Filter>Code\diagnostic</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnosable.h">
+ <Filter>Code\diagnostic</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\diagnostic\diagnosable_adapter.h">
+ <Filter>Code\diagnostic</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\system\odbc_constants.h">
+ <Filter>Code\system</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\system\socket_client.h">
+ <Filter>Code\system</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\decimal.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\type_info_query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\column.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\odbc\query\special_columns_query.h">
+ <Filter>Code\query</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/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
new file mode 100644
index 0000000..e10011b
--- /dev/null
+++ b/modules/platforms/cpp/odbc/src/app/application_data_buffer.cpp
@@ -0,0 +1,834 @@
+/*
+ * 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 <algorithm>
+#include <string>
+#include <sstream>
+
+#include "ignite/odbc/system/odbc_constants.h"
+#include "ignite/odbc/app/application_data_buffer.h"
+#include "ignite/odbc/utility.h"
+
+namespace ignite
+{
+ namespace odbc
+ {
+ namespace app
+ {
+ ApplicationDataBuffer::ApplicationDataBuffer() :
+ type(type_traits::IGNITE_ODBC_C_TYPE_UNSUPPORTED), buffer(0), buflen(0), reslen(0), offset(0)
+ {
+ // No-op.
+ }
+
+ ApplicationDataBuffer::ApplicationDataBuffer(type_traits::IgniteSqlType type,
+ void* buffer, SqlLen buflen, SqlLen* reslen, size_t** offset) :
+ type(type), buffer(buffer), buflen(buflen), reslen(reslen), offset(offset)
+ {
+ // No-op.
+ }
+
+ ApplicationDataBuffer::ApplicationDataBuffer(const ApplicationDataBuffer & other) :
+ type(other.type), buffer(other.buffer), buflen(other.buflen), reslen(other.reslen), offset(other.offset)
+ {
+ // No-op.
+ }
+
+ ApplicationDataBuffer::~ApplicationDataBuffer()
+ {
+ // No-op.
+ }
+
+ ApplicationDataBuffer & ApplicationDataBuffer::operator=(const ApplicationDataBuffer & other)
+ {
+ type = other.type;
+ buffer = other.buffer;
+ buflen = other.buflen;
+ reslen = other.reslen;
+ offset = other.offset;
+
+ return *this;
+ }
+
+ template<typename T>
+ void ApplicationDataBuffer::PutNum(T value)
+ {
+ using namespace type_traits;
+ switch (type)
+ {
+ case IGNITE_ODBC_C_TYPE_SIGNED_TINYINT:
+ {
+ PutNumToNumBuffer<signed char>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_BIT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_TINYINT:
+ {
+ PutNumToNumBuffer<unsigned char>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_SHORT:
+ {
+ PutNumToNumBuffer<short>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_SHORT:
+ {
+ PutNumToNumBuffer<unsigned short>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_LONG:
+ {
+ PutNumToNumBuffer<long>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_LONG:
+ {
+ PutNumToNumBuffer<unsigned long>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_BIGINT:
+ {
+ PutNumToNumBuffer<int64_t>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_BIGINT:
+ {
+ PutNumToNumBuffer<uint64_t>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_FLOAT:
+ {
+ PutNumToNumBuffer<float>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_DOUBLE:
+ {
+ PutNumToNumBuffer<double>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_CHAR:
+ {
+ PutValToStrBuffer<char>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_WCHAR:
+ {
+ PutValToStrBuffer<wchar_t>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_NUMERIC:
+ {
+ if (GetData())
+ {
+ SQL_NUMERIC_STRUCT* out =
+ reinterpret_cast<SQL_NUMERIC_STRUCT*>(GetData());
+
+ out->precision = 0;
+ out->scale = 0;
+ out->sign = value > 0 ? 1 : 0;
+
+ memset(out->val, 0, SQL_MAX_NUMERIC_LEN);
+
+ // TODO: implement propper conversation to numeric type.
+ int64_t intVal = static_cast<int64_t>(std::abs(value));
+
+ memcpy(out->val, &intVal, std::min<int>(SQL_MAX_NUMERIC_LEN, sizeof(intVal)));
+ }
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_BINARY:
+ case IGNITE_ODBC_C_TYPE_DEFAULT:
+ {
+ if (GetData())
+ {
+ if (buflen >= sizeof(value))
+ {
+ memcpy(GetData(), &value, sizeof(value));
+
+ if (GetResLen())
+ *GetResLen() = sizeof(value);
+ }
+ else
+ {
+ memcpy(GetData(), &value, static_cast<size_t>(buflen));
+
+ if (GetResLen())
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+ else if (GetResLen())
+ {
+ *GetResLen() = sizeof(value);
+ }
+ break;
+ }
+
+ default:
+ {
+ if (GetResLen())
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+ }
+
+ template<typename Tbuf, typename Tin>
+ void ApplicationDataBuffer::PutNumToNumBuffer(Tin value)
+ {
+ if (GetData())
+ {
+ Tbuf* out = reinterpret_cast<Tbuf*>(GetData());
+ *out = static_cast<Tbuf>(value);
+ }
+ }
+
+ template<typename CharT, typename Tin>
+ void ApplicationDataBuffer::PutValToStrBuffer(const Tin & value)
+ {
+ typedef std::basic_stringstream<CharT> ConverterType;
+
+ ConverterType converter;
+
+ converter << value;
+
+ PutStrToStrBuffer<CharT>(converter.str());
+ }
+
+ template<typename CharT>
+ void ApplicationDataBuffer::PutValToStrBuffer(const int8_t & value)
+ {
+ typedef std::basic_stringstream<CharT> ConverterType;
+
+ ConverterType converter;
+
+ converter << static_cast<int>(value);
+
+ PutStrToStrBuffer<CharT>(converter.str());
+ }
+
+ template<typename OutCharT, typename InCharT>
+ void ApplicationDataBuffer::PutStrToStrBuffer(const std::basic_string<InCharT>& value)
+ {
+ SqlLen charSize = static_cast<SqlLen>(sizeof(OutCharT));
+
+ if (GetData())
+ {
+ if (buflen >= charSize)
+ {
+ OutCharT* out = reinterpret_cast<OutCharT*>(GetData());
+
+ SqlLen outLen = (buflen / charSize) - 1;
+
+ SqlLen toCopy = std::min<size_t>(outLen, value.size());
+
+ for (SqlLen i = 0; i < toCopy; ++i)
+ out[i] = value[i];
+
+ out[toCopy] = 0;
+ }
+
+ if (GetResLen())
+ {
+ if (buflen >= static_cast<SqlLen>((value.size() + 1) * charSize))
+ *GetResLen() = static_cast<SqlLen>(value.size());
+ else
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+ else if (GetResLen())
+ *GetResLen() = value.size();
+ }
+
+ void ApplicationDataBuffer::PutRawDataToBuffer(void *data, size_t len)
+ {
+ SqlLen ilen = static_cast<SqlLen>(len);
+
+ if (GetData())
+ {
+ size_t toCopy = static_cast<size_t>(std::min(buflen, ilen));
+
+ memcpy(GetData(), data, toCopy);
+
+ if (GetResLen())
+ {
+ if (buflen >= ilen)
+ *GetResLen() = ilen;
+ else
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+ else if (GetResLen())
+ *GetResLen() = ilen;
+ }
+
+ void ApplicationDataBuffer::PutInt8(int8_t value)
+ {
+ PutNum(value);
+ }
+
+ void ApplicationDataBuffer::PutInt16(int16_t value)
+ {
+ PutNum(value);
+ }
+
+ void ApplicationDataBuffer::PutInt32(int32_t value)
+ {
+ PutNum(value);
+ }
+
+ void ApplicationDataBuffer::PutInt64(int64_t value)
+ {
+ PutNum(value);
+ }
+
+ void ApplicationDataBuffer::PutFloat(float value)
+ {
+ PutNum(value);
+ }
+
+ void ApplicationDataBuffer::PutDouble(double value)
+ {
+ PutNum(value);
+ }
+
+ int32_t ApplicationDataBuffer::PutString(const std::string & value)
+ {
+ using namespace type_traits;
+
+ int32_t used = 0;
+
+ switch (type)
+ {
+ case IGNITE_ODBC_C_TYPE_SIGNED_TINYINT:
+ case IGNITE_ODBC_C_TYPE_BIT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_TINYINT:
+ case IGNITE_ODBC_C_TYPE_SIGNED_SHORT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_SHORT:
+ case IGNITE_ODBC_C_TYPE_SIGNED_LONG:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_LONG:
+ case IGNITE_ODBC_C_TYPE_SIGNED_BIGINT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_BIGINT:
+ case IGNITE_ODBC_C_TYPE_NUMERIC:
+ {
+ std::stringstream converter(value);
+
+ int64_t numValue;
+
+ converter >> numValue;
+
+ PutNum(numValue);
+
+ used = static_cast<int32_t>(value.size());
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_FLOAT:
+ case IGNITE_ODBC_C_TYPE_DOUBLE:
+ {
+ std::stringstream converter(value);
+
+ double numValue;
+
+ converter >> numValue;
+
+ PutNum(numValue);
+
+ used = static_cast<int32_t>(value.size());
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_CHAR:
+ case IGNITE_ODBC_C_TYPE_BINARY:
+ case IGNITE_ODBC_C_TYPE_DEFAULT:
+ {
+ PutStrToStrBuffer<char>(value);
+
+ used = static_cast<int32_t>(GetSize()) - 1;
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_WCHAR:
+ {
+ PutStrToStrBuffer<wchar_t>(value);
+
+ used = (static_cast<int32_t>(GetSize()) / 2) - 1;
+
+ break;
+ }
+
+ default:
+ {
+ if (GetResLen())
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+
+ return used < 0 ? 0 : used;
+ }
+
+ void ApplicationDataBuffer::PutGuid(const Guid & value)
+ {
+ using namespace type_traits;
+
+ switch (type)
+ {
+ case IGNITE_ODBC_C_TYPE_CHAR:
+ case IGNITE_ODBC_C_TYPE_BINARY:
+ case IGNITE_ODBC_C_TYPE_DEFAULT:
+ {
+ PutValToStrBuffer<char>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_WCHAR:
+ {
+ PutValToStrBuffer<wchar_t>(value);
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_GUID:
+ {
+ SQLGUID* guid = reinterpret_cast<SQLGUID*>(GetData());
+
+ guid->Data1 = static_cast<uint32_t>(value.GetMostSignificantBits() >> 32);
+ guid->Data2 = static_cast<uint16_t>(value.GetMostSignificantBits() >> 16);
+ guid->Data3 = static_cast<uint16_t>(value.GetMostSignificantBits());
+
+ uint64_t lsb = value.GetLeastSignificantBits();
+ for (size_t i = 0; i < sizeof(guid->Data4); ++i)
+ guid->Data4[i] = (lsb >> (sizeof(guid->Data4) - i - 1) * 8) & 0xFF;
+
+ break;
+ }
+
+ default:
+ {
+ if (GetResLen())
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+ }
+
+ int32_t ApplicationDataBuffer::PutBinaryData(void *data, size_t len)
+ {
+ using namespace type_traits;
+
+ int32_t used = 0;
+
+ switch (type)
+ {
+ case IGNITE_ODBC_C_TYPE_BINARY:
+ case IGNITE_ODBC_C_TYPE_DEFAULT:
+ {
+ PutRawDataToBuffer(data, len);
+
+ used = static_cast<int32_t>(GetSize());
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_CHAR:
+ {
+ std::stringstream converter;
+
+ uint8_t *dataBytes = reinterpret_cast<uint8_t*>(data);
+
+ for (size_t i = 0; i < len; ++i)
+ {
+ converter << std::hex
+ << std::setfill('0')
+ << std::setw(2)
+ << static_cast<unsigned>(dataBytes[i]);
+ }
+
+ PutStrToStrBuffer<char>(converter.str());
+
+ used = static_cast<int32_t>(GetSize()) - 1;
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_WCHAR:
+ {
+ std::wstringstream converter;
+
+ uint8_t *dataBytes = reinterpret_cast<uint8_t*>(data);
+
+ for (size_t i = 0; i < len; ++i)
+ {
+ converter << std::hex
+ << std::setfill<wchar_t>('0')
+ << std::setw(2)
+ << static_cast<unsigned>(dataBytes[i]);
+ }
+
+ PutStrToStrBuffer<wchar_t>(converter.str());
+
+ used = static_cast<int32_t>(GetSize() / 2) - 1;
+
+ break;
+ }
+
+ default:
+ {
+ if (GetResLen())
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+
+ return used < 0 ? 0 : used;
+ }
+
+ void ApplicationDataBuffer::PutNull()
+ {
+ if (GetResLen())
+ *GetResLen() = SQL_NULL_DATA;
+ }
+
+ void ApplicationDataBuffer::PutDecimal(const Decimal& value)
+ {
+ using namespace type_traits;
+ switch (type)
+ {
+ case IGNITE_ODBC_C_TYPE_SIGNED_TINYINT:
+ case IGNITE_ODBC_C_TYPE_BIT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_TINYINT:
+ case IGNITE_ODBC_C_TYPE_SIGNED_SHORT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_SHORT:
+ case IGNITE_ODBC_C_TYPE_SIGNED_LONG:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_LONG:
+ case IGNITE_ODBC_C_TYPE_SIGNED_BIGINT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_BIGINT:
+ case IGNITE_ODBC_C_TYPE_FLOAT:
+ case IGNITE_ODBC_C_TYPE_DOUBLE:
+ case IGNITE_ODBC_C_TYPE_CHAR:
+ case IGNITE_ODBC_C_TYPE_WCHAR:
+ {
+ PutNum<double>(static_cast<double>(value));
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_NUMERIC:
+ {
+ if (GetData())
+ {
+ SQL_NUMERIC_STRUCT* numeric =
+ reinterpret_cast<SQL_NUMERIC_STRUCT*>(GetData());
+
+ numeric->sign = value.IsNegative() ? 1 : 0;
+ numeric->precision = 0;
+ numeric->scale = value.GetScale();
+ memcpy(numeric->val, value.GetMagnitude(), std::min<size_t>(SQL_MAX_NUMERIC_LEN, value.GetLength()));
+ }
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_DEFAULT:
+ {
+ if (GetData())
+ memcpy(GetData(), &value, std::min(static_cast<size_t>(buflen), sizeof(value)));
+
+ if (GetResLen())
+ *GetResLen() = sizeof(value);
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_BINARY:
+ default:
+ {
+ if (GetResLen())
+ *GetResLen() = SQL_NO_TOTAL;
+ }
+ }
+ }
+
+ std::string ApplicationDataBuffer::GetString(size_t maxLen) const
+ {
+ using namespace type_traits;
+ std::string res;
+
+ switch (type)
+ {
+ case IGNITE_ODBC_C_TYPE_CHAR:
+ {
+ res.assign(reinterpret_cast<const char*>(GetData()),
+ std::min(maxLen, static_cast<size_t>(buflen)));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_TINYINT:
+ case IGNITE_ODBC_C_TYPE_SIGNED_SHORT:
+ case IGNITE_ODBC_C_TYPE_SIGNED_LONG:
+ case IGNITE_ODBC_C_TYPE_SIGNED_BIGINT:
+ {
+ std::stringstream converter;
+
+ converter << GetNum<int64_t>();
+
+ res = converter.str();
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_BIT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_TINYINT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_SHORT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_LONG:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_BIGINT:
+ {
+ std::stringstream converter;
+
+ converter << GetNum<uint64_t>();
+
+ res = converter.str();
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_FLOAT:
+ {
+ std::stringstream converter;
+
+ converter << GetNum<float>();
+
+ res = converter.str();
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_NUMERIC:
+ case IGNITE_ODBC_C_TYPE_DOUBLE:
+ {
+ std::stringstream converter;
+
+ converter << GetNum<double>();
+
+ res = converter.str();
+
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return res;
+ }
+
+ int8_t ApplicationDataBuffer::GetInt8() const
+ {
+ return GetNum<int8_t>();
+ }
+
+ int16_t ApplicationDataBuffer::GetInt16() const
+ {
+ return GetNum<int16_t>();
+ }
+
+ int32_t ApplicationDataBuffer::GetInt32() const
+ {
+ return GetNum<int32_t>();
+ }
+
+ int64_t ApplicationDataBuffer::GetInt64() const
+ {
+ return GetNum<int64_t>();
+ }
+
+ float ApplicationDataBuffer::GetFloat() const
+ {
+ return GetNum<float>();
+ }
+
+ double ApplicationDataBuffer::GetDouble() const
+ {
+ return GetNum<double>();
+ }
+
+ const void* ApplicationDataBuffer::GetData() const
+ {
+ return ApplyOffset(buffer);
+ }
+
+ const SqlLen* ApplicationDataBuffer::GetResLen() const
+ {
+ return ApplyOffset(reslen);
+ }
+
+ void* ApplicationDataBuffer::GetData()
+ {
+ return ApplyOffset(buffer);
+ }
+
+ SqlLen* ApplicationDataBuffer::GetResLen()
+ {
+ return ApplyOffset(reslen);
+ }
+
+ template<typename T>
+ T ApplicationDataBuffer::GetNum() const
+ {
+ using namespace type_traits;
+
+ T res = 0;
+
+ switch (type)
+ {
+ case IGNITE_ODBC_C_TYPE_CHAR:
+ {
+ std::string str = GetString(static_cast<size_t>(buflen));
+
+ std::stringstream converter(str);
+
+ // Workaround for char types which are recognised as
+ // symbolyc types and not numeric types.
+ if (sizeof(T) == 1)
+ {
+ short tmp;
+
+ converter >> tmp;
+
+ res = static_cast<T>(tmp);
+ }
+ else
+ converter >> res;
+
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_TINYINT:
+ {
+ res = static_cast<T>(*reinterpret_cast<const signed char*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_BIT:
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_TINYINT:
+ {
+ res = static_cast<T>(*reinterpret_cast<const unsigned char*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_SHORT:
+ {
+ res = static_cast<T>(*reinterpret_cast<const signed short*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_SHORT:
+ {
+ res = static_cast<T>(*reinterpret_cast<const unsigned short*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_LONG:
+ {
+ res = static_cast<T>(*reinterpret_cast<const signed long*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_LONG:
+ {
+ res = static_cast<T>(*reinterpret_cast<const unsigned long*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_SIGNED_BIGINT:
+ {
+ res = static_cast<T>(*reinterpret_cast<const int64_t*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_UNSIGNED_BIGINT:
+ {
+ res = static_cast<T>(*reinterpret_cast<const uint64_t*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_FLOAT:
+ {
+ res = static_cast<T>(*reinterpret_cast<const float*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_DOUBLE:
+ {
+ res = static_cast<T>(*reinterpret_cast<const double*>(GetData()));
+ break;
+ }
+
+ case IGNITE_ODBC_C_TYPE_NUMERIC:
+ {
+ const SQL_NUMERIC_STRUCT* numeric =
+ reinterpret_cast<const SQL_NUMERIC_STRUCT*>(GetData());
+
+ int64_t resInt;
+
+ // TODO: implement propper conversation from numeric type.
+ memcpy(&resInt, numeric->val, std::min<int>(SQL_MAX_NUMERIC_LEN, sizeof(resInt)));
+
+ if (numeric->sign)
+ resInt *= -1;
+
+ double resDouble = static_cast<double>(resInt);
+
+ for (SQLSCHAR scale = numeric->scale; scale > 0; --scale)
+ resDouble /= 10.0;
+
+ res = static_cast<T>(resDouble);
+
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return res;
+ }
+
+ template<typename T>
+ T* ApplicationDataBuffer::ApplyOffset(T* ptr) const
+ {
+ if (!ptr || !offset || !*offset)
+ return ptr;
+
+ return utility::GetPointerWithOffset(ptr, **offset);
+ }
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/src/app/parameter.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/src/app/parameter.cpp b/modules/platforms/cpp/odbc/src/app/parameter.cpp
new file mode 100644
index 0000000..dbe33e1
--- /dev/null
+++ b/modules/platforms/cpp/odbc/src/app/parameter.cpp
@@ -0,0 +1,147 @@
+/*
+ * 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 <algorithm>
+#include <string>
+#include <sstream>
+
+#include "ignite/odbc/system/odbc_constants.h"
+#include "ignite/odbc/app/parameter.h"
+#include "ignite/odbc/utility.h"
+
+namespace ignite
+{
+ namespace odbc
+ {
+ namespace app
+ {
+ Parameter::Parameter() :
+ buffer(),
+ sqlType(),
+ columnSize(),
+ decDigits()
+ {
+ // No-op.
+ }
+
+ Parameter::Parameter(const ApplicationDataBuffer& buffer, int16_t sqlType,
+ size_t columnSize, int16_t decDigits) :
+ buffer(buffer),
+ sqlType(sqlType),
+ columnSize(columnSize),
+ decDigits(decDigits)
+ {
+ // No-op.
+ }
+
+ Parameter::Parameter(const Parameter & other) :
+ buffer(other.buffer),
+ sqlType(other.sqlType),
+ columnSize(other.columnSize),
+ decDigits(other.decDigits)
+ {
+ // No-op.
+ }
+
+ Parameter::~Parameter()
+ {
+ // No-op.
+ }
+
+ Parameter& Parameter::operator=(const Parameter &other)
+ {
+ buffer = other.buffer;
+ sqlType = other.sqlType;
+ columnSize = other.columnSize;
+ decDigits = other.decDigits;
+
+ return *this;
+ }
+
+ void Parameter::Write(ignite::impl::binary::BinaryWriterImpl& writer) const
+ {
+ switch (sqlType)
+ {
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+ {
+ utility::WriteString(writer, buffer.GetString(columnSize));
+ break;
+ }
+
+ case SQL_SMALLINT:
+ {
+ writer.WriteInt16(buffer.GetInt16());
+ break;
+ }
+
+ case SQL_INTEGER:
+ {
+ writer.WriteInt32(buffer.GetInt32());
+ break;
+ }
+
+ case SQL_FLOAT:
+ {
+ writer.WriteFloat(buffer.GetFloat());
+ break;
+ }
+
+ case SQL_DOUBLE:
+ {
+ writer.WriteDouble(buffer.GetDouble());
+ break;
+ }
+
+ case SQL_TINYINT:
+ case SQL_BIT:
+ {
+ writer.WriteBool(buffer.GetInt8() != 0);
+ break;
+ }
+
+ case SQL_BIGINT:
+ {
+ writer.WriteInt64(buffer.GetInt64());
+ break;
+ }
+
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ {
+ writer.WriteInt8Array(reinterpret_cast<const int8_t*>(buffer.GetData()),
+ static_cast<int32_t>(buffer.GetSize()));
+ break;
+ }
+
+ case SQL_GUID:
+ default:
+ //TODO: Add GUID type support.
+ break;
+ }
+ }
+
+ ApplicationDataBuffer & Parameter::GetBuffer()
+ {
+ return buffer;
+ }
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/src/column.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/src/column.cpp b/modules/platforms/cpp/odbc/src/column.cpp
new file mode 100644
index 0000000..7b2f1e9
--- /dev/null
+++ b/modules/platforms/cpp/odbc/src/column.cpp
@@ -0,0 +1,454 @@
+/*
+ * 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/impl/interop/interop_stream_position_guard.h>
+
+#include "ignite/odbc/utility.h"
+#include "ignite/odbc/column.h"
+
+namespace
+{
+ using namespace ignite::impl::interop;
+ using namespace ignite::impl::binary;
+
+ bool GetObjectLength(InteropInputStream& stream, int32_t& len)
+ {
+ InteropStreamPositionGuard<InteropInputStream> guard(stream);
+
+ int8_t hdr = stream.ReadInt8();
+
+ if (hdr != IGNITE_HDR_FULL)
+ return false;
+
+ int8_t protoVer = stream.ReadInt8();
+
+ if (protoVer != IGNITE_PROTO_VER)
+ return false;
+
+ // Skipping flags
+ stream.ReadInt16();
+
+ // Skipping typeId
+ stream.ReadInt32();
+
+ // Skipping hash code
+ stream.ReadInt32();
+
+ len = stream.ReadInt32();
+
+ return true;
+ }
+
+ /**
+ * Read column header and restores position if the column is of
+ * complex type.
+ * @return Column type header.
+ */
+ int8_t ReadColumnHeader(ignite::impl::interop::InteropInputStream& stream)
+ {
+ using namespace ignite::impl::binary;
+
+ int32_t headerPos = stream.Position();
+
+ int8_t hdr = stream.ReadInt8();
+
+ // Check if we need to restore position - to read complex types
+ // stream should have unread header, but for primitive types it
+ // should not.
+ switch (hdr)
+ {
+ case IGNITE_TYPE_BYTE:
+ case IGNITE_TYPE_SHORT:
+ case IGNITE_TYPE_CHAR:
+ case IGNITE_TYPE_INT:
+ case IGNITE_TYPE_LONG:
+ case IGNITE_TYPE_FLOAT:
+ case IGNITE_TYPE_DOUBLE:
+ case IGNITE_TYPE_BOOL:
+ case IGNITE_HDR_NULL:
+ {
+ // No-op.
+ break;
+ }
+
+ default:
+ {
+ // Restoring position.
+ stream.Position(headerPos);
+ break;
+ }
+ }
+
+ return hdr;
+ }
+}
+
+namespace ignite
+{
+ namespace odbc
+ {
+ Column::Column() :
+ type(0), startPos(-1), endPos(-1), offset(0), size(0)
+ {
+ // No-op.
+ }
+
+ Column::Column(const Column& other) :
+ type(other.type), startPos(other.startPos), endPos(other.endPos),
+ offset(other.offset), size(other.size)
+ {
+ // No-op.
+ }
+
+ Column& Column::operator=(const Column& other)
+ {
+ type = other.type;
+ startPos = other.startPos;
+ endPos = other.endPos;
+ offset = other.offset;
+ size = other.size;
+
+ return *this;
+ }
+
+ Column::~Column()
+ {
+ // No-op.
+ }
+
+ Column::Column(ignite::impl::binary::BinaryReaderImpl& reader) :
+ type(0), startPos(-1), endPos(-1), offset(0), size(0)
+ {
+ ignite::impl::interop::InteropInputStream* stream = reader.GetStream();
+
+ if (!stream)
+ return;
+
+ InteropStreamPositionGuard<InteropInputStream> guard(*stream);
+
+ int32_t sizeTmp = 0;
+
+ int8_t hdr = ReadColumnHeader(*stream);
+
+ int32_t startPosTmp = stream->Position();
+
+ switch (hdr)
+ {
+ case IGNITE_HDR_NULL:
+ {
+ sizeTmp = 1;
+
+ break;
+ }
+
+ case IGNITE_TYPE_BYTE:
+ {
+ reader.ReadInt8();
+
+ sizeTmp = 1;
+
+ break;
+ }
+
+ case IGNITE_TYPE_BOOL:
+ {
+ reader.ReadBool();
+
+ sizeTmp = 1;
+
+ break;
+ }
+
+ case IGNITE_TYPE_SHORT:
+ case IGNITE_TYPE_CHAR:
+ {
+ reader.ReadInt16();
+
+ sizeTmp = 2;
+
+ break;
+ }
+
+ case IGNITE_TYPE_FLOAT:
+ {
+ reader.ReadFloat();
+
+ sizeTmp = 4;
+
+ break;
+ }
+
+ case IGNITE_TYPE_INT:
+ {
+ reader.ReadInt32();
+
+ sizeTmp = 4;
+
+ break;
+ }
+
+ case IGNITE_TYPE_DOUBLE:
+ {
+ reader.ReadDouble();
+
+ sizeTmp = 8;
+
+ break;
+ }
+
+ case IGNITE_TYPE_LONG:
+ {
+ reader.ReadInt64();
+
+ sizeTmp = 8;
+
+ break;
+ }
+
+ case IGNITE_TYPE_STRING:
+ {
+ std::string str;
+ utility::ReadString(reader, str);
+
+ sizeTmp = static_cast<int32_t>(str.size());
+
+ break;
+ }
+
+ case IGNITE_TYPE_UUID:
+ {
+ reader.ReadGuid();
+
+ sizeTmp = 16;
+
+ break;
+ }
+
+ case IGNITE_HDR_FULL:
+ {
+ int32_t len;
+
+ if (!GetObjectLength(*stream, len))
+ return;
+
+ sizeTmp = len;
+
+ stream->Position(stream->Position() + len);
+
+ break;
+ }
+
+ case IGNITE_TYPE_DECIMAL:
+ {
+ Decimal res;
+
+ utility::ReadDecimal(reader, res);
+
+ sizeTmp = res.GetLength() + 8;
+
+ break;
+ }
+
+ case IGNITE_TYPE_DATE:
+ default:
+ {
+ // This is a fail case.
+ return;
+ }
+ }
+
+ type = hdr;
+ startPos = startPosTmp;
+ endPos = stream->Position();
+ size = sizeTmp;
+ }
+
+ SqlResult Column::ReadToBuffer(ignite::impl::binary::BinaryReaderImpl& reader,
+ app::ApplicationDataBuffer& dataBuf)
+ {
+ using namespace ignite::impl::binary;
+ using namespace ignite::impl::interop;
+
+ if (!IsValid())
+ return SQL_RESULT_ERROR;
+
+ if (GetUnreadDataLength() == 0)
+ {
+ dataBuf.PutNull();
+
+ return SQL_RESULT_NO_DATA;
+ }
+
+ ignite::impl::interop::InteropInputStream* stream = reader.GetStream();
+
+ if (!stream)
+ return SQL_RESULT_ERROR;
+
+ InteropStreamPositionGuard<InteropInputStream> guard(*stream);
+
+ stream->Position(startPos);
+
+ switch (type)
+ {
+ case IGNITE_TYPE_BYTE:
+ {
+ dataBuf.PutInt8(reader.ReadInt8());
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_SHORT:
+ case IGNITE_TYPE_CHAR:
+ {
+ dataBuf.PutInt16(reader.ReadInt16());
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_INT:
+ {
+ dataBuf.PutInt32(reader.ReadInt32());
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_LONG:
+ {
+ dataBuf.PutInt64(reader.ReadInt64());
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_FLOAT:
+ {
+ dataBuf.PutFloat(reader.ReadFloat());
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_DOUBLE:
+ {
+ dataBuf.PutDouble(reader.ReadDouble());
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_BOOL:
+ {
+ dataBuf.PutInt8(reader.ReadBool() ? 1 : 0);
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_STRING:
+ {
+ std::string str;
+ utility::ReadString(reader, str);
+
+ int32_t written = dataBuf.PutString(str.substr(offset));
+
+ IncreaseOffset(written);
+
+ break;
+ }
+
+ case IGNITE_TYPE_UUID:
+ {
+ Guid guid = reader.ReadGuid();
+
+ dataBuf.PutGuid(guid);
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_HDR_NULL:
+ {
+ dataBuf.PutNull();
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_HDR_FULL:
+ {
+ int32_t len;
+
+ if (!GetObjectLength(*stream, len))
+ return SQL_RESULT_ERROR;
+
+ std::vector<int8_t> data(len);
+
+ stream->ReadInt8Array(&data[0], static_cast<int32_t>(data.size()));
+
+ int32_t written = dataBuf.PutBinaryData(data.data() + offset, static_cast<size_t>(len - offset));
+
+ IncreaseOffset(written);
+
+ break;
+ }
+
+ case IGNITE_TYPE_DECIMAL:
+ {
+ Decimal res;
+
+ utility::ReadDecimal(reader, res);
+
+ dataBuf.PutDecimal(res);
+
+ IncreaseOffset(size);
+
+ break;
+ }
+
+ case IGNITE_TYPE_DATE:
+ default:
+ {
+ // This is a fail case. Return false.
+ return SQL_RESULT_ERROR;
+ }
+ }
+
+ return SQL_RESULT_SUCCESS;
+ }
+
+ void Column::IncreaseOffset(int32_t value)
+ {
+ offset += value;
+
+ if (offset > size)
+ offset = size;
+ }
+ }
+}
+