blob: 7c420aae7ee468d4d6d11b9f022bad5c23903e25 [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 "common_types.h"
#include "ignite/odbc/system/odbc_constants.h"
namespace ignite {
SQLRETURN sql_result_to_return_code(sql_result result) {
switch (result) {
case sql_result::AI_SUCCESS:
return SQL_SUCCESS;
case sql_result::AI_SUCCESS_WITH_INFO:
return SQL_SUCCESS_WITH_INFO;
case sql_result::AI_NO_DATA:
return SQL_NO_DATA;
case sql_result::AI_NEED_DATA:
return SQL_NEED_DATA;
case sql_result::AI_ERROR:
default:
return SQL_ERROR;
}
}
diagnostic_field diagnostic_field_to_internal(int16_t field) {
switch (field) {
case SQL_DIAG_CURSOR_ROW_COUNT:
return diagnostic_field::HEADER_CURSOR_ROW_COUNT;
case SQL_DIAG_DYNAMIC_FUNCTION:
return diagnostic_field::HEADER_DYNAMIC_FUNCTION;
case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
return diagnostic_field::HEADER_DYNAMIC_FUNCTION_CODE;
case SQL_DIAG_NUMBER:
return diagnostic_field::HEADER_NUMBER;
case SQL_DIAG_RETURNCODE:
return diagnostic_field::HEADER_RETURN_CODE;
case SQL_DIAG_ROW_COUNT:
return diagnostic_field::HEADER_ROW_COUNT;
case SQL_DIAG_CLASS_ORIGIN:
return diagnostic_field::STATUS_CLASS_ORIGIN;
case SQL_DIAG_COLUMN_NUMBER:
return diagnostic_field::STATUS_COLUMN_NUMBER;
case SQL_DIAG_CONNECTION_NAME:
return diagnostic_field::STATUS_CONNECTION_NAME;
case SQL_DIAG_MESSAGE_TEXT:
return diagnostic_field::STATUS_MESSAGE_TEXT;
case SQL_DIAG_NATIVE:
return diagnostic_field::STATUS_NATIVE;
case SQL_DIAG_ROW_NUMBER:
return diagnostic_field::STATUS_ROW_NUMBER;
case SQL_DIAG_SERVER_NAME:
return diagnostic_field::STATUS_SERVER_NAME;
case SQL_DIAG_SQLSTATE:
return diagnostic_field::STATUS_SQLSTATE;
case SQL_DIAG_SUBCLASS_ORIGIN:
return diagnostic_field::STATUS_SUBCLASS_ORIGIN;
default:
break;
}
return diagnostic_field::UNKNOWN;
}
environment_attribute environment_attribute_to_internal(int32_t attr) {
switch (attr) {
case SQL_ATTR_ODBC_VERSION:
return environment_attribute::ODBC_VERSION;
case SQL_ATTR_OUTPUT_NTS:
return environment_attribute::OUTPUT_NTS;
default:
break;
}
return environment_attribute::UNKNOWN;
}
sql_state error_code_to_sql_state(error::code code) {
switch (code) {
// Common group. Group code: 1
case error::code::CURSOR_ALREADY_CLOSED:
case error::code::RESOURCE_CLOSING:
return sql_state::S24000_INVALID_CURSOR_STATE;
case error::code::NODE_STOPPING:
case error::code::COMPONENT_NOT_STARTED:
case error::code::ILLEGAL_ARGUMENT:
case error::code::SSL_CONFIGURATION:
case error::code::NODE_LEFT:
case error::code::INTERNAL:
return sql_state::SHY000_GENERAL_ERROR;
// Table group. Group code: 2
case error::code::TABLE_ALREADY_EXISTS:
return sql_state::S42S01_TABLE_OR_VIEW_ALREADY_EXISTS;
case error::code::TABLE_NOT_FOUND:
return sql_state::S42S02_TABLE_OR_VIEW_NOT_FOUND;
case error::code::COLUMN_ALREADY_EXISTS:
return sql_state::S42S21_COLUMN_ALREADY_EXISTS;
case error::code::COLUMN_NOT_FOUND:
return sql_state::S42S22_COLUMN_NOT_FOUND;
case error::code::TABLE_STOPPING:
case error::code::TABLE_DEFINITION:
case error::code::SCHEMA_VERSION_MISMATCH:
return sql_state::SHY000_GENERAL_ERROR;
// Client group. Group code: 3
case error::code::CONNECTION:
case error::code::PROTOCOL:
case error::code::PROTOCOL_COMPATIBILITY:
return sql_state::S08001_CANNOT_CONNECT;
case error::code::TABLE_ID_NOT_FOUND:
return sql_state::S42S02_TABLE_OR_VIEW_NOT_FOUND;
case error::code::AUTHENTICATION:
case error::code::AUTHORIZATION:
case error::code::CONFIGURATION:
case error::code::CLUSTER_ID_MISMATCH:
case error::code::CLIENT_SSL_CONFIGURATION:
case error::code::HANDSHAKE_HEADER:
return sql_state::S08004_CONNECTION_REJECTED;
// Sql group. Group code: 4
case error::code::SCHEMA_NOT_FOUND:
return sql_state::S3F000_INVALID_SCHEMA_NAME;
case error::code::PLANNING_TIMEOUT:
return sql_state::SHYT00_TIMEOUT_EXPIRED;
case error::code::EXECUTION_CANCELLED:
return sql_state::SHY008_OPERATION_CANCELED;
case error::code::TX_CONTROL_INSIDE_EXTERNAL_TX:
return sql_state::S25000_INVALID_TRANSACTION_STATE;
case error::code::CONSTRAINT_VIOLATION:
return sql_state::S23000_INTEGRITY_CONSTRAINT_VIOLATION;
case error::code::STMT_PARSE:
return sql_state::S42000_SYNTAX_ERROR_OR_ACCESS_VIOLATION;
case error::code::STMT_VALIDATION:
return sql_state::S42000_SYNTAX_ERROR_OR_ACCESS_VIOLATION;
case error::code::QUERY_NO_RESULT_SET:
case error::code::RUNTIME:
case error::code::MAPPING:
return sql_state::SHY000_GENERAL_ERROR;
// MetaStorage group. Group code: 5
case error::code::OP_EXECUTION:
case error::code::OP_EXECUTION_TIMEOUT:
return sql_state::SHYT00_TIMEOUT_EXPIRED;
case error::code::STARTING_STORAGE:
case error::code::RESTORING_STORAGE:
case error::code::COMPACTION:
return sql_state::SHY000_GENERAL_ERROR;
// Index group. Group code: 6
case error::code::INDEX_NOT_FOUND:
return sql_state::S42S12_INDEX_NOT_FOUND;
case error::code::INDEX_ALREADY_EXISTS:
return sql_state::S42S11_INDEX_ALREADY_EXISTS;
case error::code::INVALID_INDEX_DEFINITION:
return sql_state::SHY000_GENERAL_ERROR;
// Transactions group. Group code: 7
case error::code::TX_STATE_STORAGE:
case error::code::TX_STATE_STORAGE_STOPPED:
case error::code::TX_UNEXPECTED_STATE:
case error::code::ACQUIRE_LOCK:
case error::code::ACQUIRE_LOCK_TIMEOUT:
case error::code::TX_COMMIT:
case error::code::TX_ROLLBACK:
case error::code::TX_FAILED_READ_WRITE_OPERATION:
case error::code::TX_REPLICA_UNAVAILABLE:
case error::code::TX_STATE_STORAGE_REBALANCE:
case error::code::TX_READ_ONLY_TOO_OLD:
case error::code::TX_INCOMPATIBLE_SCHEMA:
case error::code::TX_PRIMARY_REPLICA_EXPIRED:
case error::code::TX_ALREADY_FINISHED:
case error::code::TX_STALE_OPERATION:
return sql_state::S25000_INVALID_TRANSACTION_STATE;
// Replicator group. Group code: 8
case error::code::CURSOR_CLOSE:
return sql_state::S24000_INVALID_CURSOR_STATE;
case error::code::REPLICA_TIMEOUT:
return sql_state::SHYT00_TIMEOUT_EXPIRED;
case error::code::REPLICA_COMMON:
case error::code::REPLICA_IS_ALREADY_STARTED:
case error::code::REPLICA_UNSUPPORTED_REQUEST:
case error::code::REPLICA_UNAVAILABLE:
case error::code::REPLICA_MISS:
case error::code::REPLICA_STOPPING:
case error::code::REPLICATION_SAFE_TIME_REORDERING:
return sql_state::SHY000_GENERAL_ERROR;
// Storage group. Group code: 9
case error::code::GENERIC:
case error::code::DIRECTORY_CREATION:
case error::code::ALREADY_CLOSED:
case error::code::STORAGE_REBALANCE:
case error::code::ALREADY_DESTROYED:
case error::code::INDEX_NOT_BUILT:
return sql_state::SHY000_GENERAL_ERROR;
// DistributionZones group. Group code: 10
case error::code::ZONE_NOT_FOUND:
return sql_state::SHY000_GENERAL_ERROR;
// Network group. Group code: 11
case error::code::UNRESOLVABLE_CONSISTENT_ID:
case error::code::PORT_IN_USE:
case error::code::RECIPIENT_LEFT:
case error::code::ADDRESS_UNRESOLVED:
return sql_state::S08001_CANNOT_CONNECT;
// NodeConfiguration group. Group code: 12
case error::code::CONFIG_READ:
case error::code::CONFIG_FILE_CREATE:
case error::code::CONFIG_WRITE:
case error::code::CONFIG_PARSE:
return sql_state::SHY000_GENERAL_ERROR;
// CodeDeployment group. Group code: 13
case error::code::UNIT_NOT_FOUND:
case error::code::UNIT_ALREADY_EXISTS:
case error::code::UNIT_CONTENT_READ:
case error::code::UNIT_UNAVAILABLE:
return sql_state::SHY000_GENERAL_ERROR;
// GarbageCollector group. Group code: 14
case error::code::CLOSED:
return sql_state::SHY000_GENERAL_ERROR;
// Authentication group. Group code: 15
case error::code::UNSUPPORTED_AUTHENTICATION_TYPE:
case error::code::INVALID_CREDENTIALS:
case error::code::BASIC_PROVIDER:
return sql_state::S08004_CONNECTION_REJECTED;
// Compute group. Group code: 16
case error::code::CLASS_PATH:
case error::code::CLASS_LOADER:
case error::code::CLASS_INITIALIZATION:
case error::code::QUEUE_OVERFLOW:
case error::code::COMPUTE_JOB_STATE_TRANSITION:
case error::code::CANCELLING:
case error::code::RESULT_NOT_FOUND:
case error::code::FAIL_TO_GET_JOB_STATUS:
case error::code::COMPUTE_JOB_FAILED:
case error::code::CHANGE_JOB_PRIORITY_NO_JOB:
case error::code::PRIMARY_REPLICA_RESOLVE:
case error::code::CHANGE_JOB_PRIORITY_JOB_EXECUTING:
case error::code::CHANGE_JOB_PRIORITY:
case error::code::NODE_NOT_FOUND:
return sql_state::SHY000_GENERAL_ERROR;
// Catalog group. Group code: 17
case error::code::VALIDATION:
return sql_state::SHY000_GENERAL_ERROR;
// PlacementDriver group. Group code: 18
case error::code::PRIMARY_REPLICA_AWAIT_TIMEOUT:
return sql_state::SHYT00_TIMEOUT_EXPIRED;
case error::code::PRIMARY_REPLICA_AWAIT:
return sql_state::SHY000_GENERAL_ERROR;
// CriticalWorkers group. Group code: 19
case error::code::SYSTEM_WORKER_BLOCKED:
case error::code::SYSTEM_CRITICAL_OPERATION_TIMEOUT:
return sql_state::SHY000_GENERAL_ERROR;
// DisasterRecovery group. Group code: 20
case error::code::NODES_NOT_FOUND:
case error::code::PARTITIONS_NOT_FOUND:
case error::code::PARTITION_STATE:
return sql_state::SHY000_GENERAL_ERROR;
}
return sql_state::SHY000_GENERAL_ERROR;
}
sql_state response_status_to_sql_state(int32_t status) {
switch (response_status(status)) {
case response_status::PARSING_FAILURE:
case response_status::KEY_UPDATE:
case response_status::UNEXPECTED_OPERATION:
return sql_state::S42000_SYNTAX_ERROR_OR_ACCESS_VIOLATION;
case response_status::UNSUPPORTED_OPERATION:
return sql_state::SHYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED;
case response_status::UNEXPECTED_ELEMENT_TYPE:
return sql_state::SHY004_INVALID_SQL_DATA_TYPE;
case response_status::DUPLICATE_KEY:
case response_status::NULL_KEY:
case response_status::NULL_VALUE:
return sql_state::S23000_INTEGRITY_CONSTRAINT_VIOLATION;
case response_status::TABLE_NOT_FOUND:
return sql_state::S42S02_TABLE_OR_VIEW_NOT_FOUND;
case response_status::INDEX_ALREADY_EXISTS:
return sql_state::S42S11_INDEX_ALREADY_EXISTS;
case response_status::INDEX_NOT_FOUND:
return sql_state::S42S12_INDEX_NOT_FOUND;
case response_status::TABLE_ALREADY_EXISTS:
return sql_state::S42S01_TABLE_OR_VIEW_ALREADY_EXISTS;
case response_status::COLUMN_NOT_FOUND:
return sql_state::S42S22_COLUMN_NOT_FOUND;
case response_status::COLUMN_ALREADY_EXISTS:
return sql_state::S42S21_COLUMN_ALREADY_EXISTS;
case response_status::TRANSACTION_COMPLETED:
return sql_state::S25000_INVALID_TRANSACTION_STATE;
case response_status::TRANSACTION_SERIALIZATION_ERROR:
return sql_state::S40001_SERIALIZATION_FAILURE;
case response_status::CACHE_NOT_FOUND:
case response_status::NULL_TABLE_DESCRIPTOR:
case response_status::CONVERSION_FAILED:
case response_status::CONCURRENT_UPDATE:
case response_status::ENTRY_PROCESSING:
case response_status::TABLE_DROP_FAILED:
case response_status::STMT_TYPE_MISMATCH:
case response_status::UNKNOWN_ERROR:
default:
return sql_state::SHY000_GENERAL_ERROR;
}
}
} // namespace ignite