diff --git a/include/cql/cql_result.hpp b/include/cql/cql_result.hpp index 61f9279b4..3101f1541 100644 --- a/include/cql/cql_result.hpp +++ b/include/cql/cql_result.hpp @@ -58,6 +58,12 @@ class cql_result_t { virtual bool exists(const std::string& column) const = 0; + virtual bool + column_name(int i, + std::string& output_keyspace, + std::string& output_table, + std::string& output_column) const = 0; + virtual bool column_class(int i, std::string& output) const = 0; diff --git a/include/cql/internal/cql_message_result_impl.hpp b/include/cql/internal/cql_message_result_impl.hpp index 72e5521bf..6c76144ab 100644 --- a/include/cql/internal/cql_message_result_impl.hpp +++ b/include/cql/internal/cql_message_result_impl.hpp @@ -77,6 +77,12 @@ public cql_message_t, bool exists(const std::string& column) const; + bool + column_name(int i, + std::string& output_keyspace, + std::string& output_table, + std::string& output_column) const; + bool column_class(int i, std::string& output) const; diff --git a/include/cql/internal/cql_result_metadata.hpp b/include/cql/internal/cql_result_metadata.hpp index bd58d5bc2..06df6fba5 100644 --- a/include/cql/internal/cql_result_metadata.hpp +++ b/include/cql/internal/cql_result_metadata.hpp @@ -81,6 +81,12 @@ class cql_result_metadata_t : const std::string& table, const std::string& column) const; + bool + column_name(int i, + std::string& output_keyspace, + std::string& output_table, + std::string& output_column) const; + bool column_class(int i, std::string& output) const; @@ -178,6 +184,7 @@ class cql_result_metadata_t : private: struct option_t { + column_name_t name; cql::cql_column_type_enum primary_type; cql::cql_column_type_enum collection_primary_type; cql::cql_column_type_enum collection_secondary_type; diff --git a/src/cql/internal/cql_message_result_impl.cpp b/src/cql/internal/cql_message_result_impl.cpp index cc1266db4..12d3e763a 100644 --- a/src/cql/internal/cql_message_result_impl.cpp +++ b/src/cql/internal/cql_message_result_impl.cpp @@ -203,6 +203,18 @@ cql::cql_message_result_impl_t::exists(const std::string& column) const { return _metadata.exists(column); } +bool +cql::cql_message_result_impl_t::column_name(int i, + std::string& output_keyspace, + std::string& output_table, + std::string& output_column) const +{ + return _metadata.column_name(i, + output_keyspace, + output_table, + output_column); +} + bool cql::cql_message_result_impl_t::column_class(int i, std::string& output) const { @@ -364,7 +376,9 @@ cql::cql_message_result_impl_t::get_double(const std::string& column, bool cql::cql_message_result_impl_t::get_bigint(int i, cql::cql_bigint_t& output) const { - if (is_valid(i, cql::CQL_COLUMN_TYPE_BIGINT)) { + if (is_valid(i, cql::CQL_COLUMN_TYPE_BIGINT) + || is_valid(i, cql::CQL_COLUMN_TYPE_TIMESTAMP) + || is_valid(i, cql::CQL_COLUMN_TYPE_COUNTER)) { cql::decode_bigint(_row[i] + sizeof(cql_int_t), output); return true; } diff --git a/src/cql/internal/cql_result_metadata.cpp b/src/cql/internal/cql_result_metadata.cpp index 9a83d1364..ad5822fad 100644 --- a/src/cql/internal/cql_result_metadata.cpp +++ b/src/cql/internal/cql_result_metadata.cpp @@ -99,8 +99,8 @@ cql::cql_result_metadata_t::read(cql::cql_byte_t* input) { input = cql::decode_option(input, option.collection_secondary_type, option.collection_secondary_class); } - column_name_t name(keyspace_name, table_name, column_name); - _column_name_idx.insert(column_name_idx_t::value_type(name, i)); + option.name = column_name_t(keyspace_name, table_name, column_name); + _column_name_idx.insert(column_name_idx_t::value_type(option.name, i)); _columns.push_back(option); } return input; @@ -156,6 +156,22 @@ cql::cql_result_metadata_t::global_table(const std::string& table) { _global_table_name = table; } +bool +cql::cql_result_metadata_t::column_name(int i, + std::string& output_keyspace, + std::string& output_table, + std::string& output_column) const +{ + if (i > _column_count || i < 0) { + return false; + } + + output_keyspace = _columns[i].name.get<0>(); + output_table = _columns[i].name.get<1>(); + output_column = _columns[i].name.get<2>(); + return true; +} + bool cql::cql_result_metadata_t::column_class(int i, std::string& output) const {