blob: d3a369242f99853b7076c86b971ba60affed24a0 [file] [log] [blame]
/*
* 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 01S00 constant. */
const std::string STATE_01S00 = "01S00";
/** SQL state 01S01 constant. */
const std::string STATE_01S01 = "01S01";
/** SQL state 01S02 constant. */
const std::string STATE_01S02 = "01S02";
/** SQL state 01S07 constant. */
const std::string STATE_01S07 = "01S07";
/** SQL state 07009 constant. */
const std::string STATE_07009 = "07009";
/** SQL state 07006 constant. */
const std::string STATE_07006 = "07006";
/** 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 08004 constant. */
const std::string STATE_08004 = "08004";
/** SQL state 08S01 constant. */
const std::string STATE_08S01 = "08S01";
/** SQL state 22002 constant. */
const std::string STATE_22002 = "22002";
/** SQL state 22026 constant. */
const std::string STATE_22026 = "22026";
/** SQL state 23000 constant. */
const std::string STATE_23000 = "23000";
/** SQL state 24000 constant. */
const std::string STATE_24000 = "24000";
/** SQL state 25000 constant. */
const std::string STATE_25000 = "25000";
/** SQL state 3F000 constant. */
const std::string STATE_3F000 = "3F000";
/** SQL state 40001 constant. */
const std::string STATE_40001 = "40001";
/** SQL state 42000 constant. */
const std::string STATE_42000 = "42000";
/** SQL state 42S01 constant. */
const std::string STATE_42S01 = "42S01";
/** SQL state 42S02 constant. */
const std::string STATE_42S02 = "42S02";
/** SQL state 42S11 constant. */
const std::string STATE_42S11 = "42S11";
/** SQL state 42S12 constant. */
const std::string STATE_42S12 = "42S12";
/** SQL state 42S21 constant. */
const std::string STATE_42S21 = "42S21";
/** SQL state 42S22 constant. */
const std::string STATE_42S22 = "42S22";
/** SQL state HY000 constant. */
const std::string STATE_HY000 = "HY000";
/** SQL state HY001 constant. */
const std::string STATE_HY001 = "HY001";
/** SQL state HY003 constant. */
const std::string STATE_HY003 = "HY003";
/** SQL state HY004 constant. */
const std::string STATE_HY004 = "HY004";
/** SQL state HY009 constant. */
const std::string STATE_HY009 = "HY009";
/** SQL state HY010 constant. */
const std::string STATE_HY010 = "HY010";
/** SQL state HY090 constant. */
const std::string STATE_HY090 = "HY090";
/** SQL state HY092 constant. */
const std::string STATE_HY092 = "HY092";
/** SQL state HY097 constant. */
const std::string STATE_HY097 = "HY097";
/** SQL state HY105 constant. */
const std::string STATE_HY105 = "HY105";
/** SQL state HY106 constant. */
const std::string STATE_HY106 = "HY106";
/** SQL state HYC00 constant. */
const std::string STATE_HYC00 = "HYC00";
/** SQL state HYT00 constant. */
const std::string STATE_HYT00 = "HYT00";
/** SQL state HYT01 constant. */
const std::string STATE_HYT01 = "HYT01";
/** SQL state IM001 constant. */
const std::string STATE_IM001 = "IM001";
}
namespace ignite
{
namespace odbc
{
namespace diagnostic
{
DiagnosticRecord::DiagnosticRecord() :
sqlState(SqlState::UNKNOWN),
message(),
connectionName(),
serverName(),
rowNum(0),
columnNum(0),
retrieved(false)
{
// No-op.
}
DiagnosticRecord::DiagnosticRecord(SqlState::Type 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),
retrieved(false)
{
// 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())
{
// This is a fixed list taken from ODBC doc.
// Please do not add/remove values here.
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::GetMessageText() 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 SqlState::S01004_DATA_TRUNCATED:
return STATE_01004;
case SqlState::S01S00_INVALID_CONNECTION_STRING_ATTRIBUTE:
return STATE_01S00;
case SqlState::S01S01_ERROR_IN_ROW:
return STATE_01S01;
case SqlState::S01S02_OPTION_VALUE_CHANGED:
return STATE_01S02;
case SqlState::S01S07_FRACTIONAL_TRUNCATION:
return STATE_01S07;
case SqlState::S07006_RESTRICTION_VIOLATION:
return STATE_07006;
case SqlState::S22002_INDICATOR_NEEDED:
return STATE_22002;
case SqlState::S22026_DATA_LENGTH_MISMATCH:
return STATE_22026;
case SqlState::S23000_INTEGRITY_CONSTRAINT_VIOLATION:
return STATE_23000;
case SqlState::S24000_INVALID_CURSOR_STATE:
return STATE_24000;
case SqlState::S25000_INVALID_TRANSACTION_STATE:
return STATE_25000;
case SqlState::S3F000_INVALID_SCHEMA_NAME:
return STATE_3F000;
case SqlState::S40001_SERIALIZATION_FAILURE:
return STATE_40001;
case SqlState::S42000_SYNTAX_ERROR_OR_ACCESS_VIOLATION:
return STATE_42000;
case SqlState::S42S01_TABLE_OR_VIEW_ALREADY_EXISTS:
return STATE_42S01;
case SqlState::S42S02_TABLE_OR_VIEW_NOT_FOUND:
return STATE_42S02;
case SqlState::S42S11_INDEX_ALREADY_EXISTS:
return STATE_42S11;
case SqlState::S42S12_INDEX_NOT_FOUND:
return STATE_42S12;
case SqlState::S42S21_COLUMN_ALREADY_EXISTS:
return STATE_42S21;
case SqlState::S42S22_COLUMN_NOT_FOUND:
return STATE_42S22;
case SqlState::S07009_INVALID_DESCRIPTOR_INDEX:
return STATE_07009;
case SqlState::S08001_CANNOT_CONNECT:
return STATE_08001;
case SqlState::S08002_ALREADY_CONNECTED:
return STATE_08002;
case SqlState::S08003_NOT_CONNECTED:
return STATE_08003;
case SqlState::S08004_CONNECTION_REJECTED:
return STATE_08004;
case SqlState::S08S01_LINK_FAILURE:
return STATE_08S01;
case SqlState::SHY000_GENERAL_ERROR:
return STATE_HY000;
case SqlState::SHY001_MEMORY_ALLOCATION:
return STATE_HY001;
case SqlState::SHY003_INVALID_APPLICATION_BUFFER_TYPE:
return STATE_HY003;
case SqlState::SHY009_INVALID_USE_OF_NULL_POINTER:
return STATE_HY009;
case SqlState::SHY010_SEQUENCE_ERROR:
return STATE_HY010;
case SqlState::SHY090_INVALID_STRING_OR_BUFFER_LENGTH:
return STATE_HY090;
case SqlState::SHY092_OPTION_TYPE_OUT_OF_RANGE:
return STATE_HY092;
case SqlState::SHY097_COLUMN_TYPE_OUT_OF_RANGE:
return STATE_HY097;
case SqlState::SHY105_INVALID_PARAMETER_TYPE:
return STATE_HY105;
case SqlState::SHY106_FETCH_TYPE_OUT_OF_RANGE:
return STATE_HY106;
case SqlState::SHYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED:
return STATE_HYC00;
case SqlState::SHYT00_TIMEOUT_EXPIRED:
return STATE_HYT00;
case SqlState::SHYT01_CONNECTION_TIMEOUT:
return STATE_HYT01;
case SqlState::SIM001_FUNCTION_NOT_SUPPORTED:
return STATE_IM001;
default:
break;
}
return STATE_UNKNOWN;
}
int32_t DiagnosticRecord::GetRowNumber() const
{
return rowNum;
}
int32_t DiagnosticRecord::GetColumnNumber() const
{
return columnNum;
}
bool DiagnosticRecord::IsRetrieved() const
{
return retrieved;
}
void DiagnosticRecord::MarkRetrieved()
{
retrieved = true;
}
}
}
}