http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/meta/primary_key_meta.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/meta/primary_key_meta.h b/modules/platforms/cpp/odbc/include/ignite/odbc/meta/primary_key_meta.h new file mode 100644 index 0000000..a2f5318 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/meta/primary_key_meta.h @@ -0,0 +1,188 @@ +/* + * 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_META_PRIMARY_KEY_META +#define _IGNITE_ODBC_META_PRIMARY_KEY_META + +#include <stdint.h> +#include <string> + +#include "ignite/impl/binary/binary_reader_impl.h" + +#include "ignite/odbc/utility.h" + +namespace ignite +{ + namespace odbc + { + namespace meta + { + /** + * Primary key metadata. + */ + class PrimaryKeyMeta + { + public: + /** + * Default constructor. + */ + PrimaryKeyMeta() + { + // No-op. + } + + /** + * Constructor. + * + * @param catalog Catalog name. + * @param schema Schema name. + * @param table Table name. + * @param column Column name. + * @param keySeq Column sequence number in key (starting with 1). + * @param keyName Key name. + */ + PrimaryKeyMeta(const std::string& catalog, const std::string& schema, + const std::string& table, const std::string& column, int16_t keySeq, + const std::string& keyName) : + catalog(catalog), + schema(schema), + table(table), + column(column), + keySeq(keySeq), + keyName(keyName) + { + // No-op. + } + + /** + * Destructor. + */ + ~PrimaryKeyMeta() + { + // No-op. + } + + /** + * Copy constructor. + */ + PrimaryKeyMeta(const PrimaryKeyMeta& other) : + catalog(other.catalog), + schema(other.schema), + table(other.table), + column(other.column), + keySeq(other.keySeq), + keyName(other.keyName) + { + // No-op. + } + + /** + * Copy operator. + */ + PrimaryKeyMeta& operator=(const PrimaryKeyMeta& other) + { + catalog = other.catalog; + schema = other.schema; + table = other.table; + column = other.column; + keySeq = other.keySeq; + keyName = other.keyName; + + return *this; + } + + /** + * Get catalog name. + * @return Catalog name. + */ + const std::string& GetCatalogName() const + { + return catalog; + } + + /** + * Get schema name. + * @return Schema name. + */ + const std::string& GetSchemaName() const + { + return schema; + } + + /** + * Get table name. + * @return Table name. + */ + const std::string& GetTableName() const + { + return table; + } + + /** + * Get column name. + * @return Column name. + */ + const std::string& GetColumnName() const + { + return table; + } + + /** + * Get column sequence number in key. + * @return Sequence number in key. + */ + int16_t GetKeySeq() const + { + return keySeq; + } + + /** + * Get key name. + * @return Key name. + */ + const std::string& GetKeyName() const + { + return keyName; + } + + private: + /** Catalog name. */ + std::string catalog; + + /** Schema name. */ + std::string schema; + + /** Table name. */ + std::string table; + + /** Collumn name. */ + std::string column; + + /** Column sequence number in key. */ + int16_t keySeq; + + /** Key name. */ + std::string keyName; + }; + + /** Table metadata vector alias. */ + typedef std::vector<PrimaryKeyMeta> PrimaryKeyMetaVector; + } + } +} + +#endif //_IGNITE_ODBC_META_PRIMARY_KEY_META \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/meta/table_meta.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/meta/table_meta.h b/modules/platforms/cpp/odbc/include/ignite/odbc/meta/table_meta.h new file mode 100644 index 0000000..b02d43c --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/meta/table_meta.h @@ -0,0 +1,166 @@ +/* + * 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_META_TABLE_META +#define _IGNITE_ODBC_META_TABLE_META + +#include <stdint.h> +#include <string> + +#include "ignite/impl/binary/binary_reader_impl.h" + +#include "ignite/odbc/utility.h" + +namespace ignite +{ + namespace odbc + { + namespace meta + { + /** + * Table metadata. + */ + class TableMeta + { + public: + /** + * Default constructor. + */ + TableMeta() + { + // No-op. + } + + /** + * Constructor. + * + * @param catalogName Catalog name. + * @param schemaName Schema name. + * @param tableName Table name. + * @param tableType Table type. + */ + TableMeta(const std::string& catalogName, const std::string& schemaName, + const std::string& tableName, const std::string& tableType) : + catalogName(catalogName), schemaName(schemaName), tableName(tableName), + tableType(tableType) + { + // No-op. + } + + /** + * Destructor. + */ + ~TableMeta() + { + // No-op. + } + + /** + * Copy constructor. + */ + TableMeta(const TableMeta& other) : + catalogName(other.catalogName), + schemaName(other.schemaName), + tableName(other.tableName), + tableType(other.tableType) + { + // No-op. + } + + /** + * Copy operator. + */ + TableMeta& operator=(const TableMeta& other) + { + catalogName = other.catalogName; + schemaName = other.schemaName; + tableName = other.tableName; + tableType = other.tableType; + + return *this; + } + + /** + * Read using reader. + * @param reader Reader. + */ + void Read(ignite::impl::binary::BinaryReaderImpl& reader); + + /** + * Get catalog name. + * @return Catalog name. + */ + const std::string& GetCatalogName() const + { + return catalogName; + } + + /** + * Get schema name. + * @return Schema name. + */ + const std::string& GetSchemaName() const + { + return schemaName; + } + + /** + * Get table name. + * @return Table name. + */ + const std::string& GetTableName() const + { + return tableName; + } + + /** + * Get table type. + * @return Table type. + */ + const std::string& GetTableType() const + { + return tableType; + } + + private: + /** Catalog name. */ + std::string catalogName; + + /** Schema name. */ + std::string schemaName; + + /** Table name. */ + std::string tableName; + + /** Table type. */ + std::string tableType; + }; + + /** Table metadata vector alias. */ + typedef std::vector<TableMeta> TableMetaVector; + + /** + * Read tables metadata collection. + * @param reader Reader. + * @param meta Collection. + */ + void ReadTableMetaVector(ignite::impl::binary::BinaryReaderImpl& reader, TableMetaVector& meta); + } + } +} + +#endif //_IGNITE_ODBC_META_TABLE_META \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/parser.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/parser.h b/modules/platforms/cpp/odbc/include/ignite/odbc/parser.h new file mode 100644 index 0000000..c19e08c --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/parser.h @@ -0,0 +1,137 @@ +/* + * 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_PARSER +#define _IGNITE_ODBC_PARSER + +#include <stdint.h> + +#include <vector> + +#include <ignite/impl/interop/interop_output_stream.h> +#include <ignite/impl/interop/interop_input_stream.h> +#include <ignite/impl/binary/binary_writer_impl.h> +#include <ignite/impl/binary/binary_reader_impl.h> + +#include "ignite/odbc/utility.h" + +namespace ignite +{ + namespace odbc + { + /** + * Message parser. + */ + class Parser + { + public: + /** Default initial size of operational memory. */ + enum { DEFAULT_MEM_ALLOCATION = 4096 }; + + /** ODBC communication protocol version. */ + enum { PROTOCOL_VERSION = 1 }; + + /** + * Constructor. + */ + Parser(int32_t cap = DEFAULT_MEM_ALLOCATION) : inMem(cap), outMem(cap), outStream(&outMem) + { + //No-op. + } + + /** + * Destructor. + */ + ~Parser() + { + //No-op. + } + + /** + * Encode message and place encoded data in buffer. + * + * @param msg Message to encode. + * @param buf Data buffer. + */ + template<typename MsgT> + void Encode(const MsgT& msg, std::vector<int8_t>& buf) + { + using namespace ignite::impl::binary; + + ResetState(); + + BinaryWriterImpl writer(&outStream, 0); + + msg.Write(writer); + + buf.resize(outStream.Position()); + + memcpy(&buf[0], outMem.Data(), outStream.Position()); + } + + /** + * Decode message from data in buffer. + * + * @param msg Message to decode. + * @param buf Data buffer. + * @note Can be optimized after InteropMemory refactoring. + */ + template<typename MsgT> + void Decode(MsgT& msg, const std::vector<int8_t>& buf) + { + using namespace ignite::impl::binary; + + if (inMem.Capacity() < static_cast<int32_t>(buf.size())) + inMem.Reallocate(static_cast<int32_t>(buf.size())); + + memcpy(inMem.Data(), buf.data(), buf.size()); + + inMem.Length(static_cast<int32_t>(buf.size())); + + ignite::impl::interop::InteropInputStream inStream(&inMem); + + BinaryReaderImpl reader(&inStream); + + msg.Read(reader); + } + + private: + IGNITE_NO_COPY_ASSIGNMENT(Parser); + + /** + * Reset internal state of the parser. + */ + void ResetState() + { + outMem.Length(0); + + outStream.Position(0); + } + + /** Input operational memory. */ + ignite::impl::interop::InteropUnpooledMemory inMem; + + /** Output operational memory. */ + ignite::impl::interop::InteropUnpooledMemory outMem; + + /** Output stream. */ + ignite::impl::interop::InteropOutputStream outStream; + }; + } +} + +#endif //_IGNITE_ODBC_PARSER \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/column_metadata_query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/column_metadata_query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/column_metadata_query.h new file mode 100644 index 0000000..85a9474 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/column_metadata_query.h @@ -0,0 +1,146 @@ +/* + * 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_QUERY_COLUMN_METADATA_QUERY +#define _IGNITE_ODBC_QUERY_COLUMN_METADATA_QUERY + +#include "ignite/odbc/query/query.h" +#include "ignite/odbc/meta/column_meta.h" + +namespace ignite +{ + namespace odbc + { + /** Connection forward-declaration. */ + class Connection; + + namespace query + { + /** + * Query. + */ + class ColumnMetadataQuery : public Query + { + public: + /** + * Constructor. + * + * @param diag Diagnostics collector. + * @param connection Associated connection. + * @param schema Schema search pattern. + * @param table Table search pattern. + * @param column Column search pattern. + */ + ColumnMetadataQuery(diagnostic::Diagnosable& diag, + Connection& connection, const std::string& schema, + const std::string& table, const std::string& column); + + /** + * Destructor. + */ + virtual ~ColumnMetadataQuery(); + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const; + + /** + * Fetch next result row to application buffers. + * + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings); + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close(); + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const; + + private: + IGNITE_NO_COPY_ASSIGNMENT(ColumnMetadataQuery); + + /** + * Make get columns metadata requets and use response to set internal state. + * + * @return Operation result. + */ + SqlResult MakeRequestGetColumnsMeta(); + + /** Connection associated with the statement. */ + Connection& connection; + + /** Schema search pattern. */ + std::string schema; + + /** Table search pattern. */ + std::string table; + + /** Column search pattern. */ + std::string column; + + /** Query executed. */ + bool executed; + + /** Fetched metadata. */ + meta::ColumnMetaVector meta; + + /** Metadata cursor. */ + meta::ColumnMetaVector::iterator cursor; + + /** Columns metadata. */ + meta::ColumnMetaVector columnsMeta; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_COLUMN_METADATA_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/data_query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/data_query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/data_query.h new file mode 100644 index 0000000..3db3b46 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/data_query.h @@ -0,0 +1,152 @@ +/* + * 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_QUERY_DATA_QUERY +#define _IGNITE_ODBC_QUERY_DATA_QUERY + +#include "ignite/odbc/query/query.h" +#include "ignite/odbc/app/parameter.h" +#include "ignite/odbc/cursor.h" + +namespace ignite +{ + namespace odbc + { + /** Connection forward-declaration. */ + class Connection; + + namespace query + { + /** + * Query. + */ + class DataQuery : public Query + { + public: + /** + * Constructor. + * + * @param diag Diagnostics collector. + * @param connection Associated connection. + * @param sql SQL query string. + * @param params SQL params. + */ + DataQuery(diagnostic::Diagnosable& diag, Connection& connection, + const std::string& sql, const app::ParameterBindingMap& params); + + /** + * Destructor. + */ + virtual ~DataQuery(); + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const; + + /** + * Fetch next result row to application buffers. + * + * @param columnBindings Application buffers to put data to. + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings); + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close(); + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const; + + private: + IGNITE_NO_COPY_ASSIGNMENT(DataQuery); + + /** + * Make query execute request and use response to set internal + * state. + * + * @return True on success. + */ + SqlResult MakeRequestExecute(); + + /** + * Make query close request. + * + * @return True on success. + */ + SqlResult MakeRequestClose(); + + /** + * Make data fetch request and use response to set internal state. + * + * @return True on success. + */ + SqlResult MakeRequestFetch(); + + /** Connection associated with the statement. */ + Connection& connection; + + /** SQL Query. */ + std::string sql; + + /** Parameter bindings. */ + const app::ParameterBindingMap& params; + + /** Columns metadata. */ + meta::ColumnMetaVector resultMeta; + + /** Cursor. */ + std::auto_ptr<Cursor> cursor; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_DATA_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/foreign_keys_query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/foreign_keys_query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/foreign_keys_query.h new file mode 100644 index 0000000..0fb1e5f --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/foreign_keys_query.h @@ -0,0 +1,143 @@ +/* + * 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_QUERY_FOREIGN_KEYS_QUERY +#define _IGNITE_ODBC_QUERY_FOREIGN_KEYS_QUERY + +#include "ignite/odbc/connection.h" +#include "ignite/odbc/query/query.h" + +namespace ignite +{ + namespace odbc + { + namespace query + { + /** + * Foreign keys query. + */ + class ForeignKeysQuery : public Query + { + public: + /** + * Constructor. + * + * @param diag Diagnostics collector. + * @param connection Statement-associated connection. + * @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. + */ + ForeignKeysQuery(diagnostic::Diagnosable& diag, Connection& connection, + const std::string& primaryCatalog, const std::string& primarySchema, + const std::string& primaryTable, const std::string& foreignCatalog, + const std::string& foreignSchema, const std::string& foreignTable); + + /** + * Destructor. + */ + virtual ~ForeignKeysQuery(); + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const; + + /** + * Fetch next result row to application buffers. + * + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings); + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close(); + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const; + + private: + IGNITE_NO_COPY_ASSIGNMENT(ForeignKeysQuery); + + /** Connection associated with the statement. */ + Connection& connection; + + /** Primary key catalog name. */ + std::string primaryCatalog; + + /** Primary key schema name. */ + std::string primarySchema; + + /** Primary key table name. */ + std::string primaryTable; + + /** Foreign key catalog name. */ + std::string foreignCatalog; + + /** Foreign key schema name. */ + std::string foreignSchema; + + /** Foreign key table name. */ + std::string foreignTable; + + /** Query executed. */ + bool executed; + + /** Columns metadata. */ + meta::ColumnMetaVector columnsMeta; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_FOREIGN_KEYS_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/primary_keys_query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/primary_keys_query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/primary_keys_query.h new file mode 100644 index 0000000..5cb7b6e --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/primary_keys_query.h @@ -0,0 +1,137 @@ +/* + * 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_QUERY_PRIMARY_KEYS_QUERY +#define _IGNITE_ODBC_QUERY_PRIMARY_KEYS_QUERY + +#include "ignite/odbc/connection.h" +#include "ignite/odbc/query/query.h" +#include "ignite/odbc/meta/primary_key_meta.h" + +namespace ignite +{ + namespace odbc + { + namespace query + { + /** + * Primary keys query. + */ + class PrimaryKeysQuery : public Query + { + public: + /** + * Constructor. + * + * @param diag Diagnostics collector. + * @param connection Statement-associated connection. + * @param catalog Catalog name. + * @param schema Schema name. + * @param table Table name. + */ + PrimaryKeysQuery(diagnostic::Diagnosable& diag, + Connection& connection, const std::string& catalog, + const std::string& schema, const std::string& table); + + /** + * Destructor. + */ + virtual ~PrimaryKeysQuery(); + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const; + + /** + * Fetch next result row to application buffers. + * + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings); + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close(); + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const; + + private: + IGNITE_NO_COPY_ASSIGNMENT(PrimaryKeysQuery); + + /** Connection associated with the statement. */ + Connection& connection; + + /** Catalog name. */ + std::string catalog; + + /** Schema name. */ + std::string schema; + + /** Table name. */ + std::string table; + + /** Query executed. */ + bool executed; + + /** Columns metadata. */ + meta::ColumnMetaVector columnsMeta; + + /** Primary keys metadata. */ + meta::PrimaryKeyMetaVector meta; + + /** Resultset cursor. */ + meta::PrimaryKeyMetaVector::iterator cursor; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_PRIMARY_KEYS_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/query.h new file mode 100644 index 0000000..1b3512d --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/query.h @@ -0,0 +1,119 @@ +/* + * 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_QUERY_QUERY +#define _IGNITE_ODBC_QUERY_QUERY + +#include <stdint.h> + +#include <map> + +#include "ignite/odbc/diagnostic/diagnosable.h" +#include "ignite/odbc/meta/column_meta.h" +#include "ignite/odbc/common_types.h" +#include "ignite/odbc/row.h" + +namespace ignite +{ + namespace odbc + { + namespace query + { + /** + * Query. + */ + class Query + { + public: + /** + * Destructor. + */ + virtual ~Query() + { + // No-op. + } + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute() = 0; + + /** + * Fetch next result row to application buffers. + * + * @param columnBindings Application buffers to put data to. + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings) = 0; + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer) = 0; + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close() = 0; + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const = 0; + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const = 0; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const = 0; + + protected: + /** + * Constructor. + */ + Query(diagnostic::Diagnosable& diag) : + diag(diag) + { + // No-op. + } + + /** Diagnostics collector. */ + diagnostic::Diagnosable& diag; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/special_columns_query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/special_columns_query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/special_columns_query.h new file mode 100644 index 0000000..1d2f339 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/special_columns_query.h @@ -0,0 +1,142 @@ +/* + * 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_QUERY_SPECIAL_COLUMNS_QUERY +#define _IGNITE_ODBC_QUERY_SPECIAL_COLUMNS_QUERY + +#include "ignite/odbc/query/query.h" + +namespace ignite +{ + namespace odbc + { + namespace query + { + /** + * Special columns query. + */ + class SpecialColumnsQuery : public Query + { + public: + + /** + * Constructor. + * + * @param diag Diagnostics collector. + * @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. + */ + SpecialColumnsQuery(diagnostic::Diagnosable& diag, int16_t type, + const std::string& catalog, const std::string& schema, + const std::string& table, int16_t scope, int16_t nullable); + + /** + * Destructor. + */ + virtual ~SpecialColumnsQuery(); + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute(); + + /** + * Fetch next result row to application buffers. + * + * @param columnBindings Application buffers to put data to. + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings); + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const; + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const; + + private: + IGNITE_NO_COPY_ASSIGNMENT(SpecialColumnsQuery); + + /** Query type. */ + int16_t type; + + /** Catalog name. */ + std::string catalog; + + /** Schema name. */ + std::string schema; + + /** Table name. */ + std::string table; + + /** Minimum required scope of the rowid. */ + int16_t scope; + + /** + * Determines whether to return special columns that can have + * a NULL value. + */ + int16_t nullable; + + /** Query executed. */ + bool executed; + + /** Columns metadata. */ + meta::ColumnMetaVector columnsMeta; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_SPECIAL_COLUMNS_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/table_metadata_query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/table_metadata_query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/table_metadata_query.h new file mode 100644 index 0000000..6322435 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/table_metadata_query.h @@ -0,0 +1,150 @@ +/* + * 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_QUERY_TABLE_METADATA_QUERY +#define _IGNITE_ODBC_QUERY_TABLE_METADATA_QUERY + +#include "ignite/odbc/query/query.h" +#include "ignite/odbc/meta/table_meta.h" + +namespace ignite +{ + namespace odbc + { + /** Connection forward-declaration. */ + class Connection; + + namespace query + { + /** + * Query. + */ + class TableMetadataQuery : public Query + { + public: + /** + * Constructor. + * + * @param diag Diagnostics collector. + * @param connection Associated connection. + * @param catalog Catalog search pattern. + * @param schema Schema search pattern. + * @param table Table search pattern. + * @param tableType Table type search pattern. + */ + TableMetadataQuery(diagnostic::Diagnosable& diag, Connection& connection, + const std::string& catalog, const std::string& schema, + const std::string& table, const std::string& tableType); + + /** + * Destructor. + */ + virtual ~TableMetadataQuery(); + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const; + + /** + * Fetch next result row to application buffers. + * + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings); + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close(); + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const; + + private: + IGNITE_NO_COPY_ASSIGNMENT(TableMetadataQuery); + + /** + * Make get columns metadata requets and use response to set internal state. + * + * @return True on success. + */ + SqlResult MakeRequestGetTablesMeta(); + + /** Connection associated with the statement. */ + Connection& connection; + + /** Catalog search pattern. */ + std::string catalog; + + /** Schema search pattern. */ + std::string schema; + + /** Table search pattern. */ + std::string table; + + /** Table type search pattern. */ + std::string tableType; + + /** Query executed. */ + bool executed; + + /** Fetched metadata. */ + meta::TableMetaVector meta; + + /** Metadata cursor. */ + meta::TableMetaVector::iterator cursor; + + /** Columns metadata. */ + meta::ColumnMetaVector columnsMeta; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_TABLE_METADATA_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/query/type_info_query.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/query/type_info_query.h b/modules/platforms/cpp/odbc/include/ignite/odbc/query/type_info_query.h new file mode 100644 index 0000000..d337d03 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/query/type_info_query.h @@ -0,0 +1,118 @@ +/* + * 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_QUERY_TYPE_INFO_QUERY +#define _IGNITE_ODBC_QUERY_TYPE_INFO_QUERY + +#include "ignite/odbc/query/query.h" + +namespace ignite +{ + namespace odbc + { + namespace query + { + /** + * Type info query. + */ + class TypeInfoQuery : public Query + { + public: + /** + * Constructor. + * + * @param diag Diagnostics collector. + * @param sqlType SQL type. + */ + TypeInfoQuery(diagnostic::Diagnosable& diag, int16_t sqlType); + + /** + * Destructor. + */ + virtual ~TypeInfoQuery(); + + /** + * Execute query. + * + * @return True on success. + */ + virtual SqlResult Execute(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + virtual const meta::ColumnMetaVector& GetMeta() const; + + /** + * Fetch next result row to application buffers. + * + * @return Operation result. + */ + virtual SqlResult FetchNextRow(app::ColumnBindingMap& columnBindings); + + /** + * Get data of the specified column in the result set. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + * @return Operation result. + */ + virtual SqlResult GetColumn(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close query. + * + * @return True on success. + */ + virtual SqlResult Close(); + + /** + * Check if data is available. + * + * @return True if data is available. + */ + virtual bool DataAvailable() const; + + /** + * Get number of rows affected by the statement. + * + * @return Number of rows affected by the statement. + */ + virtual int64_t AffectedRows() const; + + private: + IGNITE_NO_COPY_ASSIGNMENT(TypeInfoQuery); + + /** Columns metadata. */ + meta::ColumnMetaVector columnsMeta; + + /** Executed flag. */ + bool executed; + + /** Requested types. */ + std::vector<int8_t> types; + + /** Query cursor. */ + std::vector<int8_t>::const_iterator cursor; + }; + } + } +} + +#endif //_IGNITE_ODBC_QUERY_TYPE_INFO_QUERY \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/result_page.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/result_page.h b/modules/platforms/cpp/odbc/include/ignite/odbc/result_page.h new file mode 100644 index 0000000..3533229 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/result_page.h @@ -0,0 +1,101 @@ +/* + * 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_RESULT_PAGE +#define _IGNITE_ODBC_RESULT_PAGE + +#include <stdint.h> + +#include <ignite/impl/binary/binary_reader_impl.h> + +#include "ignite/odbc/app/application_data_buffer.h" +#include "ignite/odbc/common_types.h" + +namespace ignite +{ + namespace odbc + { + /** + * Query result page. + */ + class ResultPage + { + enum { DEFAULT_ALLOCATED_MEMORY = 1024 }; + + public: + // Default result page size. + enum { DEFAULT_SIZE = 32 }; + + /** + * Constructor. + */ + ResultPage(); + + /** + * Destructor. + */ + ~ResultPage(); + + /** + * Read result page using provided reader. + * @param reader Reader. + */ + void Read(ignite::impl::binary::BinaryReaderImpl& reader); + + /** + * Get page size. + * @return Page size. + */ + int32_t GetSize() const + { + return size; + } + + /** + * Check if the page is last. + * @return True if the page is last. + */ + bool IsLast() const + { + return last; + } + + /** + * Get page data. + * @return Page data. + */ + ignite::impl::interop::InteropUnpooledMemory& GetData() + { + return data; + } + + private: + IGNITE_NO_COPY_ASSIGNMENT(ResultPage); + + /** Last page flag. */ + bool last; + + /** Page size in rows. */ + int32_t size; + + /** Memory that contains current row page data. */ + ignite::impl::interop::InteropUnpooledMemory data; + }; + } +} + +#endif //_IGNITE_ODBC_RESULT_PAGE \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/row.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/row.h b/modules/platforms/cpp/odbc/include/ignite/odbc/row.h new file mode 100644 index 0000000..888432e --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/row.h @@ -0,0 +1,132 @@ +/* + * 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_ROW +#define _IGNITE_ODBC_ROW + +#include <stdint.h> +#include <vector> + +#include "ignite/odbc/column.h" +#include "ignite/odbc/app/application_data_buffer.h" + + +namespace ignite +{ + namespace odbc + { + /** + * Query result row. + */ + class Row + { + public: + /** + * Constructor. + */ + Row(ignite::impl::interop::InteropUnpooledMemory& pageData); + + /** + * Destructor. + */ + ~Row(); + + /** + * Get row size in columns. + * + * @return Row size. + */ + int32_t GetSize() const + { + return size; + } + + /** + * Read column data and store it in application data buffer. + * + * @param dataBuf Application data buffer. + * @return True on success. + */ + SqlResult ReadColumnToBuffer(uint16_t columnIdx, app::ApplicationDataBuffer& dataBuf); + + /** + * Move to next row. + * + * @return True on success. + */ + bool MoveToNext(); + + private: + IGNITE_NO_COPY_ASSIGNMENT(Row); + + /** + * Reinitialize row state using stream data. + * @note Stream must be positioned at the beginning of the row. + */ + void Reinit(); + + /** + * Get columns by its index. + * + * Column indexing starts at 1. + * + * @note This operation is private because it's unsafe to use: + * It is neccessary to ensure that column is discovered prior + * to calling this method using EnsureColumnDiscovered(). + * + * @param columnIdx Column index. + * @return Reference to specified column. + */ + Column& GetColumn(uint16_t columnIdx) + { + return columns[columnIdx - 1]; + } + + /** + * Ensure that column data is discovered. + * + * @param columnIdx Column index. + * @return True if the column is discovered and false if it can not + * be discovered. + */ + bool EnsureColumnDiscovered(uint16_t columnIdx); + + /** Row position in current page. */ + int32_t rowBeginPos; + + /** Current position in row. */ + int32_t pos; + + /** Row size in columns. */ + int32_t size; + + /** Memory that contains current row data. */ + ignite::impl::interop::InteropUnpooledMemory& pageData; + + /** Page data input stream. */ + ignite::impl::interop::InteropInputStream stream; + + /** Data reader. */ + ignite::impl::binary::BinaryReaderImpl reader; + + /** Columns. */ + std::vector<Column> columns; + }; + } +} + +#endif //_IGNITE_ODBC_ROW \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h b/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h new file mode 100644 index 0000000..97d586f --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/statement.h @@ -0,0 +1,525 @@ +/* + * 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/impl/interop/interop_output_stream.h> +#include <ignite/impl/interop/interop_input_stream.h> +#include <ignite/impl/binary/binary_writer_impl.h> + +#include "ignite/odbc/meta/column_meta.h" +#include "ignite/odbc/meta/table_meta.h" +#include "ignite/odbc/query/query.h" +#include "ignite/odbc/app/application_data_buffer.h" +#include "ignite/odbc/app/parameter.h" +#include "ignite/odbc/diagnostic/diagnosable_adapter.h" +#include "ignite/odbc/common_types.h" +#include "ignite/odbc/cursor.h" +#include "ignite/odbc/utility.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 specified data buffer. + * + * @param columnIdx Column index. + * @param buffer Buffer to put column data to. + */ + void BindColumn(uint16_t columnIdx, const app::ApplicationDataBuffer& buffer); + + /** + * Unbind specified column buffer. + * + * @param columnIdx Column index. + */ + void UnbindColumn(uint16_t columnIdx); + + /** + * Unbind all column buffers. + */ + void UnbindAllColumns(); + + /** + * Set column binding offset pointer. + * + * @param ptr Column binding offset pointer. + */ + void SetColumnBindOffsetPtr(size_t* ptr); + + /** + * Get column binding offset pointer. + * + * @return Column binding offset pointer. + */ + size_t* GetColumnBindOffsetPtr(); + + /** + * Get number of columns in the result set. + * + * @return Columns number. + */ + int32_t GetColumnNumber(); + + /** + * Bind parameter. + * + * @param paramIdx Parameter index. + * @param param Parameter. + */ + void BindParameter(uint16_t paramIdx, const app::Parameter& param); + + /** + * Unbind specified parameter. + * + * @param paramIdx Parameter index. + */ + void UnbindParameter(uint16_t paramIdx); + + /** + * Unbind all parameters. + */ + void UnbindAllParameters(); + + /** + * Get number of binded parameters. + * + * @return Number of binded parameters. + */ + uint16_t GetParametersNumber(); + + /** + * Set parameter binding offset pointer. + * + * @param ptr Parameter binding offset pointer. + */ + void SetParamBindOffsetPtr(size_t* ptr); + + /** + * Get parameter binding offset pointer. + * + * @return Parameter binding offset pointer. + */ + size_t* GetParamBindOffsetPtr(); + + /** + * 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. + * + * @note Only SELECT queries are supported currently. + * @param query SQL query. + */ + void PrepareSqlQuery(const std::string& query); + + /** + * Prepare SQL query. + * + * @note Only SELECT queries are supported currently. + * @param query SQL query. + * @param len Query length. + */ + void PrepareSqlQuery(const char* query, size_t len); + + /** + * Execute SQL query. + * + * @note Only SELECT queries are supported currently. + * @param query SQL query. + */ + void ExecuteSqlQuery(const std::string& query); + + /** + * Execute SQL query. + * + * @note Only SELECT queries are supported currently. + * @param query SQL query. + * @param len Query length. + */ + void ExecuteSqlQuery(const char* query, size_t len); + + /** + * Execute SQL query. + * + * @note Only SELECT queries are supported currently. + */ + 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); + + /** + * Close statement. + */ + void Close(); + + /** + * Fetch query result row. + */ + void FetchRow(); + + /** + * Get column metadata. + * + * @return Column metadata. + */ + const meta::ColumnMetaVector* GetMeta() const; + + /** + * Check if data is available. + * + * @return True if data is available. + */ + bool DataAvailable() const; + + /** + * 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(size_t* ptr); + + /** + * Get rows fetched buffer pointer. + * + * @return Rows fetched buffer pointer. + */ + size_t* GetRowsFetchedPtr(); + + /** + * Set row statuses array pointer. + * + * @param ptr Row statuses array pointer. + */ + void SetRowStatusesPtr(uint16_t* ptr); + + /** + * Get row statuses array pointer. + * + * @return Row statuses array pointer. + */ + uint16_t* GetRowStatusesPtr(); + + private: + IGNITE_NO_COPY_ASSIGNMENT(Statement); + + /** + * 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 InternalGetColumnData(uint16_t columnIdx, app::ApplicationDataBuffer& buffer); + + /** + * Close statement. + * Internal call. + * + * @return Operation result. + */ + SqlResult InternalClose(); + + /** + * Prepare SQL query. + * + * @note Only SELECT queries are supported currently. + * @param query SQL query. + * @param len Query length. + * @return Operation result. + */ + SqlResult InternalPrepareSqlQuery(const char* query, size_t len); + + /** + * Execute SQL query. + * + * @note Only SELECT queries are supported currently. + * @param query SQL query. + * @param len Query length. + * @return Operation result. + */ + SqlResult InternalExecuteSqlQuery(const char* query, size_t len); + + /** + * Execute SQL query. + * + * @note Only SELECT queries are supported currently. + * @return Operation result. + */ + SqlResult InternalExecuteSqlQuery(); + + /** + * Fetch query result row. + * + * @return Operation result. + */ + SqlResult InternalFetchRow(); + + /** + * Get number of columns in the result set. + * + * @param res Columns number. + * @return Operation result. + */ + SqlResult 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 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 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 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 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 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. + */ + SqlResult InternalExecuteGetTypeInfoQuery(int16_t sqlType); + + /** + * 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 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 InternalAffectedRows(int64_t& rowCnt); + + /** + * 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; + + /** Parameter bindings. */ + app::ParameterBindingMap paramBindings; + + /** Underlying query. */ + std::auto_ptr<query::Query> currentQuery; + + /** Buffer to store number of rows fetched by the last fetch. */ + size_t* rowsFetched; + + /** Array to store statuses of rows fetched by the last fetch. */ + uint16_t* rowStatuses; + + /** Offset added to pointers to change binding of parameters. */ + size_t* paramBindOffset; + + /* Offset added to pointers to change binding of column data. */ + size_t* columnBindOffset; + }; + } +} + +#endif //_IGNITE_ODBC_STATEMENT \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/odbc/include/ignite/odbc/system/odbc_constants.h ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/system/odbc_constants.h b/modules/platforms/cpp/odbc/include/ignite/odbc/system/odbc_constants.h new file mode 100644 index 0000000..60a6552 --- /dev/null +++ b/modules/platforms/cpp/odbc/include/ignite/odbc/system/odbc_constants.h @@ -0,0 +1,45 @@ +/* + * 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_SYSTEM_ODBC_CONSTANTS +#define _IGNITE_ODBC_SYSTEM_ODBC_CONSTANTS + +#ifdef _WIN32 + +#define _WINSOCKAPI_ +#include <windows.h> + +#ifdef min +# undef min +#endif // min + +#ifdef GetMessage +# undef GetMessage +#endif // GetMessage + +#endif //_WIN32 + +#define ODBCVER 0x0380 + +#include <sqlext.h> +#include <odbcinst.h> + +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(x) (void)(x) +#endif // UNREFERENCED_PARAMETER + +#endif //_IGNITE_ODBC_SYSTEM_ODBC_CONSTANTS
