blob: 50d32448835b75402055628608be4e45f6bc5f05 [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.
*/
#ifndef _IGNITE_ODBC_APP_APPLICATION_DATA_BUFFER
#define _IGNITE_ODBC_APP_APPLICATION_DATA_BUFFER
#include <stdint.h>
#include <map>
#include <ignite/guid.h>
#include <ignite/date.h>
#include <ignite/timestamp.h>
#include <ignite/time.h>
#include <ignite/common/decimal.h>
#include "ignite/odbc/common_types.h"
#include "ignite/odbc/type_traits.h"
namespace ignite
{
namespace odbc
{
namespace app
{
/**
* Conversion result
*/
struct ConversionResult
{
enum Type
{
/** Conversion successful. No data lost. */
AI_SUCCESS,
/** Conversion successful, but fractional truncation occurred. */
AI_FRACTIONAL_TRUNCATED,
/** Conversion successful, but right-side variable length data truncation occurred. */
AI_VARLEN_DATA_TRUNCATED,
/** Conversion is not supported. */
AI_UNSUPPORTED_CONVERSION,
/** Indicator buffer needed to complete the operation but it is NULL. */
AI_INDICATOR_NEEDED,
/** No data found. */
AI_NO_DATA,
/** General operation failure. */
AI_FAILURE
};
};
/**
* User application data buffer.
*/
class ApplicationDataBuffer
{
public:
/**
* Default constructor.
*/
ApplicationDataBuffer();
/**
* Constructor.
*
* @param type Underlying data type.
* @param buffer Data buffer pointer.
* @param buflen Data buffer length.
* @param reslen Resulting data length.
*/
ApplicationDataBuffer(type_traits::OdbcNativeType::Type type, void* buffer,
SqlLen buflen, SqlLen* reslen);
/**
* Copy constructor.
*
* @param other Other instance.
*/
ApplicationDataBuffer(const ApplicationDataBuffer& other);
/**
* Destructor.
*/
~ApplicationDataBuffer();
/**
* Copy assigment operator.
*
* @param other Other instance.
* @return This.
*/
ApplicationDataBuffer& operator=(const ApplicationDataBuffer& other);
/**
* Set offset in bytes for all bound pointers.
*
* @param offset Offset.
*/
void SetByteOffset(int offset)
{
this->byteOffset = offset;
}
/**
* Set offset in elements for all bound pointers.
*
* @param
*/
void SetElementOffset(SqlUlen idx)
{
this->elementOffset = idx;
}
/**
* Put in buffer value of type int8_t.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutInt8(int8_t value);
/**
* Put in buffer value of type int16_t.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutInt16(int16_t value);
/**
* Put in buffer value of type int32_t.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutInt32(int32_t value);
/**
* Put in buffer value of type int64_t.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutInt64(int64_t value);
/**
* Put in buffer value of type float.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutFloat(float value);
/**
* Put in buffer value of type double.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutDouble(double value);
/**
* Put in buffer value of type string.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutString(const std::string& value);
/**
* Put in buffer value of type string.
*
* @param value Value.
* @param written Number of written characters.
* @return Conversion result.
*/
ConversionResult::Type PutString(const std::string& value, int32_t& written);
/**
* Put in buffer value of type GUID.
*
* @param value Value.
* @return Conversion result.
*/
ConversionResult::Type PutGuid(const Guid& value);
/**
* Put binary data in buffer.
*
* @param data Data pointer.
* @param len Data length.
* @param written Number of written characters.
* @return Conversion result.
*/
ConversionResult::Type PutBinaryData(void* data, size_t len, int32_t& written);
/**
* Put NULL.
* @return Conversion result.
*/
ConversionResult::Type PutNull();
/**
* Put decimal value to buffer.
*
* @param value Value to put.
* @return Conversion result.
*/
ConversionResult::Type PutDecimal(const common::Decimal& value);
/**
* Put date to buffer.
*
* @param value Value to put.
* @return Conversion result.
*/
ConversionResult::Type PutDate(const Date& value);
/**
* Put timestamp to buffer.
*
* @param value Value to put.
* @return Conversion result.
*/
ConversionResult::Type PutTimestamp(const Timestamp& value);
/**
* Put time to buffer.
*
* @param value Value to put.
* @return Conversion result.
*/
ConversionResult::Type PutTime(const Time& value);
/**
* Get string.
*
* @return String value of buffer.
*/
std::string GetString(size_t maxLen) const;
/**
* Get value of type int8_t.
*
* @return Integer value of type int8_t.
*/
int8_t GetInt8() const;
/**
* Get value of type int16_t.
*
* @return Integer value of type int16_t.
*/
int16_t GetInt16() const;
/**
* Get value of type int32_t.
*
* @return Integer value of type int32_t.
*/
int32_t GetInt32() const;
/**
* Get value of type int64_t.
*
* @return Integer value of type int64_t.
*/
int64_t GetInt64() const;
/**
* Get value of type float.
*
* @return Integer value of type float.
*/
float GetFloat() const;
/**
* Get value of type double.
*
* @return Value of type double.
*/
double GetDouble() const;
/**
* Get value of type GUID.
*
* @return Value of type Guid.
*/
Guid GetGuid() const;
/**
* Get value of type Date.
*
* @return Value of type Date.
*/
Date GetDate() const;
/**
* Get value of type Timestamp.
*
* @return Value of type Timestamp.
*/
Timestamp GetTimestamp() const;
/**
* Get value of type Time.
*
* @return Value of type Timestamp.
*/
Time GetTime() const;
/**
* Get value of type Decimal.
*
* @param val Result is placed here.
*/
void GetDecimal(common::Decimal& val) const;
/**
* Get raw data.
*
* @return Buffer data.
*/
const void* GetData() const;
/**
* Get result data length.
*
* @return Data length pointer.
*/
const SqlLen* GetResLen() const;
/**
* Get raw data.
*
* @return Buffer data.
*/
void* GetData();
/**
* Get result data length.
*
* @return Data length pointer.
*/
SqlLen* GetResLen();
/**
* Get buffer size in bytes.
*
* @return Buffer size.
*/
SqlLen GetSize() const
{
return buflen;
}
/**
* Check if the data is going to be provided at execution.
*
* @return True if the data is going to be provided
* at execution.
*/
bool IsDataAtExec() const;
/**
* Get size of the data that is going to be provided at
* execution.
*
* @return Size of the data that is going to be provided
* at execution.
*/
SqlLen GetDataAtExecSize() const;
/**
* Get single element size.
*
* @return Size of the single element.
*/
SqlLen GetElementSize() const;
/**
* Get size of the input buffer.
*
* @return Input buffer size, or zero if the data is going
* to be provided at execution.
*/
SqlLen GetInputSize() const;
/**
* Get buffer type.
*
* @return Buffer type.
*/
type_traits::OdbcNativeType::Type GetType() const
{
return type;
}
private:
/**
* Put value of numeric type in the buffer.
*
* @param value Numeric value to put.
* @return Conversion result.
*/
template<typename T>
ConversionResult::Type PutNum(T value);
/**
* Put numeric value to numeric buffer.
*
* @param value Numeric value.
* @return Conversion result.
*/
template<typename Tbuf, typename Tin>
ConversionResult::Type PutNumToNumBuffer(Tin value);
/**
* Put value to string buffer.
*
* @param value Value that can be converted to string.
* @return Conversion result.
*/
template<typename CharT, typename Tin>
ConversionResult::Type PutValToStrBuffer(const Tin& value);
/**
* Put value to string buffer.
* Specialisation for int8_t.
* @param value Value that can be converted to string.
* @return Conversion result.
*/
template<typename CharT>
ConversionResult::Type PutValToStrBuffer(const int8_t & value);
/**
* Put string to string buffer.
*
* @param value String value.
* @param written Number of characters written.
* @return Conversion result.
*/
template<typename OutCharT, typename InCharT>
ConversionResult::Type PutStrToStrBuffer(const std::basic_string<InCharT>& value, int32_t& written);
/**
* Put raw data to any buffer.
*
* @param data Data pointer.
* @param len Data length.
* @param written Number of characters written.
* @return Conversion result.
*/
ConversionResult::Type PutRawDataToBuffer(void *data, size_t len, int32_t& written);
/**
* Get int of type T.
*
* @return Integer value of specified type.
*/
template<typename T>
T GetNum() const;
/**
* Apply buffer offset to pointer.
* Adds offset to pointer if offset pointer is not null.
* @param ptr Pointer.
* @param elemSize Element size.
* @return Pointer with applied offset.
*/
template<typename T>
T* ApplyOffset(T* ptr, size_t elemSize) const;
/** Underlying data type. */
type_traits::OdbcNativeType::Type type;
/** Buffer pointer. */
void* buffer;
/** Buffer length. */
SqlLen buflen;
/** Result length. */
SqlLen* reslen;
/** Current byte offset */
int byteOffset;
/** Current element offset. */
SqlUlen elementOffset;
};
/** Column binging map type alias. */
typedef std::map<uint16_t, ApplicationDataBuffer> ColumnBindingMap;
}
}
}
#endif //_IGNITE_ODBC_APP_APPLICATION_DATA_BUFFER