blob: 476f6a6309c7a576264b3bdf2d9c99843a04dd16 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ignite/common/utils.h"
#include "ignite/odbc/system/odbc_constants.h"
#include "ignite/odbc/meta/column_meta.h"
#include "ignite/odbc/type_traits.h"
#include "ignite/odbc/common_types.h"
#include "ignite/odbc/log.h"
namespace ignite
{
namespace odbc
{
namespace meta
{
#define DBG_STR_CASE(x) case x: return #x
const char* ColumnMeta::AttrIdToString(uint16_t id)
{
switch (id)
{
DBG_STR_CASE(SQL_DESC_LABEL);
DBG_STR_CASE(SQL_DESC_BASE_COLUMN_NAME);
DBG_STR_CASE(SQL_DESC_NAME);
DBG_STR_CASE(SQL_DESC_TABLE_NAME);
DBG_STR_CASE(SQL_DESC_BASE_TABLE_NAME);
DBG_STR_CASE(SQL_DESC_SCHEMA_NAME);
DBG_STR_CASE(SQL_DESC_CATALOG_NAME);
DBG_STR_CASE(SQL_DESC_LITERAL_PREFIX);
DBG_STR_CASE(SQL_DESC_LITERAL_SUFFIX);
DBG_STR_CASE(SQL_DESC_TYPE_NAME);
DBG_STR_CASE(SQL_DESC_LOCAL_TYPE_NAME);
DBG_STR_CASE(SQL_DESC_FIXED_PREC_SCALE);
DBG_STR_CASE(SQL_DESC_AUTO_UNIQUE_VALUE);
DBG_STR_CASE(SQL_DESC_CASE_SENSITIVE);
DBG_STR_CASE(SQL_DESC_CONCISE_TYPE);
DBG_STR_CASE(SQL_DESC_TYPE);
DBG_STR_CASE(SQL_DESC_DISPLAY_SIZE);
DBG_STR_CASE(SQL_DESC_LENGTH);
DBG_STR_CASE(SQL_DESC_OCTET_LENGTH);
DBG_STR_CASE(SQL_DESC_NULLABLE);
DBG_STR_CASE(SQL_DESC_NUM_PREC_RADIX);
DBG_STR_CASE(SQL_DESC_PRECISION);
DBG_STR_CASE(SQL_DESC_SCALE);
DBG_STR_CASE(SQL_DESC_SEARCHABLE);
DBG_STR_CASE(SQL_DESC_UNNAMED);
DBG_STR_CASE(SQL_DESC_UNSIGNED);
DBG_STR_CASE(SQL_DESC_UPDATABLE);
DBG_STR_CASE(SQL_COLUMN_LENGTH);
DBG_STR_CASE(SQL_COLUMN_PRECISION);
DBG_STR_CASE(SQL_COLUMN_SCALE);
default:
break;
}
return "<< UNKNOWN ID >>";
}
#undef DBG_STR_CASE
void ColumnMeta::Read(ignite::impl::binary::BinaryReaderImpl& reader, const ProtocolVersion& ver)
{
utility::ReadString(reader, schemaName);
utility::ReadString(reader, tableName);
utility::ReadString(reader, columnName);
dataType = reader.ReadInt8();
if (ver >= ProtocolVersion::VERSION_2_7_0)
{
precision = reader.ReadInt32();
scale = reader.ReadInt32();
}
}
bool ColumnMeta::GetAttribute(uint16_t fieldId, std::string& value) const
{
using namespace ignite::impl::binary;
switch (fieldId)
{
case SQL_DESC_LABEL:
case SQL_DESC_BASE_COLUMN_NAME:
case SQL_DESC_NAME:
{
value = columnName;
return true;
}
case SQL_DESC_TABLE_NAME:
case SQL_DESC_BASE_TABLE_NAME:
{
value = tableName;
return true;
}
case SQL_DESC_SCHEMA_NAME:
{
value = schemaName;
return true;
}
case SQL_DESC_CATALOG_NAME:
{
value.clear();
return true;
}
case SQL_DESC_LITERAL_PREFIX:
case SQL_DESC_LITERAL_SUFFIX:
{
if (dataType == IGNITE_TYPE_STRING)
value = "'";
else
value.clear();
return true;
}
case SQL_DESC_TYPE_NAME:
case SQL_DESC_LOCAL_TYPE_NAME:
{
value = type_traits::BinaryTypeToSqlTypeName(dataType);
return true;
}
case SQL_DESC_PRECISION:
case SQL_COLUMN_LENGTH:
case SQL_COLUMN_PRECISION:
{
if (precision == -1)
return false;
value = common::LexicalCast<std::string>(precision);
return true;
}
case SQL_DESC_SCALE:
case SQL_COLUMN_SCALE:
{
if (scale == -1)
return false;
value = common::LexicalCast<std::string>(precision);
return true;
}
default:
return false;
}
}
bool ColumnMeta::GetAttribute(uint16_t fieldId, SqlLen& value) const
{
using namespace ignite::impl::binary;
switch (fieldId)
{
case SQL_DESC_FIXED_PREC_SCALE:
{
if (scale == -1)
value = SQL_FALSE;
else
value = SQL_TRUE;
break;
}
case SQL_DESC_AUTO_UNIQUE_VALUE:
{
value = SQL_FALSE;
break;
}
case SQL_DESC_CASE_SENSITIVE:
{
if (dataType == IGNITE_TYPE_STRING)
value = SQL_TRUE;
else
value = SQL_FALSE;
break;
}
case SQL_DESC_CONCISE_TYPE:
case SQL_DESC_TYPE:
{
value = type_traits::BinaryToSqlType(dataType);
break;
}
case SQL_DESC_DISPLAY_SIZE:
{
value = type_traits::BinaryTypeDisplaySize(dataType);
break;
}
case SQL_DESC_LENGTH:
case SQL_DESC_OCTET_LENGTH:
case SQL_COLUMN_LENGTH:
{
if (precision == -1)
value = type_traits::BinaryTypeTransferLength(dataType);
else
value = precision;
break;
}
case SQL_DESC_NULLABLE:
{
value = type_traits::BinaryTypeNullability(dataType);
break;
}
case SQL_DESC_NUM_PREC_RADIX:
{
value = type_traits::BinaryTypeNumPrecRadix(dataType);
break;
}
case SQL_DESC_PRECISION:
case SQL_COLUMN_PRECISION:
{
if (precision == -1)
value = type_traits::BinaryTypeColumnSize(dataType);
else
value = precision;
break;
}
case SQL_DESC_SCALE:
case SQL_COLUMN_SCALE:
{
if (scale == -1)
{
value = type_traits::BinaryTypeDecimalDigits(dataType);
if (value < 0)
value = 0;
}
else
value = scale;
break;
}
case SQL_DESC_SEARCHABLE:
{
value = SQL_PRED_BASIC;
break;
}
case SQL_DESC_UNNAMED:
{
value = columnName.empty() ? SQL_UNNAMED : SQL_NAMED;
break;
}
case SQL_DESC_UNSIGNED:
{
value = type_traits::BinaryTypeUnsigned(dataType) ? SQL_TRUE : SQL_FALSE;
break;
}
case SQL_DESC_UPDATABLE:
{
value = SQL_ATTR_READWRITE_UNKNOWN;
break;
}
default:
return false;
}
LOG_MSG("value: " << value);
return true;
}
void ReadColumnMetaVector(ignite::impl::binary::BinaryReaderImpl& reader, ColumnMetaVector& meta,
const ProtocolVersion& ver)
{
int32_t metaNum = reader.ReadInt32();
meta.clear();
meta.reserve(static_cast<size_t>(metaNum));
for (int32_t i = 0; i < metaNum; ++i)
{
meta.push_back(ColumnMeta());
meta.back().Read(reader, ver);
}
}
}
}
}