blob: 37c91b470e4cf99ac62807156581f54f4c70d5a8 [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_STATEMENT
#define _IGNITE_ODBC_STATEMENT
#include <stdint.h>
#include <map>
#include <memory>
#include "ignite/odbc/meta/column_meta.h"
#include "ignite/odbc/query/query.h"
#include "ignite/odbc/app/application_data_buffer.h"
#include "ignite/odbc/app/parameter_set.h"
#include "ignite/odbc/diagnostic/diagnosable_adapter.h"
#include "ignite/odbc/common_types.h"
#include "sql/sql_set_streaming_command.h"
namespace ignite
{
namespace odbc
{
class Connection;
/**
* SQL-statement abstraction. Holds SQL query user buffers data and
* call result.
*/
class Statement : public diagnostic::DiagnosableAdapter
{
friend class Connection;
public:
/**
* Destructor.
*/
~Statement();
/**
* Bind result column to data buffer provided by application
*
* @param columnIdx Column index.
* @param targetType Type of target buffer.
* @param targetValue Pointer to target buffer.
* @param bufferLength Length of target buffer.
* @param strLengthOrIndicator Pointer to the length/indicator buffer.
*/
void BindColumn(uint16_t columnIdx, int16_t targetType, void* targetValue, SqlLen bufferLength, SqlLen* strLengthOrIndicator);
/**
* Set column binding offset pointer.
*
* @param ptr Column binding offset pointer.
*/
void SetColumnBindOffsetPtr(int* ptr);
/**
* Get column binding offset pointer.
*
* @return Column binding offset pointer.
*/
int* GetColumnBindOffsetPtr();
/**
* Get number of columns in the result set.
*
* @return Columns number.
*/
int32_t GetColumnNumber();
/**
* Bind parameter.
*
* @param paramIdx Parameter index.
* @param ioType Type of the parameter (input/output).
* @param bufferType The data type of the parameter.
* @param paramSqlType The SQL data type of the parameter.
* @param columnSize The size of the column or expression of the corresponding parameter marker.
* @param decDigits The decimal digits of the column or expression of the corresponding parameter marker.
* @param buffer A pointer to a buffer for the parameter's data.
* @param bufferLen Length of the ParameterValuePtr buffer in bytes.
* @param resLen A pointer to a buffer for the parameter's length.
*/
void BindParameter(uint16_t paramIdx, int16_t ioType, int16_t bufferType, int16_t paramSqlType,
SqlUlen columnSize, int16_t decDigits, void* buffer, SqlLen bufferLen, SqlLen* resLen);
/**
* Set statement attribute.
*
* @param attr Attribute type.
* @param value Value pointer.
* @param valueLen Value length.
*/
void SetAttribute(int attr, void* value, SQLINTEGER valueLen);
/**
* Get statement attribute.
*
* @param attr Attribute type.
* @param buf Buffer for value.
* @param bufLen Buffer length.
* @param valueLen Resulting value length.
*/
void GetAttribute(int attr, void* buf, SQLINTEGER bufLen, SQLINTEGER *valueLen);
/**
* Get number parameters required by the prepared statement.
*
* @param paramNum Number of parameters.
*/
void GetParametersNumber(uint16_t& paramNum);
/**
* Set parameter binding offset pointer.
*
* @param ptr Parameter binding offset pointer.
*/
void SetParamBindOffsetPtr(int* ptr);
/**
* Get value of the column in the result set.
*
* @param columnIdx Column index.
* @param buffer Buffer to put column data to.
*/
void GetColumnData(uint16_t columnIdx, app::ApplicationDataBuffer& buffer);
/**
* Prepare SQL query.
*
* @param query SQL query.
*/
void PrepareSqlQuery(const std::string& query);
/**
* Execute SQL query.
*
* @param query SQL query.
*/
void ExecuteSqlQuery(const std::string& query);
/**
* Execute SQL query.
*/
void ExecuteSqlQuery();
/**
* Get columns metadata.
*
* @param schema Schema search pattern.
* @param table Table search pattern.
* @param column Column search pattern.
*/
void ExecuteGetColumnsMetaQuery(const std::string& schema,
const std::string& table, const std::string& column);
/**
* Get tables metadata.
*
* @param catalog Catalog search pattern.
* @param schema Schema search pattern.
* @param table Table search pattern.
* @param tableType Table type search pattern.
*/
void ExecuteGetTablesMetaQuery(const std::string& catalog,
const std::string& schema, const std::string& table,
const std::string& tableType);
/**
* Get foreign keys.
*
* @param primaryCatalog Primary key catalog name.
* @param primarySchema Primary key schema name.
* @param primaryTable Primary key table name.
* @param foreignCatalog Foreign key catalog name.
* @param foreignSchema Foreign key schema name.
* @param foreignTable Foreign key table name.
*/
void ExecuteGetForeignKeysQuery(const std::string& primaryCatalog,
const std::string& primarySchema, const std::string& primaryTable,
const std::string& foreignCatalog, const std::string& foreignSchema,
const std::string& foreignTable);
/**
* Get primary keys.
*
* @param catalog Catalog name.
* @param schema Schema name.
* @param table Table name.
*/
void ExecuteGetPrimaryKeysQuery(const std::string& catalog,
const std::string& schema, const std::string& table);
/**
* Get special columns.
*
* @param type Special column type.
* @param catalog Catalog name.
* @param schema Schema name.
* @param table Table name.
* @param scope Minimum required scope of the rowid.
* @param type Determines whether to return special columns that
* can have a NULL value.
*/
void ExecuteSpecialColumnsQuery(int16_t type,
const std::string& catalog, const std::string& schema,
const std::string& table, int16_t scope, int16_t nullable);
/**
* Get type info.
*
* @param sqlType SQL type for which to return info or SQL_ALL_TYPES.
*/
void ExecuteGetTypeInfoQuery(int16_t sqlType);
/**
* Free resources
* @param option indicates what needs to be freed
*/
void FreeResources(int16_t option);
/**
* Close statement.
*/
void Close();
/**
* Fetch query result row with offset
* @param orientation Fetch type
* @param offset Fetch offset
*/
void FetchScroll(int16_t orientation, int64_t offset);
/**
* Fetch query result row.
*/
void FetchRow();
/**
* Get column metadata.
*
* @return Column metadata.
*/
const meta::ColumnMetaVector* GetMeta();
/**
* Check if data is available.
*
* @return True if data is available.
*/
bool DataAvailable() const;
/**
* More results.
*
* Move to next result set or affected rows number.
*/
void MoreResults();
/**
* Get column attribute.
*
* @param colIdx Column index.
* @param attrId Attribute ID.
* @param strbuf Buffer for string attribute value.
* @param buflen String buffer size.
* @param reslen Buffer to put resulting string length to.
* @param numbuf Numeric value buffer.
*/
void GetColumnAttribute(uint16_t colIdx, uint16_t attrId, char* strbuf,
int16_t buflen, int16_t* reslen, SqlLen* numbuf);
/**
* Get number of rows affected by the statement.
*
* @return Number of rows affected by the statement.
*/
int64_t AffectedRows();
/**
* Set rows fetched buffer pointer.
*
* @param ptr Rows fetched buffer pointer.
*/
void SetRowsFetchedPtr(SQLINTEGER* ptr);
/**
* Get rows fetched buffer pointer.
*
* @return Rows fetched buffer pointer.
*/
SQLINTEGER* GetRowsFetchedPtr();
/**
* Set row statuses array pointer.
*
* @param ptr Row statuses array pointer.
*/
void SetRowStatusesPtr(SQLUSMALLINT* ptr);
/**
* Get row statuses array pointer.
*
* @return Row statuses array pointer.
*/
SQLUSMALLINT* GetRowStatusesPtr();
/**
* Select next parameter data for which is required.
*
* @param paramPtr Pointer to param id stored here.
*/
void SelectParam(void** paramPtr);
/**
* Puts data for previously selected parameter or column.
*
* @param data Data.
* @param len Data length.
*/
void PutData(void* data, SqlLen len);
/**
* Get type info of the parameter of the prepared statement.
*
* @param paramNum - Parameter index.
* @param dataType - Data type.
* @param paramSize - Size of the parameter.
* @param decimalDigits - Decimal digits.
* @param nullable - Nullability flag.
*/
void DescribeParam(int16_t paramNum, int16_t* dataType,
SqlUlen* paramSize, int16_t* decimalDigits, int16_t* nullable);
private:
IGNITE_NO_COPY_ASSIGNMENT(Statement);
/**
* Bind result column to specified data buffer.
*
* @param columnIdx Column index.
* @param buffer Buffer to put column data to.
*/
void SafeBindColumn(uint16_t columnIdx, const app::ApplicationDataBuffer& buffer);
/**
* Unbind specified column buffer.
*
* @param columnIdx Column index.
*/
void SafeUnbindColumn(uint16_t columnIdx);
/**
* Unbind all column buffers.
*/
void SafeUnbindAllColumns();
/**
* Bind result column to data buffer provided by application
*
* @param columnIdx Column index.
* @param targetType Type of target buffer.
* @param targetValue Pointer to target buffer.
* @param bufferLength Length of target buffer.
* @param strLengthOrIndicator Pointer to the length/indicator buffer.
* @return Operation result.
*/
SqlResult::Type InternalBindColumn(uint16_t columnIdx, int16_t targetType, void* targetValue, SqlLen bufferLength, SqlLen* strLengthOrIndicator);
/**
* Bind parameter.
*
* @param paramIdx Parameter index.
* @param ioType Type of the parameter (input/output).
* @param bufferType The data type of the parameter.
* @param paramSqlType The SQL data type of the parameter.
* @param columnSize The size of the column or expression of the corresponding parameter marker.
* @param decDigits The decimal digits of the column or expression of the corresponding parameter marker.
* @param buffer A pointer to a buffer for the parameter's data.
* @param bufferLen Length of the ParameterValuePtr buffer in bytes.
* @param resLen A pointer to a buffer for the parameter's length.
* @return Operation result.
*/
SqlResult::Type InternalBindParameter(uint16_t paramIdx, int16_t ioType, int16_t bufferType, int16_t paramSqlType,
SqlUlen columnSize, int16_t decDigits, void* buffer, SqlLen bufferLen, SqlLen* resLen);
/**
* Set statement attribute.
* Internal call.
*
* @param attr Attribute type.
* @param value Value pointer.
* @param valueLen Value length.
* @return Operation result.
*/
SqlResult::Type InternalSetAttribute(int attr, void* value, SQLINTEGER valueLen);
/**
* Get statement attribute.
* Internal call.
*
* @param attr Attribute type.
* @param buf Buffer for value.
* @param bufLen Buffer length.
* @param valueLen Resulting value length.
* @return Operation result.
*/
SqlResult::Type InternalGetAttribute(int attr, void* buf, SQLINTEGER bufLen, SQLINTEGER* valueLen);
/**
* Get number parameters required by the prepared statement.
*
* @param paramNum Number of parameters.
*/
SqlResult::Type InternalGetParametersNumber(uint16_t& paramNum);
/**
* Get value of the column in the result set.
*
* @param columnIdx Column index.
* @param buffer Buffer to put column data to.
* @return Operation result.
*/
SqlResult::Type InternalGetColumnData(uint16_t columnIdx, app::ApplicationDataBuffer& buffer);
/**
* Free resources
* @param option indicates what needs to be freed
* @return Operation result.
*/
SqlResult::Type InternalFreeResources(int16_t option);
/**
* Close statement.
* Internal call.
*
* @return Operation result.
*/
SqlResult::Type InternalClose();
/**
* Stop streaming.
*
* @return Operation result.
*/
SqlResult::Type StopStreaming();
/**
* Process internal SQL command.
*
* @param query SQL query.
* @return Operation result.
*/
SqlResult::Type ProcessInternalCommand(const std::string& query);
/**
* Check if the streaming is active currently.
*
* @return @c true, if the streaming is active.
*/
bool IsStreamingActive() const;
/**
* Prepare SQL query.
*
* @param query SQL query.
* @return Operation result.
*/
SqlResult::Type InternalPrepareSqlQuery(const std::string& query);
/**
* Execute SQL query.
*
* @param query SQL query.
* @return Operation result.
*/
SqlResult::Type InternalExecuteSqlQuery(const std::string& query);
/**
* Execute SQL query.
*
* @return Operation result.
*/
SqlResult::Type InternalExecuteSqlQuery();
/**
* Process internal query.
*
* @return Operation result.
*/
SqlResult::Type ProcessInternalQuery();
/**
* Fetch query result row with offset
* @param orientation Fetch type
* @param offset Fetch offset
* @return Operation result.
*/
SqlResult::Type InternalFetchScroll(int16_t orientation, int64_t offset);
/**
* Fetch query result row.
*
* @return Operation result.
*/
SqlResult::Type InternalFetchRow();
/**
* Get number of columns in the result set.
*
* @param res Columns number.
* @return Operation result.
*/
SqlResult::Type InternalGetColumnNumber(int32_t &res);
/**
* Get columns metadata.
*
* @param schema Schema search pattern.
* @param table Table search pattern.
* @param column Column search pattern.
* @return Operation result.
*/
SqlResult::Type InternalExecuteGetColumnsMetaQuery(const std::string& schema,
const std::string& table, const std::string& column);
/**
* Get tables metadata.
*
* @param catalog Catalog search pattern.
* @param schema Schema search pattern.
* @param table Table search pattern.
* @param tableType Table type search pattern.
* @return Operation result.
*/
SqlResult::Type InternalExecuteGetTablesMetaQuery(const std::string& catalog,
const std::string& schema, const std::string& table,
const std::string& tableType);
/**
* Get foreign keys.
*
* @param primaryCatalog Primary key catalog name.
* @param primarySchema Primary key schema name.
* @param primaryTable Primary key table name.
* @param foreignCatalog Foreign key catalog name.
* @param foreignSchema Foreign key schema name.
* @param foreignTable Foreign key table name.
* @return Operation result.
*/
SqlResult::Type InternalExecuteGetForeignKeysQuery(const std::string& primaryCatalog,
const std::string& primarySchema, const std::string& primaryTable,
const std::string& foreignCatalog, const std::string& foreignSchema,
const std::string& foreignTable);
/**
* Get primary keys.
*
* @param catalog Catalog name.
* @param schema Schema name.
* @param table Table name.
* @return Operation result.
*/
SqlResult::Type InternalExecuteGetPrimaryKeysQuery(const std::string& catalog,
const std::string& schema, const std::string& table);
/**
* Get special columns.
*
* @param type Special column type.
* @param catalog Catalog name.
* @param schema Schema name.
* @param table Table name.
* @param scope Minimum required scope of the rowid.
* @param nullable Determines whether to return special columns
* that can have a NULL value.
* @return Operation result.
*/
SqlResult::Type InternalExecuteSpecialColumnsQuery(int16_t type,
const std::string& catalog, const std::string& schema,
const std::string& table, int16_t scope, int16_t nullable);
/**
* Get type info.
*
* @param sqlType SQL type for which to return info or SQL_ALL_TYPES.
* @return Operation result.
*/
SqlResult::Type InternalExecuteGetTypeInfoQuery(int16_t sqlType);
/**
* Next results.
*
* Move to next result set or affected rows number.
*
* @return Operation result.
*/
SqlResult::Type InternalMoreResults();
/**
* Get column attribute.
*
* @param colIdx Column index.
* @param attrId Attribute ID.
* @param strbuf Buffer for string attribute value.
* @param buflen String buffer size.
* @param reslen Buffer to put resulting string length to.
* @param numbuf Numeric value buffer.
* @return Operation result.
*/
SqlResult::Type InternalGetColumnAttribute(uint16_t colIdx, uint16_t attrId,
char* strbuf, int16_t buflen, int16_t* reslen, SqlLen* numbuf);
/**
* Get number of rows affected by the statement.
*
* @param rowCnt Number of rows affected by the statement.
* @return Operation result.
*/
SqlResult::Type InternalAffectedRows(int64_t& rowCnt);
/**
* Select next parameter data for which is required.
*
* @param paramPtr Pointer to param id stored here.
* @return Operation result.
*/
SqlResult::Type InternalSelectParam(void** paramPtr);
/**
* Puts data for previously selected parameter or column.
*
* @param data Data.
* @param len Data length.
* @return Operation result.
*/
SqlResult::Type InternalPutData(void* data, SqlLen len);
/**
* Get type info of the parameter of the prepared statement.
*
* @param paramNum - Parameter index.
* @param dataType - Data type.
* @param paramSize - Size of the parameter.
* @param decimalDigits - Decimal digits.
* @param nullable - Nullability flag.
* @return Operation result.
*/
SqlResult::Type InternalDescribeParam(int16_t paramNum, int16_t* dataType,
SqlUlen* paramSize, int16_t* decimalDigits, int16_t* nullable);
/**
* Make request to data source to update parameters metadata.
*/
SqlResult::Type UpdateParamsMeta();
/**
* Convert SQLRESULT to SQL_ROW_RESULT.
*
* @return Operation result.
*/
uint16_t SqlResultToRowResult(SqlResult::Type value);
/**
* Constructor.
* Called by friend classes.
*
* @param parent Connection associated with the statement.
*/
Statement(Connection& parent);
/** Connection associated with the statement. */
Connection& connection;
/** Column bindings. */
app::ColumnBindingMap columnBindings;
/** Underlying query. */
std::auto_ptr<query::Query> currentQuery;
/** Buffer to store number of rows fetched by the last fetch. */
SQLINTEGER* rowsFetched;
/** Array to store statuses of rows fetched by the last fetch. */
SQLUSMALLINT* rowStatuses;
/** Offset added to pointers to change binding of column data. */
int* columnBindOffset;
/** Row array size. */
SqlUlen rowArraySize;
/** Parameters. */
app::ParameterSet parameters;
/** Query timeout in seconds. */
int32_t timeout;
};
}
}
#endif //_IGNITE_ODBC_STATEMENT