http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/app/parameter.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/app/parameter.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/app/parameter.cpp deleted file mode 100644 index dbe33e1..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/app/parameter.cpp +++ /dev/null @@ -1,147 +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 <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/odbc-driver/src/column.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/column.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/column.cpp deleted file mode 100644 index 7b2f1e9..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/column.cpp +++ /dev/null @@ -1,454 +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 <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; - } - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/common_types.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/common_types.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/common_types.cpp deleted file mode 100644 index 276d9fd..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/common_types.cpp +++ /dev/null @@ -1,120 +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 <ignite/impl/binary/binary_common.h> - -#include "ignite/odbc/system/odbc_constants.h" -#include "ignite/odbc/common_types.h" - -namespace ignite -{ - namespace odbc - { - int SqlResultToReturnCode(SqlResult result) - { - switch (result) - { - case SQL_RESULT_SUCCESS: - return SQL_SUCCESS; - - case SQL_RESULT_SUCCESS_WITH_INFO: - return SQL_SUCCESS_WITH_INFO; - - case SQL_RESULT_NO_DATA: - return SQL_NO_DATA; - - case SQL_RESULT_ERROR: - default: - return SQL_ERROR; - } - } - - DiagnosticField DiagnosticFieldToInternal(int16_t field) - { - switch (field) - { - case SQL_DIAG_CURSOR_ROW_COUNT: - return IGNITE_SQL_DIAG_HEADER_CURSOR_ROW_COUNT; - - case SQL_DIAG_DYNAMIC_FUNCTION: - return IGNITE_SQL_DIAG_HEADER_DYNAMIC_FUNCTION; - - case SQL_DIAG_DYNAMIC_FUNCTION_CODE: - return IGNITE_SQL_DIAG_HEADER_DYNAMIC_FUNCTION_CODE; - - case SQL_DIAG_NUMBER: - return IGNITE_SQL_DIAG_HEADER_NUMBER; - - case SQL_DIAG_RETURNCODE: - return IGNITE_SQL_DIAG_HEADER_RETURNCODE; - - case SQL_DIAG_ROW_COUNT: - return IGNITE_SQL_DIAG_HEADER_ROW_COUNT; - - case SQL_DIAG_CLASS_ORIGIN: - return IGNITE_SQL_DIAG_STATUS_CLASS_ORIGIN; - - case SQL_DIAG_COLUMN_NUMBER: - return IGNITE_SQL_DIAG_STATUS_COLUMN_NUMBER; - - case SQL_DIAG_CONNECTION_NAME: - return IGNITE_SQL_DIAG_STATUS_CONNECTION_NAME; - - case SQL_DIAG_MESSAGE_TEXT: - return IGNITE_SQL_DIAG_STATUS_MESSAGE_TEXT; - - case SQL_DIAG_NATIVE: - return IGNITE_SQL_DIAG_STATUS_NATIVE; - - case SQL_DIAG_ROW_NUMBER: - return IGNITE_SQL_DIAG_STATUS_ROW_NUMBER; - - case SQL_DIAG_SERVER_NAME: - return IGNITE_SQL_DIAG_STATUS_SERVER_NAME; - - case SQL_DIAG_SQLSTATE: - return IGNITE_SQL_DIAG_STATUS_SQLSTATE; - - case SQL_DIAG_SUBCLASS_ORIGIN: - return IGNITE_SQL_DIAG_STATUS_SUBCLASS_ORIGIN; - - default: - break; - } - - return IGNITE_SQL_DIAG_UNKNOWN; - } - - EnvironmentAttribute EnvironmentAttributeToInternal(int32_t attr) - { - switch (attr) - { - case SQL_ATTR_ODBC_VERSION: - return IGNITE_SQL_ENV_ATTR_ODBC_VERSION; - - case SQL_ATTR_OUTPUT_NTS: - return IGNITE_SQL_ENV_ATTR_OUTPUT_NTS; - - default: - break; - } - - return IGNITE_SQL_ENV_ATTR_UNKNOWN; - } - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/config/configuration.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/config/configuration.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/config/configuration.cpp deleted file mode 100644 index 08ee54b..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/config/configuration.cpp +++ /dev/null @@ -1,245 +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 <cstring> - -#include <string> -#include <sstream> -#include <algorithm> -#include <iterator> - -#include "ignite/odbc/utility.h" -#include "ignite/odbc/config/configuration.h" - -namespace ignite -{ - namespace odbc - { - namespace config - { - /** Default values for configuration. */ - namespace dflt - { - /** Default value for DSN attribute. */ - const std::string dsn = "Default Apache Ignite DSN"; - - /** Default value for Driver attribute. */ - const std::string driver = "Apache Ignite"; - - /** Default value for host attribute. */ - const std::string host = "localhost"; - - /** Default value for port attribute. */ - const uint16_t port = 11443; - - /** Default value for cache attribute. */ - const std::string cache = "Persons"; - } - - /** Connection attribute keywords. */ - namespace attrkey - { - /** Connection attribute keyword for DSN attribute. */ - const std::string dsn = "dsn"; - - /** Connection attribute keyword for Driver attribute. */ - const std::string driver = "driver"; - - /** Connection attribute keyword for server host attribute. */ - const std::string host = "server"; - - /** Connection attribute keyword for server port attribute. */ - const std::string port = "port"; - - /** Default value for cache attribute. */ - const std::string cache = "cache"; - } - - Configuration::Configuration() : - dsn(dflt::dsn), driver(dflt::driver), - host(dflt::host), port(dflt::port), - cache(dflt::cache) - { - // No-op. - } - - Configuration::~Configuration() - { - // No-op. - } - - void Configuration::FillFromConnectString(const char* str, size_t len) - { - ArgumentMap connect_attributes; - - ParseAttributeList(str, len, ';', connect_attributes); - - ArgumentMap::const_iterator it; - - it = connect_attributes.find(attrkey::dsn); - if (it != connect_attributes.end()) - dsn = it->second; - else - dsn.clear(); - - it = connect_attributes.find(attrkey::driver); - if (it != connect_attributes.end()) - driver = it->second; - else - driver = dflt::driver; - - it = connect_attributes.find(attrkey::host); - if (it != connect_attributes.end()) - host = it->second; - else - host = dflt::host; - - it = connect_attributes.find(attrkey::port); - if (it != connect_attributes.end()) - port = atoi(it->second.c_str()); - else - port = dflt::port; - - it = connect_attributes.find(attrkey::cache); - if (it != connect_attributes.end()) - cache = it->second; - else - cache = dflt::cache; - } - - void Configuration::FillFromConnectString(const std::string& str) - { - FillFromConnectString(str.data(), str.size()); - } - - std::string Configuration::ToConnectString() const - { - std::stringstream connect_string_buffer; - - if (!driver.empty()) - connect_string_buffer << attrkey::driver << "={" << driver << "};"; - - if (!host.empty()) - connect_string_buffer << attrkey::host << '=' << host << ';'; - - if (port) - connect_string_buffer << attrkey::port << '=' << port << ';'; - - if (!dsn.empty()) - connect_string_buffer << attrkey::dsn << '=' << dsn << ';'; - - if (!cache.empty()) - connect_string_buffer << attrkey::cache << '=' << cache << ';'; - - return connect_string_buffer.str(); - } - - void Configuration::FillFromConfigAttributes(const char * attributes) - { - ArgumentMap config_attributes; - - size_t len = 0; - - // Getting list length. List is terminated by two '\0'. - while (attributes[len] || attributes[len + 1]) - ++len; - - ++len; - - ParseAttributeList(attributes, len, '\0', config_attributes); - - ArgumentMap::const_iterator it; - - it = config_attributes.find(attrkey::dsn); - if (it != config_attributes.end()) - dsn = it->second; - else - dsn = dflt::dsn; - - it = config_attributes.find(attrkey::driver); - if (it != config_attributes.end()) - driver = it->second; - else - driver.clear(); - - it = config_attributes.find(attrkey::host); - if (it != config_attributes.end()) - host = it->second; - else - host.clear(); - - it = config_attributes.find(attrkey::port); - if (it != config_attributes.end()) - port = atoi(it->second.c_str()); - else - port = 0; - - it = config_attributes.find(attrkey::cache); - if (it != config_attributes.end()) - cache = it->second; - else - cache.clear(); - } - - void Configuration::ParseAttributeList(const char * str, size_t len, char delimeter, ArgumentMap & args) const - { - std::string connect_str(str, len); - args.clear(); - - while (!connect_str.empty()) - { - size_t attr_begin = connect_str.rfind(delimeter); - - if (attr_begin == std::string::npos) - attr_begin = 0; - else - ++attr_begin; - - size_t attr_eq_pos = connect_str.rfind('='); - - if (attr_eq_pos == std::string::npos) - attr_eq_pos = 0; - - if (attr_begin < attr_eq_pos) - { - const char* key_begin = connect_str.data() + attr_begin; - const char* key_end = connect_str.data() + attr_eq_pos; - - const char* value_begin = connect_str.data() + attr_eq_pos + 1; - const char* value_end = connect_str.data() + connect_str.size(); - - std::string key = utility::RemoveSurroundingSpaces(key_begin, key_end); - std::string value = utility::RemoveSurroundingSpaces(value_begin, value_end); - - utility::IntoLower(key); - - if (value.front() == '{' && value.back() == '}') - value = value.substr(1, value.size() - 2); - - args[key] = value; - } - - if (!attr_begin) - break; - - connect_str.erase(attr_begin - 1); - } - } - } - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/config/connection_info.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/config/connection_info.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/config/connection_info.cpp deleted file mode 100644 index 0e8e748..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/config/connection_info.cpp +++ /dev/null @@ -1,419 +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 <cstring> -#include <algorithm> - -#include "ignite/odbc/system/odbc_constants.h" -#include "ignite/odbc/utility.h" -#include "ignite/odbc/config/connection_info.h" - - // Temporary workaround. -#ifndef SQL_ASYNC_NOTIFICATION -#define SQL_ASYNC_NOTIFICATION 10025 -#endif - -#ifndef SQL_ASYNC_NOTIFICATION_NOT_CAPABLE -#define SQL_ASYNC_NOTIFICATION_NOT_CAPABLE 0x00000000L -#endif - -#ifndef SQL_ASYNC_NOTIFICATION_CAPABLE -#define SQL_ASYNC_NOTIFICATION_CAPABLE 0x00000001L -#endif - -namespace ignite -{ - namespace odbc - { - namespace config - { - -#ifdef ODBC_DEBUG - -#define DBG_STR_CASE(x) case x: return #x - - const char * ConnectionInfo::InfoTypeToString(InfoType type) - { - switch (type) - { - DBG_STR_CASE(SQL_DRIVER_NAME); - DBG_STR_CASE(SQL_DBMS_NAME); - DBG_STR_CASE(SQL_DRIVER_ODBC_VER); - DBG_STR_CASE(SQL_DBMS_VER); - DBG_STR_CASE(SQL_DRIVER_VER); - DBG_STR_CASE(SQL_COLUMN_ALIAS); - DBG_STR_CASE(SQL_IDENTIFIER_QUOTE_CHAR); - DBG_STR_CASE(SQL_CATALOG_NAME_SEPARATOR); - DBG_STR_CASE(SQL_SPECIAL_CHARACTERS); - DBG_STR_CASE(SQL_CATALOG_TERM); - DBG_STR_CASE(SQL_TABLE_TERM); - DBG_STR_CASE(SQL_SCHEMA_TERM); - DBG_STR_CASE(SQL_ASYNC_DBC_FUNCTIONS); - DBG_STR_CASE(SQL_ASYNC_NOTIFICATION); - DBG_STR_CASE(SQL_GETDATA_EXTENSIONS); - DBG_STR_CASE(SQL_ODBC_INTERFACE_CONFORMANCE); - DBG_STR_CASE(SQL_SQL_CONFORMANCE); - DBG_STR_CASE(SQL_CATALOG_USAGE); - DBG_STR_CASE(SQL_SCHEMA_USAGE); - DBG_STR_CASE(SQL_MAX_IDENTIFIER_LEN); - DBG_STR_CASE(SQL_AGGREGATE_FUNCTIONS); - DBG_STR_CASE(SQL_NUMERIC_FUNCTIONS); - DBG_STR_CASE(SQL_STRING_FUNCTIONS); - DBG_STR_CASE(SQL_TIMEDATE_FUNCTIONS); - DBG_STR_CASE(SQL_TIMEDATE_ADD_INTERVALS); - DBG_STR_CASE(SQL_TIMEDATE_DIFF_INTERVALS); - DBG_STR_CASE(SQL_DATETIME_LITERALS); - DBG_STR_CASE(SQL_SYSTEM_FUNCTIONS); - DBG_STR_CASE(SQL_CONVERT_FUNCTIONS); - DBG_STR_CASE(SQL_OJ_CAPABILITIES); - DBG_STR_CASE(SQL_POS_OPERATIONS); - DBG_STR_CASE(SQL_MAX_CONCURRENT_ACTIVITIES); - DBG_STR_CASE(SQL_CURSOR_COMMIT_BEHAVIOR); - DBG_STR_CASE(SQL_CURSOR_ROLLBACK_BEHAVIOR); - DBG_STR_CASE(SQL_TXN_CAPABLE); - DBG_STR_CASE(SQL_QUOTED_IDENTIFIER_CASE); - DBG_STR_CASE(SQL_SQL92_NUMERIC_VALUE_FUNCTIONS); - DBG_STR_CASE(SQL_SQL92_STRING_FUNCTIONS); - DBG_STR_CASE(SQL_SQL92_DATETIME_FUNCTIONS); - DBG_STR_CASE(SQL_SQL92_PREDICATES); - DBG_STR_CASE(SQL_SQL92_RELATIONAL_JOIN_OPERATORS); - DBG_STR_CASE(SQL_SQL92_VALUE_EXPRESSIONS); - default: - break; - } - return "<< UNKNOWN TYPE >>"; - } - -#undef DBG_STR_CASE -#endif - - ConnectionInfo::ConnectionInfo() : strParams(), intParams(), - shortParams() - { - //========================= String Params ========================= - // Driver name. - strParams[SQL_DRIVER_NAME] = "Apache Ignite"; - strParams[SQL_DBMS_NAME] = "Apache Ignite"; - - // ODBC version. - strParams[SQL_DRIVER_ODBC_VER] = "03.00"; - strParams[SQL_DBMS_VER] = "03.00"; - -#ifdef SQL_DRIVER_VER - // Driver version. At a minimum, the version is of the form - // ##.##.####, where the first two digits are the major version, - // the next two digits are the minor version, and the last four - // digits are the release version. - strParams[SQL_DRIVER_VER] = "01.05.0000"; -#endif // SQL_DRIVER_VER - -#ifdef SQL_COLUMN_ALIAS - // A character string: "Y" if the data source supports column - // aliases; otherwise, "N". - strParams[SQL_COLUMN_ALIAS] = "N"; -#endif // SQL_COLUMN_ALIAS - -#ifdef SQL_IDENTIFIER_QUOTE_CHAR - // The character string that is used as the starting and ending - // delimiter of a quoted (delimited) identifier in SQL statements. - // Identifiers passed as arguments to ODBC functions do not have to - // be quoted. If the data source does not support quoted - // identifiers, a blank is returned. - strParams[SQL_IDENTIFIER_QUOTE_CHAR] = ""; -#endif // SQL_IDENTIFIER_QUOTE_CHAR - -#ifdef SQL_CATALOG_NAME_SEPARATOR - // A character string: the character or characters that the data - // source defines as the separator between a catalog name and the - // qualified name element that follows or precedes it. - strParams[SQL_CATALOG_NAME_SEPARATOR] = "."; -#endif // SQL_CATALOG_NAME_SEPARATOR - -#ifdef SQL_SPECIAL_CHARACTERS - // A character string that contains all special characters (that - // is, all characters except a through z, A through Z, 0 through 9, - // and underscore) that can be used in an identifier name, such as - // a table name, column name, or index name, on the data source. - strParams[SQL_SPECIAL_CHARACTERS] = ""; -#endif // SQL_SPECIAL_CHARACTERS - -#ifdef SQL_CATALOG_TERM - // A character string with the data source vendor's name for - // a catalog; for example, "database" or "directory". This string - // can be in upper, lower, or mixed case. - strParams[SQL_CATALOG_TERM] = "catalog"; -#endif // SQL_CATALOG_TERM - -#ifdef SQL_TABLE_TERM - // A character string with the data source vendor's name for - // a table; for example, "table" or "file". - strParams[SQL_TABLE_TERM] = "table"; -#endif // SQL_TABLE_TERM - -#ifdef SQL_SCHEMA_TERM - // A character string with the data source vendor's name for - // a schema; for example, "owner", "Authorization ID", or "Schema". - strParams[SQL_SCHEMA_TERM] = "schema"; -#endif // SQL_SCHEMA_TERM - -#ifdef SQL_ASYNC_DBC_FUNCTIONS - //======================== Integer Params ========================= - // Indicates if the driver can execute functions asynchronously - // on the connection handle. - // SQL_ASYNC_DBC_CAPABLE = The driver can execute connection - // functions asynchronously. - // SQL_ASYNC_DBC_NOT_CAPABLE = The driver can not execute - // connection functions asynchronously. - intParams[SQL_ASYNC_DBC_FUNCTIONS] = SQL_ASYNC_DBC_NOT_CAPABLE; -#endif // SQL_ASYNC_DBC_FUNCTIONS - -#ifdef SQL_ASYNC_NOTIFICATION - // Indicates if the driver supports asynchronous notification. - // SQL_ASYNC_NOTIFICATION_CAPABLE = Asynchronous execution - // notification is supported by the driver. - // SQL_ASYNC_NOTIFICATION_NOT_CAPABLE Asynchronous execution - // notification is not supported by the driver. - intParams[SQL_ASYNC_NOTIFICATION] = SQL_ASYNC_NOTIFICATION_NOT_CAPABLE; -#endif // SQL_ASYNC_NOTIFICATION - -#ifdef SQL_GETDATA_EXTENSIONS - // Bitmask enumerating extensions to SQLGetData. - intParams[SQL_GETDATA_EXTENSIONS] = SQL_GD_ANY_COLUMN; -#endif // SQL_GETDATA_EXTENSIONS - -#ifdef SQL_ODBC_INTERFACE_CONFORMANCE - // Indicates the level of the ODBC 3.x interface that the driver - // complies with. - intParams[SQL_ODBC_INTERFACE_CONFORMANCE] = SQL_OIC_CORE; -#endif // SQL_ODBC_INTERFACE_CONFORMANCE - -#ifdef SQL_SQL_CONFORMANCE - // Indicates the level of SQL-92 supported by the driver. - intParams[SQL_SQL_CONFORMANCE] = 0; // SQL_SC_SQL92_ENTRY; -#endif // SQL_SQL_CONFORMANCE - -#ifdef SQL_CATALOG_USAGE - // Bitmask enumerating the statements in which catalogs can be used. - intParams[SQL_CATALOG_USAGE] = 0; -#endif // SQL_CATALOG_USAGE - -#ifdef SQL_SCHEMA_USAGE - // Bitmask enumerating the statements in which schemas can be used. - intParams[SQL_SCHEMA_USAGE] = 0; -#endif // SQL_SCHEMA_USAGE - -#ifdef SQL_MAX_IDENTIFIER_LEN - // Indicates the maximum size in characters that the data source - // supports for user-defined names. - intParams[SQL_MAX_IDENTIFIER_LEN] = 128; -#endif // SQL_MAX_IDENTIFIER_LEN - -#ifdef SQL_AGGREGATE_FUNCTIONS - // Bitmask enumerating support for aggregation functions. - intParams[SQL_AGGREGATE_FUNCTIONS] = SQL_AF_ALL | SQL_AF_AVG | - SQL_AF_COUNT | SQL_AF_DISTINCT | SQL_AF_MAX | SQL_AF_MIN | - SQL_AF_SUM; -#endif // SQL_AGGREGATE_FUNCTIONS - -#ifdef SQL_NUMERIC_FUNCTIONS - // Bitmask enumerating the scalar numeric functions supported by - // the driver and associated data source. - intParams[SQL_NUMERIC_FUNCTIONS] = SQL_FN_NUM_ABS; -#endif // SQL_NUMERIC_FUNCTIONS - -#ifdef SQL_STRING_FUNCTIONS - // Bitmask enumerating the scalar string functions supported by the - // driver and associated data source. - intParams[SQL_STRING_FUNCTIONS] = 0; -#endif // SQL_STRING_FUNCTIONS - -#ifdef SQL_TIMEDATE_FUNCTIONS - // Bitmask enumerating the scalar date and time functions supported - // by the driver and associated data source. - intParams[SQL_TIMEDATE_FUNCTIONS] = 0; -#endif // SQL_TIMEDATE_FUNCTIONS - -#ifdef SQL_TIMEDATE_ADD_INTERVALS - // Bitmask enumerating timestamp intervals supported by the driver - // and associated data source for the TIMESTAMPADD scalar function. - intParams[SQL_TIMEDATE_ADD_INTERVALS] = 0; -#endif // SQL_TIMEDATE_ADD_INTERVALS - -#ifdef SQL_TIMEDATE_DIFF_INTERVALS - // Bitmask enumerating timestamp intervals supported by the driver - // and associated data source for the TIMESTAMPDIFF scalar function. - intParams[SQL_TIMEDATE_DIFF_INTERVALS] = 0; -#endif // SQL_TIMEDATE_DIFF_INTERVALS - -#ifdef SQL_DATETIME_LITERALS - // Bitmask enumerating the SQL-92 datetime literals supported by - // the data source. - intParams[SQL_DATETIME_LITERALS] = 0; -#endif // SQL_DATETIME_LITERALS - -#ifdef SQL_SYSTEM_FUNCTIONS - // Bitmask enumerating the scalar system functions supported by the - // driver and associated data source. - intParams[SQL_SYSTEM_FUNCTIONS] = 0; -#endif // SQL_SYSTEM_FUNCTIONS - -#ifdef SQL_CONVERT_FUNCTIONS - // Bitmask enumerating the scalar conversion functions supported - // by the driver and associated data source. - intParams[SQL_CONVERT_FUNCTIONS] = 0; -#endif // SQL_CONVERT_FUNCTIONS - -#ifdef SQL_OJ_CAPABILITIES - // Bitmask enumerating the types of outer joins supported by the - // driver and data source. - intParams[SQL_OJ_CAPABILITIES] = SQL_OJ_LEFT | SQL_OJ_RIGHT | - SQL_OJ_FULL | SQL_OJ_NESTED | SQL_OJ_INNER | - SQL_OJ_ALL_COMPARISON_OPS; -#endif // SQL_OJ_CAPABILITIES - -#ifdef SQL_POS_OPERATIONS - // Bitmask enumerating the support operations in SQLSetPos. - intParams[SQL_POS_OPERATIONS] = 0; -#endif // SQL_POS_OPERATIONS - -#ifdef SQL_SQL92_NUMERIC_VALUE_FUNCTIONS - // Bitmask enumerating the numeric value scalar functions. - intParams[SQL_SQL92_NUMERIC_VALUE_FUNCTIONS] = 0; -#endif // SQL_SQL92_NUMERIC_VALUE_FUNCTIONS - -#ifdef SQL_SQL92_STRING_FUNCTIONS - // Bitmask enumerating the string scalar functions. - intParams[SQL_SQL92_STRING_FUNCTIONS] = 0; -#endif // SQL_SQL92_STRING_FUNCTIONS - -#ifdef SQL_SQL92_DATETIME_FUNCTIONS - // Bitmask enumerating the datetime scalar functions. - intParams[SQL_SQL92_DATETIME_FUNCTIONS] = 0; -#endif // SQL_SQL92_DATETIME_FUNCTIONS - -#ifdef SQL_SQL92_VALUE_EXPRESSIONS - // Bitmask enumerating the value expressions supported, - // as defined in SQL-92. - intParams[SQL_SQL92_VALUE_EXPRESSIONS] = SQL_SVE_CASE | - SQL_SVE_COALESCE | SQL_SVE_NULLIF; -#endif // SQL_SQL92_VALUE_EXPRESSIONS - -#ifdef SQL_SQL92_PREDICATES - // Bitmask enumerating the datetime scalar functions. - intParams[SQL_SQL92_PREDICATES] = SQL_SP_BETWEEN | - SQL_SP_COMPARISON | SQL_SP_EXISTS | SQL_SP_IN | - SQL_SP_ISNOTNULL | SQL_SP_ISNULL | SQL_SP_LIKE | - SQL_SP_MATCH_FULL | SQL_SP_MATCH_PARTIAL | - SQL_SP_MATCH_UNIQUE_FULL | SQL_SP_MATCH_UNIQUE_PARTIAL | - SQL_SP_OVERLAPS | SQL_SP_QUANTIFIED_COMPARISON | - SQL_SP_UNIQUE; -#endif // SQL_SQL92_PREDICATES - -#ifdef SQL_SQL92_RELATIONAL_JOIN_OPERATORS - // Bitmask enumerating the relational join operators supported - // in a SELECT statement, as defined in SQL-92. - intParams[SQL_SQL92_RELATIONAL_JOIN_OPERATORS] = - SQL_SRJO_CORRESPONDING_CLAUSE | SQL_SRJO_CROSS_JOIN | - SQL_SRJO_EXCEPT_JOIN | SQL_SRJO_EXCEPT_JOIN | - SQL_SRJO_INNER_JOIN | SQL_SRJO_INTERSECT_JOIN | - SQL_SRJO_LEFT_OUTER_JOIN | SQL_SRJO_NATURAL_JOIN | - SQL_SRJO_RIGHT_OUTER_JOIN | SQL_SRJO_UNION_JOIN; -#endif // SQL_SQL92_RELATIONAL_JOIN_OPERATORS - - //========================= Short Params ========================== -#ifdef SQL_MAX_CONCURRENT_ACTIVITIES - // The maximum number of active statements that the driver can - // support for a connection. Zero mean no limit. - shortParams[SQL_MAX_CONCURRENT_ACTIVITIES] = 32; -#endif // SQL_MAX_CONCURRENT_ACTIVITIES - -#ifdef SQL_CURSOR_COMMIT_BEHAVIOR - // Indicates how a COMMIT operation affects cursors and prepared - // statements in the data source. - shortParams[SQL_CURSOR_COMMIT_BEHAVIOR] = SQL_CB_PRESERVE; -#endif // SQL_CURSOR_COMMIT_BEHAVIOR - -#ifdef SQL_CURSOR_ROLLBACK_BEHAVIOR - // Indicates how a ROLLBACK operation affects cursors and prepared - // statements in the data source. - shortParams[SQL_CURSOR_ROLLBACK_BEHAVIOR] = SQL_CB_PRESERVE; -#endif // SQL_CURSOR_ROLLBACK_BEHAVIOR - -#ifdef SQL_TXN_CAPABLE - // Describs the transaction support in the driver or data source. - shortParams[SQL_TXN_CAPABLE] = SQL_TC_NONE; -#endif // SQL_TXN_CAPABLE - -#ifdef SQL_QUOTED_IDENTIFIER_CASE - // Case-sensitiveness of the quoted identifiers in SQL. - shortParams[SQL_QUOTED_IDENTIFIER_CASE] = SQL_IC_SENSITIVE; -#endif // SQL_QUOTED_IDENTIFIER_CASE - } - - ConnectionInfo::~ConnectionInfo() - { - // No-op. - } - - SqlResult ConnectionInfo::GetInfo(InfoType type, void* buf, - short buflen, short* reslen) const - { - if (!buf || !buflen) - return SQL_RESULT_ERROR; - - StringInfoMap::const_iterator itStr = strParams.find(type); - - if (itStr != strParams.cend()) - { - unsigned short strlen = static_cast<short>( - utility::CopyStringToBuffer(itStr->second, - reinterpret_cast<char*>(buf), buflen)); - - if (reslen) - *reslen = strlen; - - return SQL_RESULT_SUCCESS; - } - - UintInfoMap::const_iterator itInt = intParams.find(type); - - if (itInt != intParams.cend()) - { - unsigned int *res = reinterpret_cast<unsigned int*>(buf); - - *res = itInt->second; - - return SQL_RESULT_SUCCESS; - } - - UshortInfoMap::const_iterator itShort = shortParams.find(type); - - if (itShort != shortParams.cend()) - { - unsigned short *res = reinterpret_cast<unsigned short*>(buf); - - *res = itShort->second; - - return SQL_RESULT_SUCCESS; - } - - return SQL_RESULT_ERROR; - } - } - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/connection.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/connection.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/connection.cpp deleted file mode 100644 index 28cd7ca..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/connection.cpp +++ /dev/null @@ -1,269 +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 <cstring> - -#include <sstream> - -#include "ignite/odbc/utility.h" -#include "ignite/odbc/statement.h" -#include "ignite/odbc/connection.h" -#include "ignite/odbc/config/configuration.h" - -// TODO: implement appropriate protocol with de-/serialisation. -namespace -{ -#pragma pack(push, 1) - struct OdbcProtocolHeader - { - int32_t len; - }; -#pragma pack(pop) -} - -namespace ignite -{ - namespace odbc - { - Connection::Connection() : socket(), connected(false), cache(), parser() - { - // No-op. - } - - Connection::~Connection() - { - // No-op. - } - - const config::ConnectionInfo& Connection::GetInfo() const - { - // Connection info is the same for all connections now. - static config::ConnectionInfo info; - - return info; - } - - void Connection::GetInfo(config::ConnectionInfo::InfoType type, void* buf, short buflen, short* reslen) - { - IGNITE_ODBC_API_CALL(InternalGetInfo(type, buf, buflen, reslen)); - } - - SqlResult Connection::InternalGetInfo(config::ConnectionInfo::InfoType type, void* buf, short buflen, short* reslen) - { - const config::ConnectionInfo& info = GetInfo(); - - SqlResult res = info.GetInfo(type, buf, buflen, reslen); - - if (res != SQL_RESULT_SUCCESS) - AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, "Not implemented."); - - return res; - } - - void Connection::Establish(const std::string& server) - { - IGNITE_ODBC_API_CALL(InternalEstablish(server)); - } - - SqlResult Connection::InternalEstablish(const std::string& server) - { - config::Configuration config; - - if (server != config.GetDsn()) - { - AddStatusRecord(SQL_STATE_HY000_GENERAL_ERROR, "Unknown DNS."); - - return SQL_RESULT_ERROR; - } - - return InternalEstablish(config.GetHost(), config.GetPort(), config.GetCache()); - } - - void Connection::Establish(const std::string& host, uint16_t port, const std::string& cache) - { - IGNITE_ODBC_API_CALL(InternalEstablish(host, port, cache)); - } - - SqlResult Connection::InternalEstablish(const std::string & host, uint16_t port, const std::string & cache) - { - if (connected) - { - AddStatusRecord(SQL_STATE_08002_ALREADY_CONNECTED, "Already connected."); - - return SQL_RESULT_ERROR; - } - - if (cache.empty()) - { - AddStatusRecord(SQL_STATE_HY000_GENERAL_ERROR, "Cache is not specified."); - - return SQL_RESULT_ERROR; - } - - this->cache = cache; - - connected = socket.Connect(host.c_str(), port); - - if (!connected) - { - AddStatusRecord(SQL_STATE_08001_CANNOT_CONNECT, "Failed to establish connection with the host."); - - return SQL_RESULT_ERROR; - } - - return SQL_RESULT_SUCCESS; - } - - void Connection::Release() - { - IGNITE_ODBC_API_CALL(InternalRelease()); - } - - SqlResult Connection::InternalRelease() - { - if (!connected) - { - AddStatusRecord(SQL_STATE_08003_NOT_CONNECTED, "Connection is not open."); - - return SQL_RESULT_ERROR; - } - - socket.Close(); - - connected = false; - - return SQL_RESULT_SUCCESS; - } - - Statement* Connection::CreateStatement() - { - Statement* statement; - - IGNITE_ODBC_API_CALL(InternalCreateStatement(statement)); - - return statement; - } - - SqlResult Connection::InternalCreateStatement(Statement*& statement) - { - statement = new Statement(*this); - - if (!statement) - { - AddStatusRecord(SQL_STATE_HY001_MEMORY_ALLOCATION, "Not enough memory."); - - return SQL_RESULT_ERROR; - } - - return SQL_RESULT_SUCCESS; - } - - bool Connection::Send(const int8_t* data, size_t len) - { - if (!connected) - return false; - - size_t sent = 0; - - while (sent != len) - { - size_t res = socket.Send(data + sent, len - sent); - - if (res <= 0) - return false; - - sent += res; - } - - return true; - } - - bool Connection::Receive(std::vector<int8_t>& msg) - { - if (!connected) - return false; - - msg.clear(); - - OdbcProtocolHeader hdr; - - int received = socket.Receive(reinterpret_cast<int8_t*>(&hdr), sizeof(hdr)); - LOG_MSG("Received: %d\n", received); - - if (received != sizeof(hdr)) - return false; - - size_t remain = hdr.len; - size_t receivedAtAll = 0; - - msg.resize(remain); - - while (remain) - { - received = socket.Receive(&msg[receivedAtAll], remain); - LOG_MSG("Received: %d\n", received); - LOG_MSG("remain: %d\n", remain); - - if (received <= 0) - { - msg.resize(receivedAtAll); - - return false; - } - - remain -= static_cast<size_t>(received); - } - - return true; - } - - const std::string& Connection::GetCache() const - { - return cache; - } - - diagnostic::DiagnosticRecord Connection::CreateStatusRecord(SqlState sqlState, - const std::string& message, int32_t rowNum, int32_t columnNum) const - { - return diagnostic::DiagnosticRecord(sqlState, message, "", "", rowNum, columnNum); - } - - void Connection::TransactionCommit() - { - IGNITE_ODBC_API_CALL(InternalTransactionCommit()); - } - - SqlResult Connection::InternalTransactionCommit() - { - return SQL_RESULT_SUCCESS; - } - - void Connection::TransactionRollback() - { - IGNITE_ODBC_API_CALL(InternalTransactionRollback()); - } - - SqlResult Connection::InternalTransactionRollback() - { - AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, - "Rollback operation is not supported."); - - return SQL_RESULT_ERROR; - } - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/cursor.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/cursor.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/cursor.cpp deleted file mode 100644 index edd1818..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/cursor.cpp +++ /dev/null @@ -1,78 +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 "ignite/odbc/cursor.h" - -namespace ignite -{ - namespace odbc - { - Cursor::Cursor(int64_t queryId) : queryId(queryId), currentPage(), - currentPagePos(0), currentRow() - { - // No-op. - } - - Cursor::~Cursor() - { - // No-op. - } - - bool Cursor::Increment() - { - if (currentPage.get() && currentPagePos < currentPage->GetSize()) - { - ++currentPagePos; - - Row *row = currentRow.get(); - - if (row) - row->MoveToNext(); - - return true; - } - return false; - } - - bool Cursor::NeedDataUpdate() const - { - return !currentPage.get() || (!currentPage->IsLast() && - currentPagePos == currentPage->GetSize()); - } - - bool Cursor::HasNext() const - { - return !currentPage.get() || !currentPage->IsLast() || - currentPagePos < currentPage->GetSize(); - } - - void Cursor::UpdateData(std::auto_ptr<ResultPage>& newPage) - { - currentPage = newPage; - - currentPagePos = 1; - - currentRow.reset(new Row(currentPage->GetData())); - } - - Row* Cursor::GetRow() - { - return currentRow.get(); - } - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/decimal.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/decimal.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/decimal.cpp deleted file mode 100644 index 0fa37fb..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/decimal.cpp +++ /dev/null @@ -1,117 +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 <cstring> -#include <utility> - -#include "ignite/odbc/decimal.h" - -namespace ignite -{ - Decimal::Decimal() : - scale(0), len(0), magnitude(0) - { - // No-op. - } - - Decimal::Decimal(int32_t scale, const int8_t* mag, int32_t len) : - scale(scale), len(len), magnitude(0) - { - magnitude = new int8_t[len]; - - memcpy(magnitude, mag, len); - } - - Decimal::Decimal(const Decimal& other) : - scale(other.scale), len(other.len), magnitude(0) - { - magnitude = new int8_t[len]; - - memcpy(magnitude, other.magnitude, len); - } - - Decimal::~Decimal() - { - if (magnitude) - delete[] magnitude; - } - - Decimal& Decimal::operator=(const Decimal& other) - { - Decimal tmp(other); - - swap(tmp, *this); - - return *this; - } - - Decimal::operator double() const - { - double res = 0; - - int32_t localScale = GetScale(); - - for (int32_t i = 0; i < len; ++i) - { - res = (res * 256) + magnitude[i]; - - while (localScale && res > 10.0) - { - res /= 10.0; - - --localScale; - } - } - - return res * GetSign(); - } - - int32_t Decimal::GetScale() const - { - return scale & 0x7FFFFFFF; - } - - int32_t Decimal::GetSign() const - { - return IsNegative() ? -1 : 1; - } - - bool Decimal::IsNegative() const - { - return (scale & 0x80000000) != 0; - } - - int32_t Decimal::GetLength() const - { - return scale; - } - - const int8_t* Decimal::GetMagnitude() const - { - return magnitude; - } - - void swap(Decimal& first, Decimal& second) - { - using std::swap; - - std::swap(first.scale, second.scale); - std::swap(first.len, second.len); - std::swap(first.magnitude, second.magnitude); - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnosable_adapter.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnosable_adapter.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnosable_adapter.cpp deleted file mode 100644 index d6cf4fe..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnosable_adapter.cpp +++ /dev/null @@ -1,49 +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 "ignite/odbc/connection.h" -#include "ignite/odbc/diagnostic/diagnosable_adapter.h" - -namespace ignite -{ - namespace odbc - { - namespace diagnostic - { - void DiagnosableAdapter::AddStatusRecord(SqlState sqlState, - const std::string& message, int32_t rowNum, int32_t columnNum) - { - if (connection) - { - diagnosticRecords.AddStatusRecord( - connection->CreateStatusRecord(sqlState, message, rowNum, columnNum)); - } - else - { - diagnosticRecords.AddStatusRecord( - DiagnosticRecord(sqlState, message, "", "", rowNum, columnNum)); - } - } - - void DiagnosableAdapter::AddStatusRecord(SqlState sqlState, const std::string & message) - { - AddStatusRecord(sqlState, message, 0, 0); - } - } - } -} - http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record.cpp deleted file mode 100644 index 568c125..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record.cpp +++ /dev/null @@ -1,241 +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 <set> -#include <string> - -#include "ignite/odbc/diagnostic/diagnostic_record.h" - -namespace -{ - /** SQLSTATEs defined by Open Group and ISO call-level interface. */ - const std::string ORIGIN_ISO_9075 = "ISO 9075"; - - /** ODBC-specific SQLSTATEs (all those whose SQLSTATE class is "IM"). */ - const std::string ORIGIN_ODBC_3_0 = "ODBC 3.0"; - - /** SQL state unknown constant. */ - const std::string STATE_UNKNOWN = ""; - - /** SQL state 01004 constant. */ - const std::string STATE_01004 = "01004"; - - /** SQL state 01S01 constant. */ - const std::string STATE_01S01 = "01S01"; - - /** SQL state 24000 constant. */ - const std::string STATE_24000 = "24000"; - - /** SQL state 08001 constant. */ - const std::string STATE_08001 = "08001"; - - /** SQL state 08002 constant. */ - const std::string STATE_08002 = "08002"; - - /** SQL state 08003 constant. */ - const std::string STATE_08003 = "08003"; - - /** SQL state HY000 constant. */ - const std::string STATE_HY000 = "HY000"; - - /** SQL state HY001 constant. */ - const std::string STATE_HY001 = "HY001"; - - /** SQL state HY010 constant. */ - const std::string STATE_HY010 = "HY010"; - - /** SQL state HYC00 constant. */ - const std::string STATE_HYC00 = "HYC00"; - - /** SQL state HYT01 constant. */ - const std::string STATE_HYT01 = "HYT01"; -} - -namespace ignite -{ - namespace odbc - { - namespace diagnostic - { - DiagnosticRecord::DiagnosticRecord() : - sqlState(SQL_STATE_UNKNOWN), - message(), - connectionName(), - serverName(), - rowNum(0), - columnNum(0) - { - // No-op. - } - - DiagnosticRecord::DiagnosticRecord(SqlState sqlState, - const std::string& message, const std::string& connectionName, - const std::string& serverName, int32_t rowNum, int32_t columnNum) : - sqlState(sqlState), - message(message), - connectionName(connectionName), - serverName(serverName), - rowNum(rowNum), - columnNum(columnNum) - { - // No-op. - } - - DiagnosticRecord::~DiagnosticRecord() - { - // No-op. - } - - const std::string& DiagnosticRecord::GetClassOrigin() const - { - const std::string& state = GetSqlState(); - - if (state[0] == 'I' && state[1] == 'M') - return ORIGIN_ODBC_3_0; - - return ORIGIN_ISO_9075; - } - - const std::string& DiagnosticRecord::GetSubclassOrigin() const - { - static std::set<std::string> odbcSubclasses; - - if (odbcSubclasses.empty()) - { - odbcSubclasses.insert("01S00"); - odbcSubclasses.insert("01S01"); - odbcSubclasses.insert("01S02"); - odbcSubclasses.insert("01S06"); - odbcSubclasses.insert("01S07"); - odbcSubclasses.insert("07S01"); - odbcSubclasses.insert("08S01"); - odbcSubclasses.insert("21S01"); - odbcSubclasses.insert("21S02"); - odbcSubclasses.insert("25S01"); - odbcSubclasses.insert("25S02"); - odbcSubclasses.insert("25S03"); - odbcSubclasses.insert("42S01"); - odbcSubclasses.insert("42S02"); - odbcSubclasses.insert("42S11"); - odbcSubclasses.insert("42S12"); - odbcSubclasses.insert("42S21"); - odbcSubclasses.insert("42S22"); - odbcSubclasses.insert("HY095"); - odbcSubclasses.insert("HY097"); - odbcSubclasses.insert("HY098"); - odbcSubclasses.insert("HY099"); - odbcSubclasses.insert("HY100"); - odbcSubclasses.insert("HY101"); - odbcSubclasses.insert("HY105"); - odbcSubclasses.insert("HY107"); - odbcSubclasses.insert("HY109"); - odbcSubclasses.insert("HY110"); - odbcSubclasses.insert("HY111"); - odbcSubclasses.insert("HYT00"); - odbcSubclasses.insert("HYT01"); - odbcSubclasses.insert("IM001"); - odbcSubclasses.insert("IM002"); - odbcSubclasses.insert("IM003"); - odbcSubclasses.insert("IM004"); - odbcSubclasses.insert("IM005"); - odbcSubclasses.insert("IM006"); - odbcSubclasses.insert("IM007"); - odbcSubclasses.insert("IM008"); - odbcSubclasses.insert("IM010"); - odbcSubclasses.insert("IM011"); - odbcSubclasses.insert("IM012"); - } - - const std::string& state = GetSqlState(); - - if (odbcSubclasses.find(state) != odbcSubclasses.end()) - return ORIGIN_ODBC_3_0; - - return ORIGIN_ISO_9075; - } - - const std::string& DiagnosticRecord::GetMessage() const - { - return message; - } - - const std::string& DiagnosticRecord::GetConnectionName() const - { - return connectionName; - } - - const std::string& DiagnosticRecord::GetServerName() const - { - return serverName; - } - - const std::string& DiagnosticRecord::GetSqlState() const - { - switch (sqlState) - { - case SQL_STATE_01004_DATA_TRUNCATED: - return STATE_01004; - - case SQL_STATE_01S01_ERROR_IN_ROW: - return STATE_01S01; - - case SQL_STATE_24000_INVALID_CURSOR_STATE: - return STATE_24000; - - case SQL_STATE_08001_CANNOT_CONNECT: - return STATE_08001; - - case SQL_STATE_08002_ALREADY_CONNECTED: - return STATE_08002; - - case SQL_STATE_08003_NOT_CONNECTED: - return STATE_08003; - - case SQL_STATE_HY000_GENERAL_ERROR: - return STATE_HY000; - - case SQL_STATE_HY001_MEMORY_ALLOCATION: - return STATE_HY001; - - case SQL_STATE_HY010_SEQUENCE_ERROR: - return STATE_HY010; - - case SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED: - return STATE_HYC00; - - case SQL_STATE_HYT01_CONNECTIOIN_TIMEOUT: - return STATE_HYT01; - - default: - break; - } - - return STATE_UNKNOWN; - } - - int32_t DiagnosticRecord::GetRowNumber() const - { - return rowNum; - } - - int32_t DiagnosticRecord::GetColumnNumber() const - { - return columnNum; - } - } - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record_storage.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record_storage.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record_storage.cpp deleted file mode 100644 index 90c0a4f..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/diagnostic/diagnostic_record_storage.cpp +++ /dev/null @@ -1,242 +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 <set> -#include <string> - -#include "ignite/odbc/diagnostic/diagnostic_record_storage.h" - -namespace ignite -{ - namespace odbc - { - namespace diagnostic - { - DiagnosticRecordStorage::DiagnosticRecordStorage() : - rowCount(0), - dynamicFunction(), - dynamicFunctionCode(0), - result(SQL_RESULT_SUCCESS), - rowsAffected(0) - { - // No-op. - } - - DiagnosticRecordStorage::~DiagnosticRecordStorage() - { - // No-op. - } - - void DiagnosticRecordStorage::SetHeaderRecord(SqlResult result) - { - rowCount = 0; - dynamicFunction.clear(); - dynamicFunctionCode = 0; - this->result = result; - rowsAffected = 0; - } - - void DiagnosticRecordStorage::AddStatusRecord(const DiagnosticRecord& record) - { - statusRecords.push_back(record); - } - - void DiagnosticRecordStorage::Reset() - { - SetHeaderRecord(SQL_RESULT_ERROR); - - statusRecords.clear(); - } - - SqlResult DiagnosticRecordStorage::GetOperaionResult() const - { - return result; - } - - int DiagnosticRecordStorage::GetReturnCode() const - { - return SqlResultToReturnCode(result); - } - - int64_t DiagnosticRecordStorage::GetRowCount() const - { - return rowCount; - } - - const std::string & DiagnosticRecordStorage::GetDynamicFunction() const - { - return dynamicFunction; - } - - int32_t DiagnosticRecordStorage::GetDynamicFunctionCode() const - { - return dynamicFunctionCode; - } - - int32_t DiagnosticRecordStorage::GetRowsAffected() const - { - return rowsAffected; - } - - int32_t DiagnosticRecordStorage::GetStatusRecordsNumber() const - { - return static_cast<int32_t>(statusRecords.size()); - } - - const DiagnosticRecord& DiagnosticRecordStorage::GetStatusRecord(int32_t idx) const - { - return statusRecords[idx - 1]; - } - - bool DiagnosticRecordStorage::IsSuccessful() const - { - return result == SQL_RESULT_SUCCESS || - result == SQL_RESULT_SUCCESS_WITH_INFO; - } - - SqlResult DiagnosticRecordStorage::GetField(int32_t recNum, DiagnosticField field, app::ApplicationDataBuffer& buffer) const - { - // Header record. - switch (field) - { - case IGNITE_SQL_DIAG_HEADER_CURSOR_ROW_COUNT: - { - buffer.PutInt64(GetRowCount()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_HEADER_DYNAMIC_FUNCTION: - { - buffer.PutString(GetDynamicFunction()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_HEADER_DYNAMIC_FUNCTION_CODE: - { - buffer.PutInt32(GetDynamicFunctionCode()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_HEADER_NUMBER: - { - buffer.PutInt32(GetStatusRecordsNumber()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_HEADER_RETURNCODE: - { - buffer.PutInt32(GetReturnCode()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_HEADER_ROW_COUNT: - { - buffer.PutInt64(GetRowsAffected()); - - return SQL_RESULT_SUCCESS; - } - - default: - break; - } - - if (recNum < 1 || static_cast<size_t>(recNum) > statusRecords.size()) - return SQL_RESULT_NO_DATA; - - // Status record. - const DiagnosticRecord& record = GetStatusRecord(recNum); - - switch (field) - { - case IGNITE_SQL_DIAG_STATUS_CLASS_ORIGIN: - { - buffer.PutString(record.GetClassOrigin()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_COLUMN_NUMBER: - { - buffer.PutInt32(record.GetColumnNumber()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_CONNECTION_NAME: - { - buffer.PutString(record.GetConnectionName()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_MESSAGE_TEXT: - { - buffer.PutString(record.GetMessage()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_NATIVE: - { - buffer.PutInt32(0); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_ROW_NUMBER: - { - buffer.PutInt64(record.GetRowNumber()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_SERVER_NAME: - { - buffer.PutString(record.GetServerName()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_SQLSTATE: - { - buffer.PutString(record.GetSqlState()); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_DIAG_STATUS_SUBCLASS_ORIGIN: - { - buffer.PutString(record.GetSubclassOrigin()); - - return SQL_RESULT_SUCCESS; - } - - default: - break; - } - - return SQL_RESULT_ERROR; - } - - } - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/e8287063/modules/platforms/cpp/odbc/odbc-driver/src/environment.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/odbc-driver/src/environment.cpp b/modules/platforms/cpp/odbc/odbc-driver/src/environment.cpp deleted file mode 100644 index ba213ab..0000000 --- a/modules/platforms/cpp/odbc/odbc-driver/src/environment.cpp +++ /dev/null @@ -1,172 +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 "ignite/odbc/system/odbc_constants.h" -#include "ignite/odbc/connection.h" -#include "ignite/odbc/environment.h" - -namespace ignite -{ - namespace odbc - { - Environment::Environment() : - odbcVersion(SQL_OV_ODBC3), odbcNts(SQL_TRUE) - { - // No-op. - } - - Environment::~Environment() - { - // No-op. - } - - Connection* Environment::CreateConnection() - { - Connection* connection; - - IGNITE_ODBC_API_CALL(InternalCreateConnection(connection)); - - return connection; - } - - SqlResult Environment::InternalCreateConnection(Connection*& connection) - { - connection = new Connection; - - if (!connection) - { - AddStatusRecord(SQL_STATE_HY001_MEMORY_ALLOCATION, "Not enough memory."); - - return SQL_RESULT_ERROR; - } - - return SQL_RESULT_SUCCESS; - } - - void Environment::TransactionCommit() - { - IGNITE_ODBC_API_CALL(InternalTransactionCommit()); - } - - SqlResult Environment::InternalTransactionCommit() - { - return SQL_RESULT_SUCCESS; - } - - void Environment::TransactionRollback() - { - IGNITE_ODBC_API_CALL(InternalTransactionRollback()); - } - - SqlResult Environment::InternalTransactionRollback() - { - AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, - "Rollback operation is not supported."); - - return SQL_RESULT_ERROR; - } - - void Environment::SetAttribute(int32_t attr, void* value, int32_t len) - { - IGNITE_ODBC_API_CALL(InternalSetAttribute(attr, value, len)); - } - - SqlResult Environment::InternalSetAttribute(int32_t attr, void* value, int32_t len) - { - EnvironmentAttribute attribute = EnvironmentAttributeToInternal(attr); - - switch (attribute) - { - case IGNITE_SQL_ENV_ATTR_ODBC_VERSION: - { - int32_t version = reinterpret_cast<int32_t>(value); - - if (version != odbcVersion) - { - AddStatusRecord(SQL_STATE_01S02_OPTION_VALUE_CHANGED, - "ODBC version is not supported."); - - return SQL_RESULT_SUCCESS_WITH_INFO; - } - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_ENV_ATTR_OUTPUT_NTS: - { - int32_t nts = reinterpret_cast<int32_t>(value); - - if (nts != odbcNts) - { - AddStatusRecord(SQL_STATE_01S02_OPTION_VALUE_CHANGED, - "Only null-termination of strings is supported."); - - return SQL_RESULT_SUCCESS_WITH_INFO; - } - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_ENV_ATTR_UNKNOWN: - default: - break; - } - - AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, - "Attribute is not supported."); - - return SQL_RESULT_ERROR; - } - - void Environment::GetAttribute(int32_t attr, app::ApplicationDataBuffer& buffer) - { - IGNITE_ODBC_API_CALL(InternalGetAttribute(attr, buffer)); - } - - SqlResult Environment::InternalGetAttribute(int32_t attr, app::ApplicationDataBuffer& buffer) - { - EnvironmentAttribute attribute = EnvironmentAttributeToInternal(attr); - - switch (attribute) - { - case IGNITE_SQL_ENV_ATTR_ODBC_VERSION: - { - buffer.PutInt32(odbcVersion); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_ENV_ATTR_OUTPUT_NTS: - { - buffer.PutInt32(odbcNts); - - return SQL_RESULT_SUCCESS; - } - - case IGNITE_SQL_ENV_ATTR_UNKNOWN: - default: - break; - } - - AddStatusRecord(SQL_STATE_HYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, - "Attribute is not supported."); - - return SQL_RESULT_ERROR; - } - } -} -
