From 11606ffcd803b2b6f40f52f0b9af857bdcd081df Mon Sep 17 00:00:00 2001 From: Gopal V Date: Tue, 8 Mar 2016 16:23:48 -0800 Subject: [PATCH] remove odbc/ --- odbc/Makefile | 193 --- odbc/pom.xml | 142 -- odbc/src/cpp/HiveColumnDesc.cpp | 190 --- odbc/src/cpp/HiveColumnDesc.h | 73 - odbc/src/cpp/HiveConnection.h | 58 - odbc/src/cpp/HiveResultSet.cpp | 616 --------- odbc/src/cpp/HiveResultSet.h | 190 --- odbc/src/cpp/HiveRowSet.cpp | 465 ------- odbc/src/cpp/HiveRowSet.h | 168 --- odbc/src/cpp/hiveclient.cpp | 294 ----- odbc/src/cpp/hiveclient.h | 598 --------- odbc/src/cpp/hiveclienthelper.cpp | 86 -- odbc/src/cpp/hiveclienthelper.h | 132 -- odbc/src/cpp/hiveconstants.h | 83 -- odbc/src/cpp/thriftserverconstants.h | 64 - odbc/src/test/hiveclienttest.c | 1395 -------------------- odbc/testdata/dataset1.input | 2 - odbc/testdata/dataset2.input | 1 - odbc/testdata/dataset_types.input | 2 - packaging/src/main/assembly/src.xml | 1 - pom.xml | 1 - .../ptest2/conf/example-apache-trunk.properties | 2 +- 22 files changed, 1 insertion(+), 4755 deletions(-) delete mode 100644 odbc/Makefile delete mode 100644 odbc/pom.xml delete mode 100644 odbc/src/cpp/HiveColumnDesc.cpp delete mode 100644 odbc/src/cpp/HiveColumnDesc.h delete mode 100644 odbc/src/cpp/HiveConnection.h delete mode 100644 odbc/src/cpp/HiveResultSet.cpp delete mode 100644 odbc/src/cpp/HiveResultSet.h delete mode 100644 odbc/src/cpp/HiveRowSet.cpp delete mode 100644 odbc/src/cpp/HiveRowSet.h delete mode 100644 odbc/src/cpp/hiveclient.cpp delete mode 100644 odbc/src/cpp/hiveclient.h delete mode 100644 odbc/src/cpp/hiveclienthelper.cpp delete mode 100644 odbc/src/cpp/hiveclienthelper.h delete mode 100644 odbc/src/cpp/hiveconstants.h delete mode 100644 odbc/src/cpp/thriftserverconstants.h delete mode 100644 odbc/src/test/hiveclienttest.c delete mode 100644 odbc/testdata/dataset1.input delete mode 100644 odbc/testdata/dataset2.input delete mode 100644 odbc/testdata/dataset_types.input diff --git odbc/Makefile odbc/Makefile deleted file mode 100644 index 1cd5f7b..0000000 --- odbc/Makefile +++ /dev/null @@ -1,193 +0,0 @@ -# -# Copyright 2005 The Apache Software Foundation -# -# Licensed 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. -# - -# -# Note: This makefile depends on 5 environment variables to funtion correctly: -# a) WORD_SIZE -# b) THRIFT_HOME -# c) HIVE_ROOT -# d) BASE_DIR -# e) BOOST_HOME -# All these are passed by build.xml. -# - -WORD_SIZE ?= 64 -ifeq ($(WORD_SIZE),32) - ARCH_FLAGS = -m32 -DARCH32 -else - ARCH_FLAGS = -m64 -DARCH64 -endif - -OS=$(shell uname -s) - -ifeq ($(OS),Darwin) - LDFLAGS = -dynamiclib -else - LDFLAGS = -shared -endif - - -AR = ar -ARFLAGS = rcs -ARXFLAGS = -x -CC = gcc -CFLAGS = -Wall -g -fPIC -CXX = g++ -CXXFLAGS = -Wall -g -fPIC -LD = g++ -INSTALL = /usr/bin/install -c -SHELL = /bin/sh -LIBTOOL = $(SHELL) /usr/bin/libtool -LINK = ln -sf - -BUILD_DIR = $(BASE_DIR)/target -ODBC_BUILD_DIR = $(BUILD_DIR)/odbc -OBJ_SERVICE_BUILD_DIR = $(BUILD_DIR)/service/objs -OBJ_QL_BUILD_DIR = $(BUILD_DIR)/ql/objs -OBJ_METASTORE_BUILD_DIR = $(BUILD_DIR)/metastore/objs -OBJ_ODBC_BUILD_DIR = $(ODBC_BUILD_DIR)/objs -LIB_ODBC_BUILD_DIR = $(ODBC_BUILD_DIR)/lib -TEST_ODBC_BUILD_DIR = $(ODBC_BUILD_DIR)/test -THRIFT_INCLUDE_PATH=$(THRIFT_HOME)/include/thrift -FB303_INCLUDE_PATH=$(THRIFT_INCLUDE_PATH)/fb303 -INSTALL_PATH = /usr/local -INSTALL_LIB_PATH = $(INSTALL_PATH)/lib -INSTALL_INCLUDE_PATH = $(INSTALL_PATH)/include -BOOST_INCLUDE_PATH = $(BOOST_HOME)/include - -LIB_NAME = hiveclient -SHLIB_VERSION = 1.0.0 -SO_LINK_NAME = lib$(LIB_NAME).so -SO_NAME = $(SO_LINK_NAME).$(SHLIB_VERSION) -SO_LINK_TARGET = $(LIB_ODBC_BUILD_DIR)/$(SO_LINK_NAME) -SO_TARGET = $(LIB_ODBC_BUILD_DIR)/$(SO_NAME) -SO_INSTALL_LINK_TARGET = $(INSTALL_LIB_PATH)/$(SO_LINK_NAME) -SO_INSTALL_TARGET = $(INSTALL_LIB_PATH)/$(SO_NAME) -AR_NAME = lib$(LIB_NAME).a -AR_TARGET = $(LIB_ODBC_BUILD_DIR)/$(AR_NAME) -AR_INSTALL_TARGET = $(INSTALL_LIB_PATH)/$(AR_NAME) - -SERVICE_SRC_DIR = $(HIVE_ROOT)/service/src/gen/thrift/gen-cpp -SERVICE_SOURCES = ThriftHive.cpp \ - hive_service_constants.cpp \ - hive_service_types.cpp -SERVICE_OBJS = $(addprefix $(OBJ_SERVICE_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(SERVICE_SOURCES)))) - -QL_SRC_DIR = $(HIVE_ROOT)/ql/src/gen/thrift/gen-cpp -QL_SOURCES = queryplan_types.cpp queryplan_constants.cpp -QL_OBJS = $(addprefix $(OBJ_QL_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(QL_SOURCES)))) - - -METASTORE_SRC_DIR = $(HIVE_ROOT)/metastore/src/gen/thrift/gen-cpp -METASTORE_SOURCES = ThriftHiveMetastore.cpp \ - hive_metastore_constants.cpp \ - hive_metastore_types.cpp -METASTORE_OBJS = $(addprefix $(OBJ_METASTORE_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(METASTORE_SOURCES)))) - -ODBC_SRC_DIR = $(BASE_DIR)/src/cpp - -ODBC_SOURCES = hiveclient.cpp \ - HiveResultSet.cpp \ - HiveColumnDesc.cpp \ - HiveRowSet.cpp \ - hiveclienthelper.cpp - -ODBC_OBJS = $(addprefix $(OBJ_ODBC_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(ODBC_SOURCES)))) - -ODBC_TEST_SRC_DIR = $(BASE_DIR)/src/test -ODBC_TEST_DATA_DIR = $(BASE_DIR)/testdata -TEST_FLAGS = -DTEST_DATA_DIR=$(ODBC_TEST_DATA_DIR) -HIVE_CLIENT_TEST = $(TEST_ODBC_BUILD_DIR)/HiveClientTestC - -INCLUDE_PATHS = -I$(THRIFT_INCLUDE_PATH) \ - -I$(FB303_INCLUDE_PATH) \ - -I$(BOOST_INCLUDE_PATH) \ - -I$(SERVICE_SRC_DIR) \ - -I$(QL_SRC_DIR) \ - -I$(METASTORE_SRC_DIR) \ - -I$(ODBC_SRC_DIR) - -INSTALL_HEADERS = hiveclient.h \ - hiveconstants.h -HEADER_SOURCES = $(addprefix $(ODBC_SRC_DIR)/, $(INSTALL_HEADERS)) -HEADER_TARGETS = $(INSTALL_INCLUDE_PATH)/hiveclient.h \ - $(INSTALL_INCLUDE_PATH)/hiveconstants.h - -LIB_THRIFT_DIR = $(THRIFT_HOME)/lib -LIB_THRIFT_ADD = -L$(LIB_THRIFT_DIR) -lthrift -LIB_THRIFT_AR = $(LIB_THRIFT_DIR)/libthrift.a - -LIB_FB303_DIR = $(THRIFT_HOME)/lib -LIB_FB303_ADD = -L$(LIB_FB303_DIR) -lfb303 -LIB_FB303_AR = $(LIB_FB303_DIR)/libfb303.a - - -all:: $(AR_TARGET) $(SO_TARGET) $(HIVE_CLIENT_TEST) - -$(AR_TARGET): $(METASTORE_OBJS) $(SERVICE_OBJS) $(QL_OBJS) $(ODBC_OBJS) - if test -z '$(THRIFT_HOME)'; then echo 'THRIFT_HOME directory?'; exit 1; else exit 0; fi - mkdir -p $(LIB_ODBC_BUILD_DIR) - $(AR) $(ARXFLAGS) $(LIB_THRIFT_AR) #Extract thrift archive - $(AR) $(ARXFLAGS) $(LIB_FB303_AR) #Extract fb303 archive - $(AR) $(ARFLAGS) $@ $+ *.o #Include all object files into new archive - rm *.o #Remove extracted archive object files - -$(SO_TARGET): $(METASTORE_OBJS) $(SERVICE_OBJS) $(QL_OBJS) $(ODBC_OBJS) - if test -z '$(THRIFT_HOME)'; then echo 'THRIFT_HOME directory?'; exit 1; else exit 0; fi - mkdir -p $(LIB_ODBC_BUILD_DIR) - $(LD) $(ARCH_FLAGS) $(LDFLAGS) $+ $(LIB_THRIFT_ADD) $(LIB_FB303_ADD) -o $@ \ - && $(LINK) $(SO_NAME) $(SO_LINK_TARGET) - - -$(OBJ_SERVICE_BUILD_DIR)/%.o: $(SERVICE_SRC_DIR)/%.cpp - mkdir -p $(OBJ_SERVICE_BUILD_DIR) - $(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@ - -$(OBJ_QL_BUILD_DIR)/%.o: $(QL_SRC_DIR)/%.cpp - mkdir -p $(OBJ_QL_BUILD_DIR) - $(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@ - -$(OBJ_METASTORE_BUILD_DIR)/%.o: $(METASTORE_SRC_DIR)/%.cpp - mkdir -p $(OBJ_METASTORE_BUILD_DIR) - $(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@ - -$(OBJ_ODBC_BUILD_DIR)/%.o: $(ODBC_SRC_DIR)/%.cpp - mkdir -p $(OBJ_ODBC_BUILD_DIR) - $(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@ - -$(HIVE_CLIENT_TEST): $(SO_TARGET) $(ODBC_TEST_SRC_DIR)/hiveclienttest.c - mkdir -p $(TEST_ODBC_BUILD_DIR) - $(CC) $(CFLAGS) $(ARCH_FLAGS) $(TEST_FLAGS) $(INCLUDE_PATHS) $(ODBC_TEST_SRC_DIR)/hiveclienttest.c -L$(LIB_ODBC_BUILD_DIR) -L$(LIB_THRIFT_DIR) -l$(LIB_NAME) -lthrift $(LIB_FB303_ADD) -o $@ - - -install: $(AR_TARGET) $(SO_TARGET) - test -z "$(INSTALL_LIB_PATH)" || mkdir -p -- "$(INSTALL_LIB_PATH)" - $(LIBTOOL) --mode=install $(INSTALL) '$(AR_TARGET)' '$(AR_INSTALL_TARGET)' - $(LIBTOOL) --mode=install $(INSTALL) '$(SO_TARGET)' '$(SO_INSTALL_TARGET)' \ - && $(LINK) $(SO_NAME) $(SO_INSTALL_LINK_TARGET) - PATH="$PATH:/sbin" ldconfig -n $(INSTALL_LIB_PATH) - test -z "$(INSTALL_INCLUDE_PATH)" || mkdir -p -- "$(INSTALL_INCLUDE_PATH)" - $(INSTALL) -m 644 $(HEADER_SOURCES) $(INSTALL_INCLUDE_PATH) - -uninstall: - $(LIBTOOL) --mode=uninstall rm -f '$(AR_INSTALL_TARGET)' '$(SO_INSTALL_LINK_TARGET)' '$(SO_INSTALL_TARGET)' - rm -f $(HEADER_TARGETS) - -clean: - rm -rf $(ODBC_BUILD_DIR) $(OBJ_SERVICE_BUILD_DIR) $(OBJ_QL_BUILD_DIR) $(OBJ_METASTORE_BUILD_DIR) - -test: $(AR_TARGET) $(SO_TARGET) $(HIVE_CLIENT_TEST) - LD_LIBRARY_PATH=$(LIB_ODBC_BUILD_DIR):$(LIB_THRIFT_DIR):$(LIB_FB303_DIR):$(LD_LIBRARY_PATH) $(HIVE_CLIENT_TEST) diff --git odbc/pom.xml odbc/pom.xml deleted file mode 100644 index 0c836d6..0000000 --- odbc/pom.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - 4.0.0 - - org.apache.hive - hive - 2.1.0-SNAPSHOT - ../pom.xml - - - hive-odbc - pom - Hive ODBC - - - .. - make - - - - - - - - org.apache.hive - hive-exec - ${project.version} - - - org.apache.hive - hive-metastore - ${project.version} - - - org.apache.hive - hive-service - ${project.version} - - - - - - - odbc - - - - org.apache.maven.plugins - maven-antrun-plugin - - - compile-odbc - compile - - - - - - - - - - - - - - - - - - - - - run - - - - test-odbc - test - - - - - - - - - - - - - - - - run - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-property - - enforce - - - - - boost.home - - - thrift.home - - - true - - - - - - - - - diff --git odbc/src/cpp/HiveColumnDesc.cpp odbc/src/cpp/HiveColumnDesc.cpp deleted file mode 100644 index a2a3dbe..0000000 --- odbc/src/cpp/HiveColumnDesc.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "HiveColumnDesc.h" -#include "hiveclienthelper.h" -#include "thriftserverconstants.h" - - -/************************************************************************************************* - * HiveColumnDesc Class Definition - ************************************************************************************************/ - -HiveColumnDesc::HiveColumnDesc() { - m_hive_type = HIVE_UNKNOWN_TYPE; - m_is_nullable = false; - m_is_case_sensitive = false; - m_max_display_size = 0; - m_byte_size = 0; -} - -HiveColumnDesc::~HiveColumnDesc() { -} - -void HiveColumnDesc::initialize(Apache::Hadoop::Hive::FieldSchema& field_schema) { - m_field_schema = field_schema; - m_hive_type = hiveTypeLookup(field_schema.type.c_str()); - m_is_nullable = true; - m_is_case_sensitive = false; - m_max_display_size = getMaxDisplaySize(m_hive_type); - m_byte_size = getByteSize(m_hive_type); -} - -void HiveColumnDesc::getColumnName(char* buffer, size_t buffer_len) { - safe_strncpy(buffer, m_field_schema.name.c_str(), buffer_len); -} - -void HiveColumnDesc::getColumnType(char* buffer, size_t buffer_len) { - safe_strncpy(buffer, m_field_schema.type.c_str(), buffer_len); -} - -HiveType HiveColumnDesc::getHiveType() { - return m_hive_type; -} - -int HiveColumnDesc::getIsNullable() { - return m_is_nullable ? 1 : 0; -} - -int HiveColumnDesc::getIsCaseSensitive() { - return m_is_case_sensitive ? 1 : 0; -} - -size_t HiveColumnDesc::getMaxDisplaySize() { - return m_max_display_size; -} - -size_t HiveColumnDesc::getFieldByteSize() { - return m_byte_size; -} - -size_t HiveColumnDesc::getMaxDisplaySize(HiveType type) { - /* These are more or less arbitrarily determined values and may be changed if it causes any problems */ - switch (type) - { - case HIVE_VOID_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_BOOLEAN_TYPE: - return 1; - - case HIVE_TINYINT_TYPE: - return 4; - - case HIVE_SMALLINT_TYPE: - return 6; - - case HIVE_INT_TYPE: - return 11; - - case HIVE_BIGINT_TYPE: - return 20; - - case HIVE_FLOAT_TYPE: - return 16; - - case HIVE_DOUBLE_TYPE: - return 24; - - case HIVE_STRING_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_DATE_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_DATETIME_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_TIMESTAMP_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_LIST_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_MAP_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_STRUCT_TYPE: - return MAX_DISPLAY_SIZE; - - case HIVE_UNKNOWN_TYPE: - return MAX_DISPLAY_SIZE; - - default: - return MAX_DISPLAY_SIZE; - } -} - -size_t HiveColumnDesc::getByteSize(HiveType type) { - /* These are more or less arbitrarily determined values and may be changed if it causes any problems */ - switch (type) - { - case HIVE_VOID_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_BOOLEAN_TYPE: - return 1; - - case HIVE_TINYINT_TYPE: - return 1; - - case HIVE_SMALLINT_TYPE: - return 2; - - case HIVE_INT_TYPE: - return 4; - - case HIVE_BIGINT_TYPE: - return 8; - - case HIVE_FLOAT_TYPE: - return 4; - - case HIVE_DOUBLE_TYPE: - return 8; - - case HIVE_STRING_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_DATE_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_DATETIME_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_TIMESTAMP_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_LIST_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_MAP_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_STRUCT_TYPE: - return MAX_BYTE_LENGTH; - - case HIVE_UNKNOWN_TYPE: - return MAX_BYTE_LENGTH; - - default: - return MAX_BYTE_LENGTH; - } -} diff --git odbc/src/cpp/HiveColumnDesc.h odbc/src/cpp/HiveColumnDesc.h deleted file mode 100644 index b415f0e..0000000 --- odbc/src/cpp/HiveColumnDesc.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file HiveColumnDesc.h - * @brief Provides the HiveColumnDesc class - * - *****************************************************************************/ - - -#ifndef __hive_column_desc_h__ -#define __hive_column_desc_h__ - -#include "hive_metastore_types.h" -#include "hiveconstants.h" - - -/************************************************************************************************* - * HiveColumnDesc Class Declaration - ************************************************************************************************/ - -/** - * @brief Descriptor for a column in a HiveResultSet. - * - * This class stores the information describing a column in a HiveResultSet. - * It was only meant to be created by DBCreateColumnDesc and destroyed by DBCloseColumnDesc. - * - * @see DBCreateColumnDesc() - * @see DBCloseColumnDesc() - */ -class HiveColumnDesc { - public: - HiveColumnDesc(); - virtual ~HiveColumnDesc(); - void initialize(Apache::Hadoop::Hive::FieldSchema& field_schema); - void getColumnName(char* buffer, size_t buffer_len); - void getColumnType(char* buffer, size_t buffer_len); - HiveType getHiveType(); - int getIsNullable(); - int getIsCaseSensitive(); - size_t getMaxDisplaySize(); - size_t getFieldByteSize(); - - private: - Apache::Hadoop::Hive::FieldSchema m_field_schema; - HiveType m_hive_type; - bool m_is_nullable; - bool m_is_case_sensitive; - size_t m_max_display_size; - size_t m_byte_size; - - size_t getMaxDisplaySize(HiveType type); - size_t getByteSize(HiveType type); -}; - - -#endif // __hive_column_desc_h__ diff --git odbc/src/cpp/HiveConnection.h odbc/src/cpp/HiveConnection.h deleted file mode 100644 index 3b2e2b1..0000000 --- odbc/src/cpp/HiveConnection.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file HiveConnection.h - * @brief Provides the HiveConnection struct - * - *****************************************************************************/ - - -#ifndef __hive_connection_h__ -#define __hive_connection_h__ - -#include "ThriftHive.h" -#include - -using namespace boost; -using namespace apache::thrift::transport; - - -/************************************************************************************************* - * HiveConnection Class Definition - ************************************************************************************************/ - -/** - * @brief Container class for Hive database connections. - * - * This class stores the Hive database connection information. It was only meant to be created by - * DBOpenConnection and destroyed by DBCloseConnection. - * - * @see DBOpenConnection() - * @see DBCloseConnection() - */ -struct HiveConnection { - HiveConnection(shared_ptr c, shared_ptr t) : - client(c), transport(t) {} - shared_ptr client; - shared_ptr transport; -}; - - -#endif // __hive_connection_h__ diff --git odbc/src/cpp/HiveResultSet.cpp odbc/src/cpp/HiveResultSet.cpp deleted file mode 100644 index d3d375e..0000000 --- odbc/src/cpp/HiveResultSet.cpp +++ /dev/null @@ -1,616 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "ThriftHive.h" - -#include "HiveResultSet.h" -#include "hiveclienthelper.h" -#include "thriftserverconstants.h" - - -/************************************************************************************************* - * HiveQueryResultSet Subclass Definition - ************************************************************************************************/ - -HiveQueryResultSet::HiveQueryResultSet(int max_buf_rows) { - m_connection = NULL; - m_serial_rowset.reset(); - assert(max_buf_rows > 0); - m_max_buffered_rows = max_buf_rows; - m_fetch_idx = -1; - m_has_results = false; - m_fetch_attempted = false; - /* Allocate the necessary amount of memory to prevent resizing */ - m_result_set_data.reserve(max_buf_rows); -} - -HiveQueryResultSet::~HiveQueryResultSet() { - /* Nothing to deallocate */ -} - -HiveReturn HiveQueryResultSet::initialize(HiveConnection* connection, char* err_buf, - size_t err_buf_len) { - assert(connection != NULL); - m_connection = connection; - m_serial_rowset.reset(); - m_fetch_idx = -1; - m_has_results = false; - m_fetch_attempted = false; - return initializeSchema(err_buf, err_buf_len); -} - -HiveReturn HiveQueryResultSet::fetchNext(char* err_buf, size_t err_buf_len) { - m_fetch_idx++; - if (m_fetch_idx >= (int) m_result_set_data.size()) /* If there are no more buffered rows... */ - { - /* Repopulate the result buffer */ - if (fetchNewResults(err_buf, err_buf_len) == HIVE_ERROR) { - return HIVE_ERROR; - } - /* Set the cursor to point at the first element (fetchNewResults would have reset its position)*/ - m_fetch_idx = 0; - if (m_result_set_data.empty()) { - return HIVE_NO_MORE_DATA; /* No more data to fetch */ - } - } - m_serial_rowset.reset(); /* Remove old row data before saving next */ - m_serial_rowset.initialize(m_schema, m_result_set_data[m_fetch_idx]); - return HIVE_SUCCESS; -} - -HiveReturn HiveQueryResultSet::hasResults(int* results, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(results == NULL, __FUNCTION__, - "Pointer to has_results (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - - if (!m_fetch_attempted) { - if (fetchNewResults(err_buf, err_buf_len) == HIVE_ERROR) { - return HIVE_ERROR; /* An error must have occurred */ - } - } - - *results = m_has_results ? 1 : 0; /* This flag will have been set by the fetch call */ - return HIVE_SUCCESS; -} - -HiveReturn HiveQueryResultSet::getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(col_count == NULL, __FUNCTION__, - "Pointer to col_count (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - /* If m_schema has been initialized, then m_schema.fieldSchemas must be populated */ - *col_count = m_schema.fieldSchemas.size(); - - return HIVE_SUCCESS; -} - -HiveReturn HiveQueryResultSet::createColumnDesc(size_t column_idx, - HiveColumnDesc** column_desc_ptr, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(column_desc_ptr == NULL, __FUNCTION__, - "Pointer to column_desc (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(m_schema.fieldSchemas.empty(), __FUNCTION__, - "Resultset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= m_schema.fieldSchemas.size(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - *column_desc_ptr = new HiveColumnDesc(); - (*column_desc_ptr)->initialize(m_schema.fieldSchemas[column_idx]); - return HIVE_SUCCESS; -} - -HiveRowSet& HiveQueryResultSet::getRowSet() { - return m_serial_rowset; -} - -HiveReturn HiveQueryResultSet::initializeSchema(char* err_buf, size_t err_buf_len) { - try { - m_connection->client->getSchema(m_schema); - } catch (Apache::Hadoop::Hive::HiveServerException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (...) { - RETURN_FAILURE(__FUNCTION__, - "Unknown Hive get result schema error.", err_buf, err_buf_len, HIVE_ERROR); - } - - /* TODO: hard code this in for now because m_schema.properties not properly implemented; - * but remove this when it is implemented */ - m_schema.properties[FIELD_DELIM] = "\t"; - m_schema.properties[SERIALIZATION_NULL_FORMAT] = DEFAULT_NULL_FORMAT; - - /* TODO: replace the real null representation with 'NULL' because of a bug in the Hive Server - * fetch function; remove this when Hive Server has been fixed to not replace the actual null - * rep with NULL. */ - m_schema.properties[SERIALIZATION_NULL_FORMAT] = "NULL"; - - /* Verify the presence of known m_schema properties */ - assert(m_schema.properties.find(FIELD_DELIM) != m_schema.properties.end()); - assert(m_schema.properties.find(SERIALIZATION_NULL_FORMAT) != m_schema.properties.end()); - - return HIVE_SUCCESS; -} - -HiveReturn HiveQueryResultSet::fetchNewResults(char* err_buf, size_t err_buf_len) { - m_result_set_data.clear(); /* Empty the original buffer just to be safe */ - assert(m_connection != NULL); - assert(m_connection->client != NULL); - assert(m_max_buffered_rows > 0); - try { - m_connection->client->fetchN(m_result_set_data, m_max_buffered_rows); - } catch (Apache::Hadoop::Hive::HiveServerException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (...) { - RETURN_FAILURE(__FUNCTION__, - "Unknown Hive FetchN error.", err_buf, err_buf_len, HIVE_ERROR); - } - - /* This indicates that a Hive server fetch call has successfully executed */ - m_fetch_attempted = true; - if (!m_result_set_data.empty()) { - /* This is initialized to be false and will remain true forever once this is set */ - m_has_results = true; - } - m_fetch_idx = -1; /* Reset the cursor b/c the old index no longer has any meaning */ - return HIVE_SUCCESS; -} - - - -/************************************************************************************************* - * HiveTablesResultSet Subclass Definition - ************************************************************************************************/ - -/* - * g_tables_schema: An array of arrays of C strings used to define the expected - * resultset schema for HiveTablesResultSet. All values will be stored as - * C strings (even numbers) as they will eventually be converted to their - * proper types. Each entry of g_tables_schema is an array with the following - * format: - * 1. Column name - * 2. Column type name - * 3. Default value (as a C string) - */ -static const char* g_tables_schema[][3] = { - {"TABLE_CAT" , STRING_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"TABLE_SCHEM", STRING_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"TABLE_NAME", STRING_TYPE_NAME, ""}, - {"TABLE_TYPE", STRING_TYPE_NAME, "TABLE"}, - {"REMARKS", STRING_TYPE_NAME, ""} -}; - -HiveTablesResultSet::HiveTablesResultSet() { - m_fetch_idx = -1; - m_curr_row_data.reserve(5); /* The resultset will always have 5 columns */ -} - -HiveTablesResultSet::~HiveTablesResultSet() { - /* Nothing to deallocate */ -} - -HiveReturn HiveTablesResultSet::initialize(HiveConnection* connection, - const char* tbl_search_pattern, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(connection == NULL, __FUNCTION__, - "Hive connection cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(connection->client == NULL, __FUNCTION__, - "Hive connection client cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(tbl_search_pattern == NULL, __FUNCTION__, - "Table search pattern cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - - m_fetch_idx = -1; - try { - /* Just use the default database name for now b/c Hive does not yet support multiple - * databases */ - connection->client->get_tables(m_tables, DEFAULT_DATABASE, tbl_search_pattern); - } catch (Apache::Hadoop::Hive::MetaException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (...) { - RETURN_FAILURE(__FUNCTION__, - "Unknown Hive get tables error.", err_buf, err_buf_len, HIVE_ERROR); - } - /* Sort the table names */ - sort(m_tables.begin(), m_tables.end()); - return initializeSchema(err_buf, err_buf_len); -} - -HiveReturn HiveTablesResultSet::fetchNext(char* err_buf, size_t err_buf_len) { - m_fetch_idx++; - if (m_fetch_idx >= (int) m_tables.size()) /* If there are no more tables */ - { - m_fetch_idx--; /* Prevent the m_fetch_idx from wrapping around after too many calls */ - return HIVE_NO_MORE_DATA; /* No more data to fetch */ - } - - /* Populate m_curr_row_data with the latest row information */ - if (constructCurrentRow(err_buf, err_buf_len) == HIVE_ERROR) { - return HIVE_ERROR; /* An error must have occurred */ - } - m_vecstring_rowset.reset(); /* Remove old rowset data before saving next */ - m_vecstring_rowset.initialize(m_schema, &m_curr_row_data); - - return HIVE_SUCCESS; -} - -HiveReturn HiveTablesResultSet::hasResults(int* results, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(results == NULL, __FUNCTION__, - "Pointer to has_results (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - *results = (m_tables.size() > 0) ? 1 : 0; /* Just check the vector length because no caching */ - return HIVE_SUCCESS; -} - -HiveReturn HiveTablesResultSet::getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(col_count == NULL, __FUNCTION__, - "Pointer to col_count (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - /* If m_schema has been initialized, then m_schema.fieldSchemas must be populated */ - *col_count = m_schema.fieldSchemas.size(); - return HIVE_SUCCESS; -} - -HiveReturn HiveTablesResultSet::createColumnDesc(size_t column_idx, - HiveColumnDesc** column_desc_ptr, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(column_desc_ptr == NULL, __FUNCTION__, - "Pointer to column_desc (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(m_schema.fieldSchemas.empty(), __FUNCTION__, - "Resultset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= m_schema.fieldSchemas.size(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - *column_desc_ptr = new HiveColumnDesc(); - (*column_desc_ptr)->initialize(m_schema.fieldSchemas[column_idx]); - return HIVE_SUCCESS; -} - -HiveRowSet& HiveTablesResultSet::getRowSet() { - return m_vecstring_rowset; -} - -HiveReturn HiveTablesResultSet::initializeSchema(char* err_buf, size_t err_buf_len) { - /* Initialize the schema values needed for this resultset. - * OK to hardcode because these fields should never change */ - m_schema.properties[SERIALIZATION_NULL_FORMAT] = DEFAULT_NULL_FORMAT; - - Apache::Hadoop::Hive::FieldSchema tmp_field_schema; - for (unsigned int idx = 0; idx < LENGTH(g_tables_schema); idx++) { - tmp_field_schema.name = g_tables_schema[idx][0]; - tmp_field_schema.type = g_tables_schema[idx][1]; - /* Makes a copy of this tmp FieldSchema */ - m_schema.fieldSchemas.push_back(tmp_field_schema); - } - - /* There should be exactly 5 columns for this resultset */ - assert(m_schema.fieldSchemas.size() == 5); - - return HIVE_SUCCESS; -} - -HiveReturn HiveTablesResultSet::constructCurrentRow(char* err_buf, size_t err_buf_len) { - /* Clear out the previous row data just to be safe */ - m_curr_row_data.clear(); - int column_num; - for (unsigned int idx = 0; idx < LENGTH(g_tables_schema); idx++) { - /* column_num represents ordinal position instead of index to avoid confusion */ - column_num = idx + 1; - switch (column_num) - { - case 3: // If Col3: TABLE_NAME - m_curr_row_data.push_back(m_tables[m_fetch_idx]); - break; - - default: // Add in default value - m_curr_row_data.push_back(g_tables_schema[idx][2]); - break; - } - } - - /* There should be exactly 5 columns for this resultset */ - assert(m_curr_row_data.size() == 5); - - return HIVE_SUCCESS; -} - - -/************************************************************************************************* - * HiveColumnsResultSet Subclass Definition - ************************************************************************************************/ - -/* - * g_columns_schema: An array of arrays of C strings used to define the expected - * resultset schema for HiveColumnsResultSet. All values will be stored as - * C strings (even numbers) as they will eventually be converted to their - * proper types. Each entry of g_columns_schema is an array with the following - * format: - * 1. Column name - * 2. Column type name - * 3. Default value (as a C string) - */ -static const char* g_columns_schema[][3] = { - {"TABLE_CAT" , STRING_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"TABLE_SCHEM", STRING_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"TABLE_NAME", STRING_TYPE_NAME, ""}, - {"COLUMN_NAME", STRING_TYPE_NAME, ""}, - {"DATA_TYPE", SMALLINT_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"TYPE_NAME", STRING_TYPE_NAME, STRING_TYPE_NAME}, - {"COLUMN_SIZE", INT_TYPE_NAME, STRINGIFY(MAX_BYTE_LENGTH)}, - {"BUFFER_LENGTH", INT_TYPE_NAME, STRINGIFY(MAX_BYTE_LENGTH)}, - {"DECIMAL_DIGITS", SMALLINT_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"NUM_PREC_RADIX", SMALLINT_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"NULLABLE", SMALLINT_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"REMARKS", STRING_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"COLUMN_DEF", STRING_TYPE_NAME, "NULL"}, - {"SQL_DATA_TYPE", SMALLINT_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"SQL_DATETIME_SUB", SMALLINT_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"CHAR_OCTET_LENGTH", INT_TYPE_NAME, "1"}, - {"ORDINAL_POSITION", INT_TYPE_NAME, DEFAULT_NULL_FORMAT}, - {"IS_NULLABLE", STRING_TYPE_NAME, "YES"} -}; - -HiveColumnsResultSet::HiveColumnsResultSet(int(*fpHiveToSQLType)(HiveType)) { - m_connection = NULL; - assert(fpHiveToSQLType != NULL); - m_fpHiveToSQLType = fpHiveToSQLType; - m_tbl_fetch_idx = -1; - m_col_fetch_idx = -1; - m_curr_row_data.reserve(18); /* The resultset will always have 18 columns */ -} - -HiveColumnsResultSet::~HiveColumnsResultSet() { - /* Nothing to deallocate */ -} - -HiveReturn HiveColumnsResultSet::initialize(HiveConnection* connection, - const char* tbl_search_pattern, - const char* col_search_pattern, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(connection == NULL, __FUNCTION__, - "Hive connection cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(connection->client == NULL, __FUNCTION__, - "Hive connection client cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(tbl_search_pattern == NULL, __FUNCTION__, - "Table search pattern cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(col_search_pattern == NULL, __FUNCTION__, - "Column search pattern cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - - /* TODO: col_search_pattern is not currently supported; arg is ignored for now; - * either add support in Hive Server or here */ - - m_connection = connection; - m_tbl_fetch_idx = -1; - m_col_fetch_idx = -1; - - try { - /* Just use the default database name for now b/c Hive does not yet support multiple - * databases */ - connection->client->get_tables(m_tables, DEFAULT_DATABASE, tbl_search_pattern); - } catch (Apache::Hadoop::Hive::MetaException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (...) { - RETURN_FAILURE(__FUNCTION__, - "Unknown Hive get tables error.", err_buf, err_buf_len, HIVE_ERROR); - } - /* Sort the table names */ - sort(m_tables.begin(), m_tables.end()); - - return initializeSchema(err_buf, err_buf_len); -} - -HiveReturn HiveColumnsResultSet::fetchNext(char* err_buf, size_t err_buf_len) { - m_col_fetch_idx++; - /* If there are no more columns in the current table */ - if (m_col_fetch_idx >= (int) m_columns.size()) { - HiveReturn retval = getNextTableFields(err_buf, err_buf_len); - if (retval != HIVE_SUCCESS) { - /* Prevent the m_col_fetch_idx from wrapping around after too many calls */ - m_col_fetch_idx--; - return retval; - } - /* If getNextTableFields() successful, m_columns must contain new field schemas for - * next table */ - assert(m_columns.size() > 0); - /* Set index back to first element (getNextTableColumns() would have reset its value) */ - m_col_fetch_idx = 0; - } - - /* Populate m_curr_row_data with the latest row information */ - if (constructCurrentRow(err_buf, err_buf_len) == HIVE_ERROR) { - return HIVE_ERROR; /* An error must have occurred */ - } - m_vecstring_rowset.reset(); /* Remove old rowset data before saving next */ - m_vecstring_rowset.initialize(m_schema, &m_curr_row_data); - - return HIVE_SUCCESS; -} - -HiveReturn HiveColumnsResultSet::hasResults(int* results, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(results == NULL, __FUNCTION__, - "Pointer to has_results (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - /* If there are tables, then there must be columns to fetch */ - *results = (m_tables.size() > 0) ? 1 : 0; - return HIVE_SUCCESS; -} - -HiveReturn HiveColumnsResultSet::getColumnCount(size_t* col_count, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(col_count == NULL, __FUNCTION__, - "Pointer to col_count (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - /* If m_schema has been initialized, then m_schema.fieldSchemas must be populated */ - *col_count = m_schema.fieldSchemas.size(); - return HIVE_SUCCESS; -} - -HiveReturn HiveColumnsResultSet::createColumnDesc(size_t column_idx, - HiveColumnDesc** column_desc_ptr, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(column_desc_ptr == NULL, __FUNCTION__, - "Pointer to column_desc (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(m_schema.fieldSchemas.empty(), __FUNCTION__, - "Resultset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= m_schema.fieldSchemas.size(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - *column_desc_ptr = new HiveColumnDesc(); - (*column_desc_ptr)->initialize(m_schema.fieldSchemas[column_idx]); - return HIVE_SUCCESS; -} - -HiveRowSet& HiveColumnsResultSet::getRowSet() { - return m_vecstring_rowset; -} - -HiveReturn HiveColumnsResultSet::getNextTableFields(char* err_buf, size_t err_buf_len) { - /* Clear out the field schemas for the previous table */ - m_columns.clear(); - - m_tbl_fetch_idx++; - if (m_tbl_fetch_idx >= (int) m_tables.size()) /* If there are no more tables */ - { - /* Prevent the m_tbl_fetch_idx from wrapping around after too many calls */ - m_tbl_fetch_idx--; - return HIVE_NO_MORE_DATA; /* No more data to fetch */ - } - - assert(m_connection != NULL); - assert(m_connection->client != NULL); - try { - /* Just use the default database name for now b/c Hive does not yet support multiple databases */ - m_connection->client->get_schema(m_columns, DEFAULT_DATABASE, m_tables[m_tbl_fetch_idx]); - } catch (Apache::Hadoop::Hive::MetaException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (Apache::Hadoop::Hive::UnknownTableException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (Apache::Hadoop::Hive::UnknownDBException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (...) { - RETURN_FAILURE(__FUNCTION__, - "Unknown Hive get fields error.", err_buf, err_buf_len, HIVE_ERROR); - } - assert(m_columns.size() > 0); /* Every table must have at least one column */ - - return HIVE_SUCCESS; -} - -HiveReturn HiveColumnsResultSet::initializeSchema(char* err_buf, size_t err_buf_len) { - /* Initialize the schema values needed for this resultset. - * OK to hardcode because these fields should never change */ - m_schema.properties[SERIALIZATION_NULL_FORMAT] = DEFAULT_NULL_FORMAT; - - Apache::Hadoop::Hive::FieldSchema tmp_field_schema; - for (unsigned int idx = 0; idx < LENGTH(g_columns_schema); idx++) { - tmp_field_schema.name = g_columns_schema[idx][0]; - tmp_field_schema.type = g_columns_schema[idx][1]; - /* Makes a copy of this tmp FieldSchema */ - m_schema.fieldSchemas.push_back(tmp_field_schema); - } - - /* There should be exactly 18 columns for this resultset */ - assert(m_schema.fieldSchemas.size() == 18); - - return HIVE_SUCCESS; -} - -HiveReturn HiveColumnsResultSet::constructCurrentRow(char* err_buf, size_t err_buf_len) { - /* Clear out the previous row data just to be safe */ - m_curr_row_data.clear(); - - assert(m_fpHiveToSQLType != NULL); - - /* snprintf replaces boost::lexical_cast(...) for string conversions - * due to dev library compatibility issues (may be changed back to boost libs if desired) */ - char string_buffer[MAX_BYTE_LENGTH]; - - /* Fill in the values that we can below, leave the rest to default values */ - HiveColumnDesc column_desc; - column_desc.initialize(m_columns[m_col_fetch_idx]); - int column_num; - for (unsigned int idx = 0; idx < LENGTH(g_columns_schema); idx++) { - /* column_num represents ordinal position instead of index to avoid confusion */ - column_num = idx + 1; - switch (column_num) - { - case 3: // If Col3: TABLE_NAME - m_curr_row_data.push_back(m_tables[m_tbl_fetch_idx]); - break; - - case 4: // If Col4: COLUMN_NAME - m_curr_row_data.push_back(m_columns[m_col_fetch_idx].name); - break; - - case 5: // If Col5: DATA_TYPE - snprintf(string_buffer, sizeof(string_buffer), "%i", - (*m_fpHiveToSQLType)(column_desc.getHiveType())); - m_curr_row_data.push_back(string_buffer); - break; - - case 6: // If Col6: TYPE_NAME - m_curr_row_data.push_back(m_columns[m_col_fetch_idx].type); - break; - - case 7: // If Col7: COLUMN_SIZE - snprintf(string_buffer, sizeof(string_buffer), "%zu", column_desc.getMaxDisplaySize()); - m_curr_row_data.push_back(string_buffer); - break; - - case 8: // If Col8: BUFFER_LENGTH - snprintf(string_buffer, sizeof(string_buffer), "%zu", column_desc.getFieldByteSize()); - m_curr_row_data.push_back(string_buffer); - break; - - case 11: // If Col11: NULLABLE - /* Slight breakage in abstraction: should return SQL_NULLABLE and SQL_NO_NULLS, - * but currently no means to access these values */ - m_curr_row_data.push_back((column_desc.getIsNullable() ? "1" : "0")); - break; - - case 12: // If Col12: REMARKS - m_curr_row_data.push_back(m_columns[m_col_fetch_idx].comment); - break; - - case 14: // If Col14: SQL_DATA_TYPE - snprintf(string_buffer, sizeof(string_buffer), "%i", - (*m_fpHiveToSQLType)(column_desc.getHiveType())); - m_curr_row_data.push_back(string_buffer); - break; - - case 17: // If Col17: ORDINAL_POSITION - snprintf(string_buffer, sizeof(string_buffer), "%i", m_col_fetch_idx + 1); - m_curr_row_data.push_back(string_buffer); - break; - - case 18: // If Col18: IS_NULLABLE - m_curr_row_data.push_back((column_desc.getIsNullable() ? "YES" : "NO")); - break; - - default: // Add in default value - m_curr_row_data.push_back(g_columns_schema[idx][2]); - break; - } - } - - /* There should be exactly 18 columns for this resultset */ - assert(m_curr_row_data.size() == 18); - return HIVE_SUCCESS; -} - diff --git odbc/src/cpp/HiveResultSet.h odbc/src/cpp/HiveResultSet.h deleted file mode 100644 index 25eabc4..0000000 --- odbc/src/cpp/HiveResultSet.h +++ /dev/null @@ -1,190 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file HiveResultSet.h - * @brief Provides the HiveResultSet interface definition and subclasses. - * - *****************************************************************************/ - - -#ifndef __hive_resultset_h__ -#define __hive_resultset_h__ - -#include - -#include "hive_metastore_types.h" - -#include "hiveconstants.h" -#include "HiveConnection.h" -#include "HiveRowSet.h" -#include "HiveColumnDesc.h" - -using namespace std; - - -/************************************************************************************************* - * Base HiveResultSet Class Abstract Declaration - ************************************************************************************************/ - -/** - * @brief HiveResultSet interface definition. - * - * Abstract base class for Hive resultsets. Does not provide any additional logic for - * subclasses, but defines the interface expected for all HiveResultSets. - * All subclasses extending HiveResultSet need to at least implement the below methods. - */ -class HiveResultSet { - public: - virtual ~HiveResultSet() {} ///< The constructor should be defined independently by each subclass - virtual HiveReturn fetchNext(char* err_buf, size_t err_buf_len) =0; - virtual HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len) =0; - virtual HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len) =0; - virtual HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr, - char* err_buf, size_t err_buf_len) =0; - /// The rowset will ONLY be valid after fetchNext has been called at least once - virtual HiveRowSet& getRowSet() =0; -}; - - -/************************************************************************************************* - * HiveQueryResultSet Subclass Declaration - ************************************************************************************************/ - -/** - * @brief A container for the resultsets of Hive queries. - * - * Container class for a query result set (the result of a DBExecute). - * This class was only meant to be created by DBExecute and destroyed by DBCloseResultSet. - * Implements a lazy row/field extraction approach. - * A single instance should only belong to no more than one thread. - * All errors messages will be written to err_buf if err_buf and err_buf_len are provided. - */ -class HiveQueryResultSet: public HiveResultSet { - public: - HiveQueryResultSet(int max_buf_rows); - virtual ~HiveQueryResultSet(); - HiveReturn initialize(HiveConnection* connection, char* err_buf, size_t err_buf_len); - HiveReturn fetchNext(char* err_buf, size_t err_buf_len); - HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len); - HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len); - HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr, char* err_buf, - size_t err_buf_len); - HiveRowSet& getRowSet(); - - private: - HiveConnection* m_connection; ///< Hive connection handle - HiveSerializedRowSet m_serial_rowset; ///< Rowset associated with the current fetched row (if any) - int m_max_buffered_rows; ///< Max number of rows to buffer in client memory - int m_fetch_idx; ///< Last row fetched by the client - bool m_has_results; ///< Indicates that at least one result row has been successfully fetched - bool m_fetch_attempted; ///< Indicates that a Hive server fetch call has successfully executed - vector m_result_set_data; ///< Vector of serialized rows - Apache::Hadoop::Hive::Schema m_schema; ///< Schema of the result table - - HiveReturn initializeSchema(char* err_buf, size_t err_buf_len); - HiveReturn fetchNewResults(char* err_buf, size_t err_buf_len); -}; - - -/************************************************************************************************* - * HiveTablesResultSet Subclass Declaration - ************************************************************************************************/ - -/** - * @brief A container for resultsets describing the database table catalog. - * - * Container class for a pre-scripted table list resultset (the result of a DBTables). - * This class was only meant to be created by DBTables and destroyed by DBCloseResultSet. - * All error messages will be written to err_buf if err_buf and err_buf_len are provided. - * This is a very rudimentary implementation b/c not much table info is available. - */ -class HiveTablesResultSet: public HiveResultSet { - public: - HiveTablesResultSet(); - virtual ~HiveTablesResultSet(); - HiveReturn initialize(HiveConnection* connection, const char* tbl_search_pattern, char* err_buf, - size_t err_buf_len); - HiveReturn fetchNext(char* err_buf, size_t err_buf_len); - HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len); - HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len); - HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr, char* err_buf, - size_t err_buf_len); - HiveRowSet& getRowSet(); - - private: - int m_fetch_idx; ///< Last row fetched by the client - /// OK to use vector b/c greatly simplifies work and class not used often - vector m_curr_row_data; ///< Vector with row data corresponding to row at m_fetch_idx - /// Rowset associated with the current fetched row (if any) - HiveStringVectorRowSet m_vecstring_rowset; - vector m_tables; ///< Vector of table names - Apache::Hadoop::Hive::Schema m_schema; ///< Schema of the result table - - HiveReturn initializeSchema(char* err_buf, size_t err_buf_len); - HiveReturn constructCurrentRow(char* err_buf, size_t err_buf_len); -}; - - -/************************************************************************************************* - * HiveColumnsResultSet Subclass Declaration - ************************************************************************************************/ - -/** - * @brief A container for resultsets describing the columns of table(s). - * - * Container class for a pre-scripted column info resultset (the result of a DBColumns). - * This class was only meant to be created by DBColumns and destroyed by DBCloseResultSet. - * All error messages will be written to err_buf if err_buf and err_buf_len are provided. - * This is a very rudimentary implementation b/c not much column info is available. - */ -class HiveColumnsResultSet: public HiveResultSet { - public: - /// Constructor requires a Hive-to-SQL type convert function pointer as an argument - HiveColumnsResultSet(int(*fpHiveToSQLType)(HiveType)); - virtual ~HiveColumnsResultSet(); - HiveReturn initialize(HiveConnection* connection, const char* tbl_search_pattern, - const char* col_search_pattern, char* err_buf, size_t err_buf_len); - HiveReturn fetchNext(char* err_buf, size_t err_buf_len); - HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len); - HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len); - HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr, char* err_buf, - size_t err_buf_len); - HiveRowSet& getRowSet(); - - private: - HiveConnection* m_connection; ///< Hive connection handle - int (*m_fpHiveToSQLType)(HiveType); ///< Pointer to HiveType to SQLType convert function - int m_tbl_fetch_idx; ///< Last table fetched - int m_col_fetch_idx; ///< Last column fetched - vector m_tables; ///< Vector of table names - vector m_columns; ///< Vector of column field schemas - /// OK to use vector b/c greatly simplifies work and class not used often - vector m_curr_row_data; ///< Vector with constructed row data - /// Rowset associated with the current constructed row (if any) - HiveStringVectorRowSet m_vecstring_rowset; - Apache::Hadoop::Hive::Schema m_schema; ///< Schema of the result table - - HiveReturn getNextTableFields(char* err_buf, size_t err_buf_len); - HiveReturn initializeSchema(char* err_buf, size_t err_buf_len); - HiveReturn constructCurrentRow(char* err_buf, size_t err_buf_len); -}; - - -#endif // __hive_resultset_h__ diff --git odbc/src/cpp/HiveRowSet.cpp odbc/src/cpp/HiveRowSet.cpp deleted file mode 100644 index 3de6124..0000000 --- odbc/src/cpp/HiveRowSet.cpp +++ /dev/null @@ -1,465 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -#include "HiveRowSet.h" -#include "hiveclienthelper.h" - - -/************************************************************************************************* - * Base HiveRowSet Class Logic - ************************************************************************************************/ - -HiveRowSet::HiveRowSet() { - m_is_completely_read = false; - m_bytes_read = 0; - m_last_column_fetched = 0; - m_field_buffer[0] = '\0'; -} - -HiveRowSet::~HiveRowSet() { -} - -void HiveRowSet::reset() { - m_is_completely_read = false; - m_bytes_read = 0; - m_last_column_fetched = 0; - m_field_buffer[0] = '\0'; - /* Non Virtual Calls Pure Virtual Idiom */ - specialized_reset(); /* Call the specialized subclass reset method */ -} - -void HiveRowSet::initFieldBuffer() { - /* m_field_buffer should always correspond to the field indicated by m_last_column_fetched*/ - extractField(m_last_column_fetched); -} - -HiveReturn HiveRowSet::getFieldDataLen(size_t column_idx, size_t* col_len, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(col_len == NULL, __FUNCTION__, - "Pointer to col_len (output) cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - *col_len = getFieldLen(column_idx); - return HIVE_SUCCESS; -} - -HiveReturn HiveRowSet::getFieldAsCString(size_t column_idx, char* buffer, size_t buffer_len, - size_t* data_byte_size, int* is_null_value, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(buffer == NULL, __FUNCTION__, - "Column data output buffer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(is_null_value == NULL, __FUNCTION__, - "Column data is_null_value (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(buffer_len == 0, __FUNCTION__, - "Output buffer cannot have a size of zero.", err_buf, err_buf_len, HIVE_ERROR); - - if (m_last_column_fetched != column_idx) { - extractField(column_idx); - m_bytes_read = 0; /* Reset the read offset if different from the last column fetched */ - m_last_column_fetched = column_idx; - m_is_completely_read = false; - } - if (m_is_completely_read) { - return HIVE_NO_MORE_DATA; /* This field has already been completely fetched by a previous call*/ - } - /* If the column data is the same as the null format spec... */ - if (strcmp(getNullFormat(), m_field_buffer) == 0) { - /* This value must be NULL */ - *is_null_value = 1; - if (data_byte_size != NULL) { - *data_byte_size = 0; - } - buffer[0] = '\0'; - } else { - /* This value has been determined not to be NULL */ - *is_null_value = 0; - size_t data_total_len = getFieldLen(column_idx); - /* Cannot read more data then the total number of bytes available */ - assert(data_total_len >= m_bytes_read); - size_t bytes_remaining = data_total_len - m_bytes_read; // Excludes null char - if (data_byte_size != NULL) { - /* Save the number of remaining characters to return before this fetch */ - *data_byte_size = bytes_remaining; - } - /* Move pointer to the read location */ - const char* src_str_ptr = m_field_buffer + m_bytes_read; - /* The total number of bytes to read (+1 null terminator) should be no more than the - * size of the field buffer */ - assert(m_bytes_read + bytes_remaining + 1 <= sizeof(m_field_buffer)); - /* Copy as many characters as possible from the read location */ - size_t bytes_copied = safe_strncpy(buffer, src_str_ptr, min(buffer_len, bytes_remaining + 1)); // +1 for null terminator - /* bytes_copied does not count the null terminator */ - m_bytes_read += bytes_copied; - if (m_bytes_read < data_total_len) { - return HIVE_SUCCESS_WITH_MORE_DATA; /* Data truncated; more data to return */ - } - } - m_is_completely_read = true; - return HIVE_SUCCESS; /* All data successfully read */ -} - -HiveReturn HiveRowSet::getFieldAsDouble(size_t column_idx, double* buffer, int* is_null_value, - char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(buffer == NULL, __FUNCTION__, - "Column data output buffer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(is_null_value == NULL, __FUNCTION__, - "Column data is_null_value (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - if (m_last_column_fetched != column_idx) { - /* Reset if this column was not fetched on the last attempt */ - extractField(column_idx); - m_bytes_read = 0; /* Reset the read offset if different from the last column fetched */ - m_last_column_fetched = column_idx; - m_is_completely_read = false; - } - if (m_is_completely_read) { - return HIVE_NO_MORE_DATA; /* This column has already been completely fetched */ - } - /* If the column data is the same as the nullformat spec... */ - if (strcmp(getNullFormat(), m_field_buffer) == 0) { - *is_null_value = 1; - *buffer = 0.0; - } else { - *is_null_value = 0; - *buffer = atof(m_field_buffer); - } - m_is_completely_read = true; - return HIVE_SUCCESS; -} - -HiveReturn HiveRowSet::getFieldAsInt(size_t column_idx, int* buffer, int* is_null_value, - char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(buffer == NULL, __FUNCTION__, - "Column data output buffer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(is_null_value == NULL, __FUNCTION__, - "Column data is_null_value (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - if (m_last_column_fetched != column_idx) { - extractField(column_idx); - m_bytes_read = 0; /* Reset the read offset if different from the last column fetched */ - m_last_column_fetched = column_idx; - m_is_completely_read = false; - } - if (m_is_completely_read) { - return HIVE_NO_MORE_DATA; /* This column has already been completely fetched */ - } - /* If the column data is the same as the null format spec... */ - if (strcmp(getNullFormat(), m_field_buffer) == 0) { - *is_null_value = 1; - *buffer = 0; - } else { - *is_null_value = 0; - *buffer = atoi(m_field_buffer); - } - m_is_completely_read = true; - return HIVE_SUCCESS; -} - -HiveReturn HiveRowSet::getFieldAsLong(size_t column_idx, long* buffer, int* is_null_value, - char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(buffer == NULL, __FUNCTION__, - "Column data output buffer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(is_null_value == NULL, __FUNCTION__, - "Column data is_null_value (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - if (m_last_column_fetched != column_idx) { - extractField(column_idx); - m_bytes_read = 0; /* Reset the read offset if different from the last column fetched */ - m_last_column_fetched = column_idx; - m_is_completely_read = false; - } - if (m_is_completely_read) { - return HIVE_NO_MORE_DATA; /* This column has already been completely fetched */ - } - /* If the column data is the same as the null format spec... */ - if (strcmp(getNullFormat(), m_field_buffer) == 0) { - *is_null_value = 1; - *buffer = 0; - } else { - *is_null_value = 0; - *buffer = atol(m_field_buffer); - } - m_is_completely_read = true; - return HIVE_SUCCESS; -} - -HiveReturn HiveRowSet::getFieldAsULong(size_t column_idx, unsigned long* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(buffer == NULL, __FUNCTION__, - "Column data output buffer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(is_null_value == NULL, __FUNCTION__, - "Column data is_null_value (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - if (m_last_column_fetched != column_idx) { - extractField(column_idx); - m_bytes_read = 0; /* Reset the read offset if different from the last column fetched */ - m_last_column_fetched = column_idx; - m_is_completely_read = false; - } - if (m_is_completely_read) { - return HIVE_NO_MORE_DATA; /* This column has already been completely fetched */ - } - /* If the column data is the same as the null format spec... */ - if (strcmp(getNullFormat(), m_field_buffer) == 0) { - *is_null_value = 1; - *buffer = 0; - } else { - *is_null_value = 0; - *buffer = strtoul(m_field_buffer, NULL, 10); - } - m_is_completely_read = true; - return HIVE_SUCCESS; -} - -HiveReturn HiveRowSet::getFieldAsI64(size_t column_idx, int64_t* buffer, int* is_null_value, - char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(buffer == NULL, __FUNCTION__, - "Column data output buffer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(is_null_value == NULL, __FUNCTION__, - "Column data is_null_value (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - if (m_last_column_fetched != column_idx) { - extractField(column_idx); - m_bytes_read = 0; /* Reset the read offset if different from the last column fetched */ - m_last_column_fetched = column_idx; - m_is_completely_read = false; - } - if (m_is_completely_read) { - return HIVE_NO_MORE_DATA; /* This column has already been completely fetched */ - } - /* If the column data is the same as the null format spec... */ - if (strcmp(getNullFormat(), m_field_buffer) == 0) { - *is_null_value = 1; - *buffer = 0; - } else { - *is_null_value = 0; - *buffer = ATOI64(m_field_buffer); - } - m_is_completely_read = true; - return HIVE_SUCCESS; -} - -HiveReturn HiveRowSet::getFieldAsI64U(size_t column_idx, uint64_t* buffer, int* is_null_value, - char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(buffer == NULL, __FUNCTION__, - "Column data output buffer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(is_null_value == NULL, __FUNCTION__, - "Column data is_null_value (output) cannot be NULL.", err_buf, err_buf_len, - HIVE_ERROR); - RETURN_ON_ASSERT(getColumnCount() == 0, __FUNCTION__, - "Rowset contains zero columns.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(column_idx >= getColumnCount(), __FUNCTION__, - "Column index out of bounds.", err_buf, err_buf_len, HIVE_ERROR); - - if (m_last_column_fetched != column_idx) { - extractField(column_idx); - m_bytes_read = 0; /* Reset the read offset if different from the last column fetched */ - m_last_column_fetched = column_idx; - m_is_completely_read = false; - } - if (m_is_completely_read) { - return HIVE_NO_MORE_DATA; /* This column has already been completely fetched */ - } - /* If the column data is the same as the null format spec... */ - if (strcmp(getNullFormat(), m_field_buffer) == 0) { - *is_null_value = 1; - *buffer = 0; - } else { - *is_null_value = 0; - *buffer = ATOI64U(m_field_buffer); - } - m_is_completely_read = true; - return HIVE_SUCCESS; -} - -/************************************************************************************************* - * HiveSerializedRowSet Subclass Definition - ************************************************************************************************/ - -HiveSerializedRowSet::HiveSerializedRowSet() { - m_row_weak_ptr = NULL; - m_null_format_weak_ptr = NULL; -} - -HiveSerializedRowSet::~HiveSerializedRowSet() { - /* Nothing to deallocate */ -} - -void HiveSerializedRowSet::initialize(Apache::Hadoop::Hive::Schema& schema, string& serialized_row) { - m_row_weak_ptr = &serialized_row; - /* Allocate sufficient space to prevent further resizing */ - m_field_offsets.reserve(schema.fieldSchemas.size()); - initializeOffsets(schema, serialized_row); // Initialize m_field_offsets - assert(m_field_offsets.size() == schema.fieldSchemas.size()); - assert(schema.properties[SERIALIZATION_NULL_FORMAT].length() > 0); - m_null_format_weak_ptr = &(schema.properties[SERIALIZATION_NULL_FORMAT]); - /* Synchronize m_field_buffer and m_last_column_fetched now that extractField() works */ - initFieldBuffer(); -} - -/* This method should never be called outside of the inherited HiveRowSet::reset() */ -void HiveSerializedRowSet::specialized_reset() { - m_row_weak_ptr = NULL; - m_field_offsets.clear(); - m_null_format_weak_ptr = NULL; -} - -void HiveSerializedRowSet::initializeOffsets(Apache::Hadoop::Hive::Schema& schema, string& serialized_row) { - m_field_offsets.push_back(0); // There will always be at least one column - // Keep a temporary field_delim reference so we don't have to keep using the map - string& field_delim(schema.properties[FIELD_DELIM]); - assert(field_delim.length() > 0); - - // Assumes that field delimiters will only be one character - size_t idx = serialized_row.find_first_of(field_delim); - while (idx != string::npos) { - // Set the field offset to the start of the following field - m_field_offsets.push_back(idx + 1); - idx = serialized_row.find_first_of(field_delim, idx + 1); - } -} - -size_t HiveSerializedRowSet::getColumnCount() { - return m_field_offsets.size(); -} - -const char* HiveSerializedRowSet::getNullFormat() { - assert(m_null_format_weak_ptr != NULL); - return m_null_format_weak_ptr->c_str(); -} - -size_t HiveSerializedRowSet::getFieldLen(size_t column_idx) { - assert(column_idx < getColumnCount()); - assert(m_row_weak_ptr != NULL); - size_t len; - // If this is the last column... - if (column_idx == getColumnCount() - 1) { - assert(m_row_weak_ptr->length() >= m_field_offsets[column_idx]); - len = m_row_weak_ptr->length() - m_field_offsets[column_idx]; - } else { - assert(m_field_offsets[column_idx + 1] > m_field_offsets[column_idx]); - len = m_field_offsets[column_idx + 1] - m_field_offsets[column_idx] - 1; - } - /* Enforce the constraint that no data exceed MAX_BYTE_LENGTH */ - len = min(len, (size_t) MAX_BYTE_LENGTH); - return len; -} - -void HiveSerializedRowSet::extractField(size_t column_idx) { - assert(column_idx < getColumnCount()); - assert(m_row_weak_ptr != NULL); - /* The field buffer should always be large enough to hold the field */ - assert(getFieldLen(column_idx) < sizeof(m_field_buffer)); - /* Just safety precaution to prevent buffer overflow */ - /* Reduce buffer size by one to save space for null terminator */ - size_t extract_len = min(getFieldLen(column_idx), sizeof(m_field_buffer) - 1); - size_t copied = m_row_weak_ptr->copy(m_field_buffer, extract_len, m_field_offsets[column_idx]); - assert(copied == extract_len); - /* Make sure the buffer is null terminated */ - m_field_buffer[extract_len] = '\0'; -} - -/************************************************************************************************* - * HiveStringVectorRowSet Subclass Definition - ************************************************************************************************/ - -HiveStringVectorRowSet::HiveStringVectorRowSet() { - m_fields_weak_ptr = NULL; - m_null_format_weak_ptr = NULL; -} - -HiveStringVectorRowSet::~HiveStringVectorRowSet() { - /* Nothing to deallocate */ -} - -void HiveStringVectorRowSet::initialize(Apache::Hadoop::Hive::Schema& schema, vector* fields) { - assert(fields != NULL); - m_fields_weak_ptr = fields; - assert(schema.properties[SERIALIZATION_NULL_FORMAT].length() > 0); - m_null_format_weak_ptr = &(schema.properties[SERIALIZATION_NULL_FORMAT]); - /* Synchronize m_field_buffer and m_last_column_fetched now that extractField() works */ - initFieldBuffer(); -} - -/* This method should never be called outside of the inherited HiveRowSet::reset() */ -void HiveStringVectorRowSet::specialized_reset() { - m_fields_weak_ptr = NULL; - m_null_format_weak_ptr = NULL; -} - -size_t HiveStringVectorRowSet::getColumnCount() { - assert(m_fields_weak_ptr != NULL); - return m_fields_weak_ptr->size(); -} - -const char* HiveStringVectorRowSet::getNullFormat() { - assert(m_null_format_weak_ptr != NULL); - return m_null_format_weak_ptr->c_str(); -} - -size_t HiveStringVectorRowSet::getFieldLen(size_t column_idx) { - assert(column_idx < getColumnCount()); - assert(m_fields_weak_ptr != NULL); - size_t len = m_fields_weak_ptr->at(column_idx).length(); - /* Enforce the constraint that no data exceed MAX_BYTE_LENGTH */ - len = min(len, (size_t) MAX_BYTE_LENGTH); - return len; -} - -void HiveStringVectorRowSet::extractField(size_t column_idx) { - assert(column_idx < getColumnCount()); - assert(m_fields_weak_ptr != NULL); - safe_strncpy(m_field_buffer, m_fields_weak_ptr->at(column_idx).c_str(), sizeof(m_field_buffer)); -} - - diff --git odbc/src/cpp/HiveRowSet.h odbc/src/cpp/HiveRowSet.h deleted file mode 100644 index ca6e6af..0000000 --- odbc/src/cpp/HiveRowSet.h +++ /dev/null @@ -1,168 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file HiveRowSet.h - * @brief Provides the HiveRowSet interface and subclasses. - * - *****************************************************************************/ - - -#ifndef __hive_rowset_h__ -#define __hive_rowset_h__ - -#include - -#include "hive_metastore_types.h" - -#include "hiveconstants.h" -#include "thriftserverconstants.h" - -using namespace std; - - -/************************************************************************************************* - * Base HiveRowSet Class Abstract Declaration - ************************************************************************************************/ - -/** - * @brief HiveRowSet interface definition. - * - * Abstract base class for Hive rowsets. Provides the logic to extract fields as various - * data types, allowing subclasses to focus on the storage and field parsing of the data. - */ -class HiveRowSet { - public: - /// Cannot be called directly, but should be called automatically from subclass constructors - HiveRowSet(); - virtual ~HiveRowSet(); - void reset(); ///< Not overrideable, implement specialized_reset() instead - HiveReturn getFieldDataLen(size_t column_idx, size_t* col_len, char* err_buf, size_t err_buf_len); - HiveReturn getFieldAsCString(size_t column_idx, char* buffer, size_t buffer_len, - size_t* data_byte_size, int* is_null_value, char* err_buf, - size_t err_buf_len); - HiveReturn getFieldAsDouble(size_t column_idx, double* buffer, int* is_null_value, char* err_buf, - size_t err_buf_len); - HiveReturn getFieldAsInt(size_t column_idx, int* buffer, int* is_null_value, char* err_buf, - size_t err_buf_len); - HiveReturn getFieldAsLong(size_t column_idx, long* buffer, int* is_null_value, char* err_buf, - size_t err_buf_len); - HiveReturn getFieldAsULong(size_t column_idx, unsigned long* buffer, int* is_null_value, - char* err_buf, size_t err_buf_len); - HiveReturn getFieldAsI64(size_t column_idx, int64_t* buffer, int* is_null_value, char* err_buf, - size_t err_buf_len); - HiveReturn getFieldAsI64U(size_t column_idx, uint64_t* buffer, int* is_null_value, char* err_buf, - size_t err_buf_len); - - protected: - /// Forces all data retrieved to be no more than MAX_BYTE_LENGTH - char m_field_buffer[MAX_BYTE_LENGTH + 1]; - - /** - * @brief Initializes m_field_buffer with the field indicated by m_last_column_fetched. - * - * Not overrideable, used by subclasses to synchronize m_field_buffer and m_last_column_fetched; - * should be called by every subclass immediately after initialization. This is necessary at - * the beginning to make sure that m_field_buffer will always have the field data indicated - * by m_last_column_fetched. - */ - void initFieldBuffer(); - - private: - bool m_is_completely_read; - size_t m_last_column_fetched; - /// Number of bytes read out of m_last_column_fetched since the last consecutive call - size_t m_bytes_read; - - virtual void specialized_reset() =0; ///< Called by HiveRowSet::reset() - virtual size_t getColumnCount() =0; ///< Only used within this class hierarchy for error checking - virtual const char* getNullFormat() =0; ///< Should return a pointer to a locally stored C string - virtual size_t getFieldLen(size_t column_idx) =0; - /// Should copy the field data as a C string to m_field_buffer - virtual void extractField(size_t column_idx) =0; -}; - - -/************************************************************************************************* - * HiveSerializedRowSet Subclass Declaration - ************************************************************************************************/ - -/** - * @brief Container class for a fetched row from a HiveResultSet where each row is a serialized string. - * - * Container class for a fetched row from a HiveResultSet where each row is a serialized string. - * - HiveSerializedRowSet is completely dependent on associated HiveResultSet and should not - * be used independently; must always remain bound to associated HiveResultSet. - * - Assumes the associated HiveResultSet manages the memory of all weak pointer members - * - Constructed within the HiveResultSet by calling DBFetch - * - All errors messages will be written to err_buf if err_buf and err_buf_len are provided - */ -class HiveSerializedRowSet: public HiveRowSet { - public: - HiveSerializedRowSet(); - virtual ~HiveSerializedRowSet(); - void initialize(Apache::Hadoop::Hive::Schema& schema, string& serialized_row); - - private: - string* m_row_weak_ptr; ///< Weak pointer to the row string associated with m_field_offsets - vector m_field_offsets; ///< Indexes into the serialized row string of column starting points - string* m_null_format_weak_ptr; ///< Weak pointer to NULL format representation for this row - - void specialized_reset(); - void initializeOffsets(Apache::Hadoop::Hive::Schema& schema, string& serialized_row); - size_t getColumnCount(); - const char* getNullFormat(); - size_t getFieldLen(size_t column_idx); - void extractField(size_t column_idx); -}; - - -/************************************************************************************************* - * HiveStringVectorRowSet Subclass Declaration - ************************************************************************************************/ - -/** - * @brief Container class for a fetched row from a HiveResultSet where each row is vector of string fields. - * - * Container class for a fetched row from a HiveResultSet where each row is vector of string fields - * - HiveStringVectorRowSet is completely dependent on associated HiveResultSet and should not - * be used independently; must always remain bound to associated HiveResultSet. - * - Assumes the associated HiveResultSet manages the memory of all weak pointer members - * - Constructed within the HiveResultSet by calling DBFetch - * - All errors messages will be written to err_buf if err_buf and err_buf_len are provided - */ -class HiveStringVectorRowSet: public HiveRowSet { - public: - HiveStringVectorRowSet(); - virtual ~HiveStringVectorRowSet(); - void initialize(Apache::Hadoop::Hive::Schema& schema, vector* fields); - - private: - vector* m_fields_weak_ptr; ///< Weak pointer to a vector of fields represented as strings - string* m_null_format_weak_ptr; ///< Weak pointer to NULL format representation for this row - - void specialized_reset(); - size_t getColumnCount(); - const char* getNullFormat(); - size_t getFieldLen(size_t column_idx); - void extractField(size_t column_idx); -}; - - -#endif // __hive_rowset_h__ diff --git odbc/src/cpp/hiveclient.cpp odbc/src/cpp/hiveclient.cpp deleted file mode 100644 index 450eb0b..0000000 --- odbc/src/cpp/hiveclient.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include - -#include "ThriftHive.h" -#include -#include -#include -#include - -#include "hiveclient.h" -#include "hiveclienthelper.h" -#include "HiveColumnDesc.h" -#include "HiveConnection.h" -#include "HiveResultSet.h" -#include "HiveRowSet.h" - - -using namespace std; -using namespace boost; -using namespace apache::thrift::protocol; -using namespace apache::thrift::transport; - - -/***************************************************************** - * Global Hive Client Functions (usable as C callback functions) - *****************************************************************/ - -HiveConnection* DBOpenConnection(const char* database, const char* host, int port, int framed, - char* err_buf, size_t err_buf_len) { - // TODO: add in database selection when Hive supports this feature - shared_ptr socket(new TSocket(host, port)); - shared_ptr transport; - - if (framed) { - shared_ptr framedSocket(new TFramedTransport(socket)); - transport = framedSocket; - } else { - shared_ptr bufferedSocket(new TBufferedTransport(socket)); - transport = bufferedSocket; - } - - shared_ptr protocol(new TBinaryProtocol(transport)); - shared_ptr client(new Apache::Hadoop::Hive::ThriftHiveClient(protocol)); - try { - transport->open(); - } catch (TTransportException& ttx) { - RETURN_FAILURE(__FUNCTION__, ttx.what(), err_buf, err_buf_len, NULL); - } catch (...) { - RETURN_FAILURE(__FUNCTION__, - "Unable to connect to Hive server.", err_buf, err_buf_len, NULL); - } - - HiveConnection* conn = new HiveConnection(client, transport); - return conn; -} - -HiveReturn DBCloseConnection(HiveConnection* connection, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(connection == NULL, __FUNCTION__, - "Hive connection cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(connection->transport == NULL, __FUNCTION__, - "Hive connection transport cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - try { - connection->transport->close(); - } catch (...) { - /* Ignore the exception, we just want to clean up everything... */ - } - delete connection; - return HIVE_SUCCESS; -} - -HiveReturn DBExecute(HiveConnection* connection, const char* query, HiveResultSet** resultset_ptr, - int max_buf_rows, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(connection == NULL, __FUNCTION__, - "Hive connection cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(connection->client == NULL, __FUNCTION__, - "Hive connection client cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - RETURN_ON_ASSERT(query == NULL, __FUNCTION__, - "Query string cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - - // TODO: remove - string query_str(query); - // TODO: this may not need to happen if Hive allows for multiple successive queries in - // one execute statement (and permits a terminating semicolon). - /* Strip off a query's terminating semicolon if it exists */ - trim(query_str); /* Trim white space from string to check if last character is semicolon */ - if (query_str.length() > 0 && query_str[query_str.length() - 1] == ';') { - query_str.erase(query_str.length() - 1); - } - - /* Pass the query onto the Hive server for execution */ - /* Query execution is kept separate from the resultset b/c results may not always be needed (i.e. DML) */ - try { - connection->client->execute(query_str); /* This is currently implemented as a blocking operation */ - } catch (Apache::Hadoop::Hive::HiveServerException& ex) { - RETURN_FAILURE(__FUNCTION__, ex.what(), err_buf, err_buf_len, HIVE_ERROR); - } catch (...) { - RETURN_FAILURE(__FUNCTION__, - "Unknown Hive query execution error.", err_buf, err_buf_len, HIVE_ERROR); - } - - /* resultset_ptr may be NULL if the caller does not care about the result */ - if (resultset_ptr != NULL) { - HiveQueryResultSet* query_resultset = new HiveQueryResultSet(max_buf_rows); - *resultset_ptr = query_resultset; /* Store into generic HiveResultSet pointer */ - return query_resultset->initialize(connection, err_buf, err_buf_len); - } - return HIVE_SUCCESS; -} - -HiveReturn DBTables(HiveConnection* connection, const char* tbl_search_pattern, - HiveResultSet** resultset_ptr, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset_ptr == NULL, __FUNCTION__, - "Resultset pointer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - - HiveTablesResultSet* tables_resultset = new HiveTablesResultSet(); - *resultset_ptr = tables_resultset; /* Store into generic HiveResultSet pointer */ - return tables_resultset->initialize(connection, tbl_search_pattern, err_buf, err_buf_len); -} - -HiveReturn DBColumns(HiveConnection* connection, int(*fpHiveToSQLType)(HiveType), - const char* tbl_search_pattern, const char* col_search_pattern, - HiveResultSet** resultset_ptr, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset_ptr == NULL, __FUNCTION__, - "Resultset pointer cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - - HiveColumnsResultSet* columns_resultset = new HiveColumnsResultSet(fpHiveToSQLType); - *resultset_ptr = columns_resultset; /* Store into generic HiveResultSet pointer */ - return columns_resultset->initialize(connection, tbl_search_pattern, col_search_pattern, err_buf, - err_buf_len); -} - -HiveReturn DBCloseResultSet(HiveResultSet* resultset, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - delete resultset; - return HIVE_SUCCESS; -} - -HiveReturn DBFetch(HiveResultSet* resultset, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->fetchNext(err_buf, err_buf_len); -} - -HiveReturn DBHasResults(HiveResultSet* resultset, int* has_results, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->hasResults(has_results, err_buf, err_buf_len); -} - -HiveReturn DBGetColumnCount(HiveResultSet* resultset, size_t* col_count, char* err_buf, - size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getColumnCount(col_count, err_buf, err_buf_len); -} - -HiveReturn DBCreateColumnDesc(HiveResultSet* resultset, size_t column_idx, - HiveColumnDesc** column_desc_ptr, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->createColumnDesc(column_idx, column_desc_ptr, err_buf, err_buf_len); -} - -HiveReturn DBGetFieldDataLen(HiveResultSet* resultset, size_t column_idx, size_t* col_len, - char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldDataLen(column_idx, col_len, err_buf, err_buf_len); -} - -HiveReturn DBGetFieldAsCString(HiveResultSet* resultset, size_t column_idx, char* buffer, - size_t buffer_len, size_t* data_byte_size, int* is_null_value, - char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldAsCString(column_idx, buffer, buffer_len, data_byte_size, - is_null_value, err_buf, err_buf_len); -} - -HiveReturn DBGetFieldAsDouble(HiveResultSet* resultset, size_t column_idx, double* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldAsDouble(column_idx, buffer, is_null_value, err_buf, - err_buf_len); -} - -HiveReturn DBGetFieldAsInt(HiveResultSet* resultset, size_t column_idx, int* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldAsInt(column_idx, buffer, is_null_value, err_buf, - err_buf_len); -} - -HiveReturn DBGetFieldAsLong(HiveResultSet* resultset, size_t column_idx, long* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldAsLong(column_idx, buffer, is_null_value, err_buf, - err_buf_len); -} - -HiveReturn DBGetFieldAsULong(HiveResultSet* resultset, size_t column_idx, unsigned long* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldAsULong(column_idx, buffer, is_null_value, err_buf, - err_buf_len); -} - -HiveReturn DBGetFieldAsI64(HiveResultSet* resultset, size_t column_idx, int64_t* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldAsI64(column_idx, buffer, is_null_value, err_buf, - err_buf_len); -} - -HiveReturn DBGetFieldAsI64U(HiveResultSet* resultset, size_t column_idx, uint64_t* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(resultset == NULL, __FUNCTION__, - "Hive resultset cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - return resultset->getRowSet().getFieldAsI64U(column_idx, buffer, is_null_value, err_buf, - err_buf_len); -} - -HiveReturn DBCloseColumnDesc(HiveColumnDesc* column_desc, char* err_buf, size_t err_buf_len) { - RETURN_ON_ASSERT(column_desc == NULL, __FUNCTION__, - "Hive column descriptor cannot be NULL.", err_buf, err_buf_len, HIVE_ERROR); - delete column_desc; - return HIVE_SUCCESS; -} - -/* Forego the error message handling in these accessor functions b/c of trivial implementations */ -void DBGetColumnName(HiveColumnDesc* column_desc, char* buffer, size_t buffer_len) { - assert(column_desc != NULL); - assert(buffer != NULL); - column_desc->getColumnName(buffer, buffer_len); -} - -void DBGetColumnType(HiveColumnDesc* column_desc, char* buffer, size_t buffer_len) { - assert(column_desc != NULL); - assert(buffer != NULL); - column_desc->getColumnType(buffer, buffer_len); -} - -HiveType DBGetHiveType(HiveColumnDesc* column_desc) { - assert(column_desc != NULL); - return column_desc->getHiveType(); -} - -int DBGetIsNullable(HiveColumnDesc* column_desc) { - assert(column_desc != NULL); - return column_desc->getIsNullable(); -} - -int DBGetIsCaseSensitive(HiveColumnDesc* column_desc) { - assert(column_desc != NULL); - return column_desc->getIsCaseSensitive(); -} - -size_t DBGetMaxDisplaySize(HiveColumnDesc* column_desc) { - assert(column_desc != NULL); - return column_desc->getMaxDisplaySize(); -} - -size_t DBGetFieldByteSize(HiveColumnDesc* column_desc) { - assert(column_desc != NULL); - return column_desc->getFieldByteSize(); -} - diff --git odbc/src/cpp/hiveclient.h odbc/src/cpp/hiveclient.h deleted file mode 100644 index f1af670..0000000 --- odbc/src/cpp/hiveclient.h +++ /dev/null @@ -1,598 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file hiveclient.h - * @brief Hive client library interface. - * - * This header file defines the Hive client library interface (C compatible). - * All interactions with Hive client should be directed through the following - * declared functions. - * - * Here is an example of a typical order with which to call these functions: - * - * DBOpenConnection - * ..-> DBExecute or DBTables or DBColumns - * ..-> DBCreateColumnDesc - * ....-> DBGetColumnName - * ....-> DBGetColumnType - * ....-> DBGetHiveType - * ....-> DBGetIsNullable - * ....-> DBGetIsCaseSensitive - * ....-> DBGetMaxDisplaySize - * ....-> DBGetFieldByteSize - * ....-> DBCloseColumnDesc - * ..-> DBHasResults - * ..-> DBGetColumnCount - * ..-> DBFetch - * ....-> DBGetFieldDataLen - * ....-> DBGetFieldAsCString - * ....-> DBGetFieldAsDouble - * ....-> DBGetFieldAsInt - * ....-> DBGetFieldAsLong - * ....-> DBGetFieldAsULong - * ....-> DBGetFieldAsI64 - * ....-> DBGetFieldAsI64U - * ..-> DBCloseResultSet - * ..-> DBCloseConnection - * - *****************************************************************************/ - - -#ifndef __hive_client_h__ -#define __hive_client_h__ - -#ifndef __STDC_FORMAT_MACROS -#define __STDC_FORMAT_MACROS -#endif -#include -#include - -#include "hiveconstants.h" - - -/****************************************************************************** - * Hive Client C++ Class Placeholders - *****************************************************************************/ - -typedef enum HiveReturn HiveReturn; -typedef enum HiveType HiveType; -typedef struct HiveConnection HiveConnection; -typedef struct HiveResultSet HiveResultSet; -typedef struct HiveColumnDesc HiveColumnDesc; - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - - -/****************************************************************************** - * Global Hive Client Functions (usable as C callback functions) - *****************************************************************************/ - -/** - * @brief Connect to a Hive database. - * - * Connects to a Hive database on the specified Hive server. The caller takes - * ownership of the returned HiveConnection and is responsible for deallocating - * the memory and connection by calling DBCloseConnection. - * - * @see DBCloseConnection() - * - * @param database Name of the Hive database on the Hive server to which to connect. - * @param host Host address of the Hive server. - * @param port Host port of the Hive server. - * @param framed Set as 1 to use a framed socket, or 0 to use a buffered socket. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return A HiveConnection object representing the established database connection, - * or NULL if an error occurred. Error messages will be stored in err_buf. - */ -HiveConnection* DBOpenConnection(const char* database, const char* host, int port, int framed, - char* err_buf, size_t err_buf_len); - -/** - * @brief Disconnects from a Hive database. - * - * Disconnects from a Hive database and destroys the supplied HiveConnection object. - * This function should eventually be called for every HiveConnection created by - * DBOpenConnection. - * - * @see DBOpenConnection() - * - * @param connection A HiveConnection object associated a database connection. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBCloseConnection(HiveConnection* connection, char* err_buf, size_t err_buf_len); - -/** - * @brief Execute a query. - * - * Executes a query on a Hive connection and associates a HiveResultSet with the result. - * Caller takes ownership of returned HiveResultSet and is responsible for deallocating - * the object by calling DBCloseResultSet. - * - * @see DBCloseResultSet() - * - * @param connection A HiveConnection object associated a database connection. - * @param query The Hive query string to be executed. - * @param resultset_ptr A pointer to a HiveResultSet pointer which will be associated with the - * result, or NULL if the result is not needed. - * @param max_buf_rows Maximum number of rows to buffer in the new HiveResultSet for the query - * results - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBExecute(HiveConnection* connection, const char* query, HiveResultSet** resultset_ptr, - int max_buf_rows, char* err_buf, size_t err_buf_len); - -/** - * @brief Query for database tables. - * - * Gets a resultset containing the set of tables in the database matching a regex pattern. - * Caller takes ownership of returned HiveResultSet and is responsible for deallocating - * the object by calling DBCloseResultSet. - * - * @see DBCloseResultSet() - * - * @param connection A HiveConnection object associated a database connection. - * @param tbl_search_pattern A regex pattern used to match with table names (use '*' to match all). - * @param resultset_ptr A pointer to a HiveResultSet pointer which will be associated with the - * result. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBTables(HiveConnection* connection, const char* tbl_search_pattern, - HiveResultSet** resultset_ptr, char* err_buf, size_t err_buf_len); - -/** - * @brief Query for columns in table(s). - * - * Gets a resultset containing the set of columns in the database matching a regex pattern - * from a set of tables matching another regex pattern. Caller takes ownership of returned - * HiveResultSet and is responsible for deallocating the object by calling DBCloseResultSet. - * - * @see DBCloseResultSet() - * - * @param connection A HiveConnection object associated with a database connection. - * @param fpHiveToSQLType Pointer to a function that takes a HiveType argument and returns a - * corresponding int value (possibly a SQL type). - * @param tbl_search_pattern A regex pattern used to match with table names (use '*' to match all). - * @param col_search_pattern A regex pattern used to match with column names (use '*' to match all). - * @param resultset_ptr A pointer to a HiveResultSet pointer which will be associated with the - * result. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBColumns(HiveConnection* connection, int (*fpHiveToSQLType)(HiveType), - const char* tbl_search_pattern, const char* col_search_pattern, - HiveResultSet** resultset_ptr, char* err_buf, size_t err_buf_len); - -/** - * @brief Destroys any specified HiveResultSet object. - * - * Destroys any specified HiveResultSet object. The HiveResultSet may have been - * created by a number of other functions. - * - * @param resultset A HiveResultSet object to be removed from memory. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBCloseResultSet(HiveResultSet* resultset, char* err_buf, size_t err_buf_len); - -/** - * @brief Fetches the next unfetched row in a HiveResultSet. - * - * Fetches the next unfetched row in a HiveResultSet. The fetched row will be stored - * internally within the resultset and may be accessed through other DB functions. - * - * @param resultset A HiveResultSet from which to fetch rows. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, - * HIVE_ERROR if an error occurred, - * HIVE_NO_MORE_DATA if there are no more rows to fetch. - * (error messages will be stored in err_buf) - */ -HiveReturn DBFetch(HiveResultSet* resultset, char* err_buf, size_t err_buf_len); - -/** - * @brief Check for results. - * - * Determines whether the HiveResultSet has ever had any result rows. - * - * @param resultset A HiveResultSet from which to check for results. - * @param has_results Pointer to an int which will be set to 1 if results, 0 if no results. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBHasResults(HiveResultSet* resultset, int* has_results, char* err_buf, - size_t err_buf_len); - -/** - * @brief Determines the number of columns in the HiveResultSet. - * - * @param resultset A HiveResultSet from which to retrieve the column count. - * @param col_count Pointer to a size_t which will be set to the number of columns in the result. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBGetColumnCount(HiveResultSet* resultset, size_t* col_count, char* err_buf, - size_t err_buf_len); - -/** - * @brief Construct a HiveColumnDesc. - * - * Constructs a HiveColumnDesc with information about a specified column in the resultset. - * Caller takes ownership of returned HiveColumnDesc and is responsible for deallocating - * the object by calling DBCloseColumnDesc. - * - * @see DBCloseColumnDesc() - * - * @param resultset A HiveResultSet context from which to construct the HiveColumnDesc. - * @param column_idx Zero offset index of a column. - * @param column_desc_ptr A pointer to a HiveColumnDesc pointer which will receive the new - * HiveColumnDesc. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBCreateColumnDesc(HiveResultSet* resultset, size_t column_idx, - HiveColumnDesc** column_desc_ptr, char* err_buf, size_t err_buf_len); - -/** - * @brief Find the size of a field as a string. - * - * Determines the number of characters needed to display a field stored in the fetched row - * of a HiveResultSet. - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param col_len Pointer to an size_t which will be set to the byte length of the specified field. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBGetFieldDataLen(HiveResultSet* resultset, size_t column_idx, size_t* col_len, - char* err_buf, size_t err_buf_len); - -/** - * @brief Get a field as a C string. - * - * Reads out a field from the currently fetched rowset in a resultset as a C String. - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param buffer Pointer to a buffer that will receive the data. - * @param buffer_len Number of bytes allocated to buffer. - * @param data_byte_size Pointer to an size_t which will contain the length of the data available - * to return before calling this function. Can be set to NULL if this - * information is not needed. - * @param is_null_value Pointer to an int which will be set to 1 if the field contains a NULL value, - * or 0 otherwise. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful and there is no more data to fetch - * HIVE_ERROR if an error occurred (error messages will be stored in err_buf) - * HIVE_SUCCESS_WITH_MORE_DATA if data has been successfully fetched, but there is still - * more data to get - * HIVE_NO_MORE_DATA if this field has already been completely fetched - */ -HiveReturn DBGetFieldAsCString(HiveResultSet* resultset, size_t column_idx, char* buffer, - size_t buffer_len, size_t* data_byte_size, int* is_null_value, - char* err_buf, size_t err_buf_len); - -/** - * @brief Get a field as a double. - * - * Reads out a field from the currently fetched rowset in a resultset as a double - * (platform specific). - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param buffer Pointer to a double that will receive the data. - * @param is_null_value Pointer to an int which will be set to 1 if the field contains a NULL value, - * or 0 otherwise - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful. - * HIVE_ERROR if an error occurred (error messages will be stored in err_buf) - * HIVE_NO_MORE_DATA if this field has already been fetched - */ -HiveReturn DBGetFieldAsDouble(HiveResultSet* resultset, size_t column_idx, double* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len); - -/** - * @brief Get a field as an int. - * - * Reads out a field from the currently fetched rowset in a resultset as an int - * (platform specific). - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param buffer Pointer to an int that will receive the data. - * @param is_null_value Pointer to an int which will be set to 1 if the field contains a NULL value, - * or 0 otherwise - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful. - * HIVE_ERROR if an error occurred (error messages will be stored in err_buf) - * HIVE_NO_MORE_DATA if this field has already been fetched - */ -HiveReturn DBGetFieldAsInt(HiveResultSet* resultset, size_t column_idx, int* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len); - -/** - * @brief Get a field as a long int. - * - * Reads out a field from the currently fetched rowset in a resultset as a long int - * (platform specific). - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param buffer Pointer to a long int that will receive the data. - * @param is_null_value Pointer to an int which will be set to 1 if the field contains a NULL value, - * or 0 otherwise - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful. - * HIVE_ERROR if an error occurred (error messages will be stored in err_buf) - * HIVE_NO_MORE_DATA if this field has already been fetched - */ -HiveReturn DBGetFieldAsLong(HiveResultSet* resultset, size_t column_idx, long* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len); - -/** - * @brief Get a field as an unsigned long int. - * - * Reads out a field from the currently fetched rowset in a resultset as an unsigned long int - * (platform specific). - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param buffer Pointer to an unsigned long int that will receive the data. - * @param is_null_value Pointer to an int which will be set to 1 if the field contains a NULL value, - * or 0 otherwise - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful. - * HIVE_ERROR if an error occurred (error messages will be stored in err_buf) - * HIVE_NO_MORE_DATA if this field has already been fetched - */ -HiveReturn DBGetFieldAsULong(HiveResultSet* resultset, size_t column_idx, unsigned long* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len); - -/** - * @brief Get a field as an int64_t. - * - * Reads out a field from the currently fetched rowset in a resultset as a int64_t - * (platform independent). - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param buffer Pointer to a int64_t that will receive the data. - * @param is_null_value Pointer to an int which will be set to 1 if the field contains a NULL value, - * or 0 otherwise - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful. - * HIVE_ERROR if an error occurred (error messages will be stored in err_buf) - * HIVE_NO_MORE_DATA if this field has already been fetched - */ -HiveReturn DBGetFieldAsI64(HiveResultSet* resultset, size_t column_idx, int64_t* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len); - -/** - * @brief Get a field as an uint64_t. - * - * Reads out a field from the currently fetched rowset in a resultset as a uint64_t - * (platform independent). - * - * @param resultset An initialized HiveResultSet. - * @param column_idx Zero offset index of a column. - * @param buffer Pointer to a uint64_t that will receive the data. - * @param is_null_value Pointer to an int which will be set to 1 if the field contains a NULL value, - * or 0 otherwise - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful. - * HIVE_ERROR if an error occurred (error messages will be stored in err_buf) - * HIVE_NO_MORE_DATA if this field has already been fetched - */ -HiveReturn DBGetFieldAsI64U(HiveResultSet* resultset, size_t column_idx, uint64_t* buffer, - int* is_null_value, char* err_buf, size_t err_buf_len); - -/** - * @brief Destroys a HiveColumnDesc object. - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc object to be removed from memory. - * @param err_buf Buffer to receive an error message if HIVE_ERROR is returned. - * NULL can be used if the caller does not care about the error message. - * @param err_buf_len Size of the err_buf buffer. - * - * @return HIVE_SUCCESS if successful, or HIVE_ERROR if an error occurred - * (error messages will be stored in err_buf) - */ -HiveReturn DBCloseColumnDesc(HiveColumnDesc* column_desc, char* err_buf, size_t err_buf_len); - -/** - * @brief Get a column name. - * - * Retrieves the column name of the associated column in the result table from - * a HiveColumnDesc. - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc associated with the column in question. - * @param buffer Pointer to a buffer that will receive the column name as a C string - * @param buffer_len Number of bytes allocated to buffer - * - * @return void - */ -void DBGetColumnName(HiveColumnDesc* column_desc, char* buffer, size_t buffer_len); - -/** - * @brief Get the column type name. - * - * Retrieves the name of the column type of the associated column in the result table - * from a HiveColumnDesc. - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc associated with the column in question. - * @param buffer Pointer to a buffer that will receive the column type name as a C string - * @param buffer_len Number of bytes allocated to buffer - * - * @return void - */ -void DBGetColumnType(HiveColumnDesc* column_desc, char* buffer, size_t buffer_len); - -/** - * @brief Get the column type as a HiveType. - * - * Retrieves the column type as a HiveType for the associated column in the result table - * from a HiveColumnDesc. - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc associated with the column in question. - * - * @return HiveType of the column. - */ -HiveType DBGetHiveType(HiveColumnDesc* column_desc); - -/** - * @brief Finds whether a column is nullable. - * - * Determines from a HiveColumnDesc whether a particular column in the result table is - * able to contain NULLs. - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc associated with the column in question. - * - * @return 1 if the column can contain NULLs, or - * 0 if the column cannot contain NULLs - */ -int DBGetIsNullable(HiveColumnDesc* column_desc); - -/** - * @brief Finds whether a column is case sensitive. - * - * Determines from a HiveColumnDesc whether a particular column in the result table contains case - * sensitive data - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc associated with the column in question. - * - * @return 1 if the column data is case sensitive, or - * 0 otherwise - */ -int DBGetIsCaseSensitive(HiveColumnDesc* column_desc); - -/** - * @brief Finds the max display size of a column's fields. - * - * From a HiveColumnDesc, determines the maximum number of characters needed to represent a - * field within this column. - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc associated with the column in question. - * - * @return The maximum number of characters needed to represent a field within this column. - */ -size_t DBGetMaxDisplaySize(HiveColumnDesc* column_desc); - -/** - * @brief Finds the max (native) byte size of a column's fields. - * - * From a HiveColumnDesc, determines the number of bytes needed to store a field within this - * column in its native type. - * - * @see DBCreateColumnDesc() - * - * @param column_desc A HiveColumnDesc associated with the column in question. - * - * @return The number of bytes needed to store a field within this column in its native type. - */ -size_t DBGetFieldByteSize(HiveColumnDesc* column_desc); - -#ifdef __cplusplus -} // extern "C" -#endif // __cpluscplus - - -#endif // __hive_client_h__ diff --git odbc/src/cpp/hiveclienthelper.cpp odbc/src/cpp/hiveclienthelper.cpp deleted file mode 100644 index b0f3aae..0000000 --- odbc/src/cpp/hiveclienthelper.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include "hiveclienthelper.h" -#include "thriftserverconstants.h" - -using namespace std; - -/***************************************************************** - * File Scope Variables (used only within this file) - *****************************************************************/ - -/* - * g_hive_type_table: An array of HiveTypePairs used to define the mapping - * between the name of a HiveType and its value. This array is only - * used by the hiveTypeLookup function. - */ -struct HiveTypePair { - const char* type_name; - const HiveType type_value; -}; - -static const HiveTypePair g_hive_type_table[] = { - {VOID_TYPE_NAME, HIVE_VOID_TYPE}, - {BOOLEAN_TYPE_NAME, HIVE_BOOLEAN_TYPE}, - {TINYINT_TYPE_NAME, HIVE_TINYINT_TYPE}, - {SMALLINT_TYPE_NAME, HIVE_SMALLINT_TYPE}, - {INT_TYPE_NAME, HIVE_INT_TYPE}, - {BIGINT_TYPE_NAME, HIVE_BIGINT_TYPE}, - {FLOAT_TYPE_NAME, HIVE_FLOAT_TYPE}, - {DOUBLE_TYPE_NAME, HIVE_DOUBLE_TYPE}, - {STRING_TYPE_NAME, HIVE_STRING_TYPE}, - {DATE_TYPE_NAME, HIVE_DATE_TYPE}, - {DATETIME_TYPE_NAME, HIVE_DATETIME_TYPE}, - {TIMESTAMP_TYPE_NAME, HIVE_TIMESTAMP_TYPE}, - {LIST_TYPE_NAME, HIVE_LIST_TYPE}, - {MAP_TYPE_NAME, HIVE_MAP_TYPE}, - {STRUCT_TYPE_NAME, HIVE_STRUCT_TYPE} -}; - -/***************************************************************** - * Global Helper Functions - *****************************************************************/ - -HiveType hiveTypeLookup(const char* hive_type_name) { - assert(hive_type_name != NULL); - for (unsigned int idx = 0; idx < LENGTH(g_hive_type_table); idx++) { - if (strcmp(hive_type_name, g_hive_type_table[idx].type_name) == 0) { - return g_hive_type_table[idx].type_value; - } - } - return HIVE_UNKNOWN_TYPE; -} - -size_t safe_strncpy(char* dest_buffer, const char* src_buffer, size_t num) { - /* Make sure arguments are valid */ - if (num == 0 || dest_buffer == NULL || src_buffer == NULL) - return 0; - - size_t len = min(num - 1, strlen(src_buffer)); - strncpy(dest_buffer, src_buffer, len); /* Copy only as much as needed */ - dest_buffer[len] = '\0'; /* NULL terminate in case strncpy copies exactly num-1 characters */ - - /* Returns the number of bytes copied into the destination buffer (excluding the null terminator)*/ - return len; -} - diff --git odbc/src/cpp/hiveclienthelper.h odbc/src/cpp/hiveclienthelper.h deleted file mode 100644 index 5814a03..0000000 --- odbc/src/cpp/hiveclienthelper.h +++ /dev/null @@ -1,132 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file hiveclienthelper.h - * @brief Provides some commonly used functions and macros. - * - *****************************************************************************/ - - -#ifndef __hive_client_helper_h__ -#define __hive_client_helper_h__ - -#include - -#include "hiveconstants.h" - - -// TODO: add architecture specific macro definitions here if needed -#ifdef ARCH32 - -#elif defined(ARCH64) - -#else - -#endif - -/***************************************************************** - * Macro Functions - *****************************************************************/ - -/** - * @brief A macro that converts a string to a signed 64 bit integer. - * - * Macro will work for both 32 and 64 bit architectures - */ -#define ATOI64(val) int64_t(strtoll(val, NULL, 10)) - -/** - * @brief A macro that converts a string to an unsigned 64 bit integer. - * - * Macro will work for both 32 and 64 bit architectures - */ -#define ATOI64U(val) uint64_t(strtoull(val, NULL, 10)) - -/** - * @brief Convert a Macro'ed value to a string. - * - * Callers should only call STRINGIFY(x) and - * should never use XSTRINGIFY(x) - */ -#define STRINGIFY(x) XSTRINGIFY(x) -#define XSTRINGIFY(x) #x - -/** - * @brief Finds the number of elements in an array - */ -#define LENGTH(arr) (sizeof(arr)/sizeof(arr[0])) - -/** - * Checks an error condition, and if true: - * 1. prints the error - * 2. saves the message to err_buf - * 3. returns the specified ret_val - */ -#define RETURN_ON_ASSERT(condition, funct_name, error_msg, err_buf, err_buf_len, ret_val) { \ - if (condition) { \ - cerr << funct_name << ": " << error_msg << endl << flush; \ - safe_strncpy(err_buf, error_msg, err_buf_len); \ - return ret_val; \ - } \ -} - -/** - * Always performs the following: - * 1. prints the error - * 2. saves the message to err_buf - * 3. returns the specified ret_val - */ -#define RETURN_FAILURE(funct_name, error_msg, err_buf, err_buf_len, ret_val) { \ - RETURN_ON_ASSERT(true, funct_name, error_msg, err_buf, err_buf_len, ret_val); \ -} - -/***************************************************************** - * Global Helper Functions - *****************************************************************/ - -/** - * @brief Convert the name of a HiveType to its actual value. - * - * Returns the corresponding HiveType enum given the name of a Hive data type. - * This function is case sensitive. - * For example: hiveTypeLookup("string") => HIVE_STRING_TYPE - * - * @param hive_type_name Name of a HiveType - * @return The corresponding HiveType - */ -HiveType hiveTypeLookup(const char* hive_type_name); - -/** - * @brief Safe version of strncpy. - * - * A version of strncpy that guarantees the existance of '\0' at the end of the supplied buffer - * to prevent buffer overruns. Instead of returning dest_buffer like strncpy, safe_strncpy - * returns the number of bytes written to dest_buffer (excluding the null terminator). - * - * @param dest_buffer Buffer to write into. - * @param src_buffer Buffer to copy from. - * @param num The size of the destination buffer in bytes. - * - * @return Number of bytes copied into the destination buffer (excluding the null terminator). - */ -size_t safe_strncpy(char* dest_buffer, const char* src_buffer, size_t num); - - -#endif // __hive_client_helper_h__ diff --git odbc/src/cpp/hiveconstants.h odbc/src/cpp/hiveconstants.h deleted file mode 100644 index 72f1049..0000000 --- odbc/src/cpp/hiveconstants.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file hiveconstants.h - * @brief Provides constants necessary for library caller interaction with Hive Client - * - *****************************************************************************/ - - -#ifndef __hive_constants_h__ -#define __hive_constants_h__ - -/// Maximum length of a Hive Client error message -static const int MAX_HIVE_ERR_MSG_LEN = 128; -/// Maximum length of a column name -static const int MAX_COLUMN_NAME_LEN = 64; -/// Maximum length of a column type name -static const int MAX_COLUMN_TYPE_LEN = 64; - - -/* Default connection parameters */ -/// Default Hive database name -static const char* DEFAULT_DATABASE = "default"; -/// Default Hive Server host -static const char* DEFAULT_HOST = "localhost"; -/// Default Hive Server port -static const char* DEFAULT_PORT = "10000"; -/// Default connection socket type -static const char* DEFAULT_FRAMED = "0"; - -/** - * Enumeration of known Hive data types - */ -enum HiveType -{ - HIVE_VOID_TYPE, - HIVE_BOOLEAN_TYPE, - HIVE_TINYINT_TYPE, - HIVE_SMALLINT_TYPE, - HIVE_INT_TYPE, - HIVE_BIGINT_TYPE, - HIVE_FLOAT_TYPE, - HIVE_DOUBLE_TYPE, - HIVE_STRING_TYPE, - HIVE_DATE_TYPE, - HIVE_DATETIME_TYPE, - HIVE_TIMESTAMP_TYPE, - HIVE_LIST_TYPE, - HIVE_MAP_TYPE, - HIVE_STRUCT_TYPE, - HIVE_UNKNOWN_TYPE -}; - -/** - * Enumeration of Hive return values - */ -enum HiveReturn -{ - HIVE_SUCCESS, - HIVE_ERROR, - HIVE_NO_MORE_DATA, - HIVE_SUCCESS_WITH_MORE_DATA, - HIVE_STILL_EXECUTING -}; - -#endif // __hive_constants_h__ diff --git odbc/src/cpp/thriftserverconstants.h odbc/src/cpp/thriftserverconstants.h deleted file mode 100644 index fe4bac4..0000000 --- odbc/src/cpp/thriftserverconstants.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************//** - * - * 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. - * - ****************************************************************************** - * - * @file thriftserverconstants.h - * @brief Provides constants necessary for Hive Client interaction with Hive Server - * - *****************************************************************************/ - - -#ifndef __thrift_server_constants_h__ -#define __thrift_server_constants_h__ - -/// Maximum number of characters needed to display any field -static const int MAX_DISPLAY_SIZE = 334; -/// Maximum number of bytes needed to store any field -static const int MAX_BYTE_LENGTH = 334; - - -/// Default null format string representation -static const char* DEFAULT_NULL_FORMAT = "\\N"; - -/// Schema map property key for field delimiters -static const char* FIELD_DELIM = "field.delim"; -/// Schema map property key for null format -static const char* SERIALIZATION_NULL_FORMAT = "serialization.null.format"; - - -// From: serde/src/gen-java/org/apache/hadoop/hive/serde/Constants.java - -static const char* VOID_TYPE_NAME = "void"; -static const char* BOOLEAN_TYPE_NAME = "boolean"; -static const char* TINYINT_TYPE_NAME = "tinyint"; -static const char* SMALLINT_TYPE_NAME = "smallint"; -static const char* INT_TYPE_NAME = "int"; -static const char* BIGINT_TYPE_NAME = "bigint"; -static const char* FLOAT_TYPE_NAME = "float"; -static const char* DOUBLE_TYPE_NAME = "double"; -static const char* STRING_TYPE_NAME = "string"; -static const char* DATE_TYPE_NAME = "date"; -static const char* DATETIME_TYPE_NAME = "datetime"; -static const char* TIMESTAMP_TYPE_NAME = "timestamp"; -static const char* LIST_TYPE_NAME = "array"; -static const char* MAP_TYPE_NAME = "map"; -static const char* STRUCT_TYPE_NAME = "struct"; - - -#endif // __thrift_server_constants_h__ diff --git odbc/src/test/hiveclienttest.c odbc/src/test/hiveclienttest.c deleted file mode 100644 index fbb4e24..0000000 --- odbc/src/test/hiveclienttest.c +++ /dev/null @@ -1,1395 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include -#include "hiveclient.h" - -/* INSTRUCTIONS: - * This test suite should have been compiled when 'make' was executed from the - * base odbc directory as HiveClientTestC before running this test suite, make - * sure to copy the odbc/testdata/ directory to /tmp/ on the same machine as - * the Hive Server. To run this test suite, just run the executable: HiveClientTestC. - */ - -#define MAX_QUERY_LEN 1024 -#define MAX_FIELD_LEN 255 - -// Currently all Hive numeric types are signed (64-bit platform specific) -// but tests should also run in 32-bit mode -#define MIN_TINYINT -128 -#define MIN_SMALLINT -32768 -#define MIN_INT 0x80000000 -#define MIN_BIGINT 0x8000000000000000 -#define SMALLEST_POS_FLOAT 1.1754944E-38 -#define SMALLEST_POS_DOUBLE 2.225073858507201E-308 -#define MAX_TINYINT 127 -#define MAX_SMALLINT 32767 -#define MAX_INT 0x7FFFFFFF -#define MAX_BIGINT 0x7FFFFFFFFFFFFFFF -#define BIGGEST_POS_FLOAT 3.4028235E+38 -#define BIGGEST_POS_DOUBLE 1.797693134862315E+308 - -// Convert a macro value to a string -#define STRINGIFY(x) XSTRINGIFY(x) -#define XSTRINGIFY(x) #x - -// Path to test data (should be supplied at compile time) -#ifdef TEST_DATA_DIR -#define TEST_DATA_DIR_STR STRINGIFY(TEST_DATA_DIR) -#else -#define TEST_DATA_DIR_STR "/tmp/testdata" // Provide a default if not defined -#endif - -/** - * Checks an error condition, and if true: - * 1. prints the error to stderr - * 2. returns the specified ret_val - */ -#define RETURN_ON_ASSERT_ONE_ARG(condition, err_format, arg, ret_val) { \ - if (condition) { \ - fprintf(stderr, "----LINE %i: ", __LINE__); \ - fprintf(stderr, err_format, arg); \ - return ret_val; \ - } \ -} - -/** - * Checks an error condition, and if true: - * 1. prints the error to stderr - * 2. closes the DB connection on db_conn - * 3. returns the specified ret_val - */ -#define RETURN_ON_ASSERT_NO_ARG_CLOSE(condition, err_format, db_conn, ret_val) { \ - if (condition) { \ - char error_buffer_[MAX_HIVE_ERR_MSG_LEN]; \ - fprintf(stderr, "----LINE %i: ", __LINE__); \ - fprintf(stderr, err_format); \ - DBCloseConnection(db_conn, error_buffer_, sizeof(error_buffer_)); \ - return ret_val; \ - } \ -} -#define RETURN_ON_ASSERT_ONE_ARG_CLOSE(condition, err_format, arg, db_conn, ret_val) { \ - if (condition) { \ - char error_buffer_[MAX_HIVE_ERR_MSG_LEN]; \ - fprintf(stderr, "----LINE %i: ", __LINE__); \ - fprintf(stderr, err_format, arg); \ - DBCloseConnection(db_conn, error_buffer_, sizeof(error_buffer_)); \ - return ret_val; \ - } \ -} -#define RETURN_ON_ASSERT_TWO_ARG_CLOSE(condition, err_format, arg1, arg2, db_conn, ret_val) { \ - if (condition) { \ - char error_buffer_[MAX_HIVE_ERR_MSG_LEN]; \ - fprintf(stderr, "----LINE %i: ", __LINE__); \ - fprintf(stderr, err_format, arg1, arg2); \ - DBCloseConnection(db_conn, error_buffer_, sizeof(error_buffer_)); \ - return ret_val; \ - } \ -} - -/************************************************************************************************** - * HELPER FUNCTIONS - **************************************************************************************************/ - -int dummyHiveTypeConverter(HiveType type) { - return 1; // For testing purposes, just return an arbitrary value -} - -HiveReturn dropTable(HiveConnection* connection, const char* table_name) { - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - HiveReturn retval; - char query[MAX_QUERY_LEN]; - int has_results; - HiveResultSet* resultset; - - sprintf(query, "DROP TABLE %s", table_name); - retval = DBExecute(connection, query, &resultset, 10, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, HIVE_ERROR); - - retval = DBHasResults(resultset, &has_results, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBHasResults failed: %s\n", - err_buf, connection, HIVE_ERROR); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(has_results, - "Query '%s' generated results\n", - query, connection, HIVE_ERROR); - - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, HIVE_ERROR) - - return HIVE_SUCCESS; -} - -/************************************************************************************************** - * TEST FUNCTIONS - **************************************************************************************************/ - -int basic_connect_disconnect_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - HiveReturn retval; - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - if (connection == NULL) { - /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - fprintf(stderr, "Connect failed: %s\n", err_buf); - fprintf(stderr, "\n\n\nMAKE SURE YOU HAVE THE STANDALONE HIVESERVER RUNNING!\n"); - fprintf(stderr, "Expected Connection Parameters:\n"); - fprintf(stderr, "HOST: %s\n", DEFAULT_HOST); - fprintf(stderr, "PORT: %s\n", DEFAULT_PORT); - fprintf(stderr, "DATABASE: %s\n\n\n", DEFAULT_DATABASE); - assert(connection != NULL); - } - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG(retval == HIVE_ERROR, - "Disconnect failed: %s\n", - err_buf, 0) - return 1; -} - -int basic_query_exec_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - HiveResultSet* resultset; - HiveReturn retval; - - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - assert(connection != NULL); - - retval = DBExecute(connection, "SHOW TABLES", &resultset, 10, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBDisconnect failed: %s\n", - err_buf, connection, 0); - return 1; -} - -int basic_fetch_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - int has_results; - HiveResultSet* resultset; - HiveReturn retval; - - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - assert(connection != NULL); - - retval = DBExecute(connection, "SHOW TABLES", &resultset, 10, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - retval = DBHasResults(resultset, &has_results, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBHasResults failed: %s\n", - err_buf, connection, 0); - - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_SUCCESS && !has_results, - "DBFetch failed: Row fetched but no results detected\n", - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA && has_results, - "DBFetch failed: Results detected but no rows fetched\n", - connection, 0) - - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBDisconnect failed: %s\n", - err_buf, connection, 0); - return 1; -} - -int show_tables_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - const char* table_name = "ehwang_tmp_test"; - HiveReturn retval; - char query[MAX_QUERY_LEN]; - char field[MAX_FIELD_LEN]; - int has_results; - size_t col_count; - size_t col_len; - size_t data_byte_size; - int is_null_value; - HiveResultSet* resultset; - - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - assert(connection != NULL); /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - - // Drop pre-existing tables of the same name - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Create the table - sprintf(query, "CREATE TABLE %s (key int, value string)", table_name); - retval = DBExecute(connection, query, &resultset, 10, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - retval = DBHasResults(resultset, &has_results, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBHasResults failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(has_results, - "Query '%s' generated results\n", - query, connection, 0); - - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - - // Test 'show tables' query - sprintf(query, "SHOW TABLES '%s'", table_name); - retval = DBExecute(connection, query, &resultset, 10, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - retval = DBHasResults(resultset, &has_results, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBHasResults failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(!has_results, - "Query '%s'could not find table '%s'\n", - query, table_name, connection, 0); - - retval = DBGetColumnCount(resultset, &col_count, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetColumnCount failed: '%s'\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(col_count != 1, - "Column count not equal to one: %zu\n", - col_count, connection, 0); - - // Fetch row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the only row\n", - connection, 0); - - // Check row data - retval = DBGetFieldAsCString(resultset, 0, field, sizeof(field), &data_byte_size, &is_null_value, - err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(field, table_name) != 0, - "Tables do not have the same name: table_name:%s, field:%s\n", - table_name, field, connection, 0); - - retval = DBGetFieldDataLen(resultset, 0, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as table_name (%zu)\n", - col_len, strlen(field), connection, 0); - - // Fetch row (check that there is nothing else to fetch) - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "DBFetch failed: Only one row, but fetched two\n", - connection, 0); - - // Clean up table - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Close the handles - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG(retval == HIVE_ERROR, - "Disconnect failed: %s\n", - err_buf, 0) - - return 1; -} - -int query_fetch_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - const char* table_name = "ehwang_tmp_test"; - const char* test_data_path = TEST_DATA_DIR_STR "/dataset1.input"; - HiveReturn retval; - char query[MAX_QUERY_LEN]; - char string_field[MAX_FIELD_LEN]; - int int_field; - int has_results; - size_t col_count; - size_t col_len; - size_t data_byte_size; - int is_null_value; - HiveResultSet* resultset; - HiveColumnDesc* column_desc; - HiveType hive_type; - HiveType expected_hive_type; - - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - assert(connection != NULL); - - // Drop pre-existing tables of the same name - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Create the table - sprintf(query, "CREATE TABLE %s (key int, value string) STORED AS TEXTFILE", table_name); - retval = DBExecute(connection, query, NULL, 0, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Load data into the table - // NOTE: test_data_path has to be local to the hive server - // NOTE: test_data_path is a ctrl-A separated file with two fields per line - sprintf(query, "LOAD DATA LOCAL INPATH '%s' INTO TABLE %s", test_data_path, table_name); - retval = DBExecute(connection, query, NULL, 0, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Run Select * query - sprintf(query, "SELECT * FROM %s", table_name); - // max_buf_len value of 1 to test client side result buffer fetching - retval = DBExecute(connection, query, &resultset, 1, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - retval = DBHasResults(resultset, &has_results, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBHasResults failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(!has_results, - "Query '%s'should have found results in table: '%s'\n", - query, table_name, connection, 0); - - retval = DBGetColumnCount(resultset, &col_count, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetColumnCount failed: '%s'\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(col_count != 2, - "Column count not equal to two: %zu\n", - col_count, connection, 0); - - // Check HiveType of first column - retval = DBCreateColumnDesc(resultset, 0, &column_desc, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCreateColumnDesc failed: %s\n", - err_buf, connection, 0); - hive_type = DBGetHiveType(column_desc); - expected_hive_type = HIVE_INT_TYPE; - RETURN_ON_ASSERT_TWO_ARG_CLOSE(hive_type != expected_hive_type, - "DBCreateColumnDesc failed: incorrect hive type: %i, expected: %i\n", - hive_type, expected_hive_type, connection, 0); - - retval = DBCloseColumnDesc(column_desc, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseColumnDesc failed: %s\n", - err_buf, connection, 0); - - // Check HiveType of second column - retval = DBCreateColumnDesc(resultset, 1, &column_desc, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCreateColumnDesc failed: %s\n", - err_buf, connection, 0); - hive_type = DBGetHiveType(column_desc); - expected_hive_type = HIVE_STRING_TYPE; - RETURN_ON_ASSERT_TWO_ARG_CLOSE(hive_type != expected_hive_type, - "DBCreateColumnDesc failed: incorrect hive type: %i, expected: %i\n", - hive_type, expected_hive_type, connection, 0); - - retval = DBCloseColumnDesc(column_desc, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseColumnDesc failed: %s\n", - err_buf, connection, 0); - - // Fetch row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the first row\n", - connection, 0); - - // Check first row of data - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "Int field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != 1, - "Int field for row 1 does not match: expected=%i, recieved=%i\n", - 1, int_field, connection, 0); - - retval = DBGetFieldAsCString(resultset, 1, string_field, sizeof(string_field), &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "String field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(string_field, "foo") != 0, - "String fields does not match: expected='%s', received='%s'\n", - "foo", string_field, connection, 0); - - retval = DBGetFieldDataLen(resultset, 1, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(string_field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as expected length (%zu)\n", - col_len, strlen(string_field), connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(data_byte_size != col_len, - "DBGetFieldDataLen failed: Returned data_byte_length (%zu) was not the same as the amount written to buffer (%zu)\n", - data_byte_size, strlen(string_field) + 1, connection, 0); - - // Fetch second row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the second row\n", - connection, 0); - - // Check second row of data - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "Int field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != 2, - "Int field for row 1 does not match: expected=%i, recieved=%i\n", - 1, int_field, connection, 0); - - retval = DBGetFieldAsCString(resultset, 1, string_field, sizeof(string_field), &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "String field for row 2 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(string_field, "bar") != 0, - "String fields does not match: expected='%s', received='%s'\n", - "bar", string_field, connection, 0); - - retval = DBGetFieldDataLen(resultset, 1, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(string_field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as expected length (%zu)\n", - col_len, strlen(string_field), connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(data_byte_size != col_len, - "DBGetFieldDataLen failed: Returned data_byte_length (%zu) was not the same as the amount written to buffer (%zu)\n", - data_byte_size, strlen(string_field) + 1, connection, 0); - - // Fetch non-existant row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "DBFetch failed: Only 2 rows, but was able to fetch a third...\n", - connection, 0); - - // Clean up table - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Close the handles - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG(retval == HIVE_ERROR, - "DBDisconnect failed: %s\n", - err_buf, 0); - - return 1; -} - -int numeric_range_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - const char* table_name = "ehwang_tmp_test"; - const char* test_data_path = TEST_DATA_DIR_STR "/dataset_types.input"; - HiveReturn retval; - char query[MAX_QUERY_LEN]; - int int_field; - int64_t I64_field; - double double_field; - int is_null_value; - HiveResultSet* resultset; - - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - assert(connection != NULL); - - // Drop pre-existing tables of the same name - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Create the table - sprintf( - query, - "CREATE TABLE %s (tinyint_type tinyint, smallint_type smallint, int_type int, bigint_type bigint, float_type float, double_type double, null_test int) STORED AS TEXTFILE", - table_name); - retval = DBExecute(connection, query, NULL, 0, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Load data into the table - // NOTE: test_data_path has to be local to the hive server - // NOTE: test_data_path is a ctrl-A separated file with seven fields per line - sprintf(query, "LOAD DATA LOCAL INPATH '%s' INTO TABLE %s", test_data_path, table_name); - retval = DBExecute(connection, query, NULL, 0, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Run Select * query - sprintf(query, "SELECT * FROM %s", table_name); - retval = DBExecute(connection, query, &resultset, 1, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Fetch row of minimum numeric values - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the first row\n", - connection, 0); - - // Check first row of minimum numeric values - - // Min tinyint field - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "TINYINT field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != MIN_TINYINT, - "TINYINT field for row 1 does not match: expected=%i, received=%i\n", - MIN_TINYINT, int_field, connection, 0); - - // Min smallint field - retval = DBGetFieldAsInt(resultset, 1, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "SMALLINT field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != MIN_SMALLINT, - "SMALLINT field for row 1 does not match: expected=%i, received=%i\n", - MIN_SMALLINT, int_field, connection, 0); - - // Min int field - retval = DBGetFieldAsInt(resultset, 2, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "INTEGER field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != MIN_INT, - "INTEGER field for row 1 does not match: expected=%i, received=%i\n", - MIN_INT, int_field, connection, 0); - - // Min bigint field - retval = DBGetFieldAsI64(resultset, 3, &I64_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsI64 failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "BIGINT field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(I64_field != MIN_BIGINT, - "BIGINT field for row 1 does not match: expected=%lld, received=%lld\n", - (long long) MIN_BIGINT, (long long) I64_field, connection, 0); - - // Smallest positive float field - retval - = DBGetFieldAsDouble(resultset, 4, &double_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsDouble failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "FLOAT field for row 1 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE((float) double_field != (float) SMALLEST_POS_FLOAT, - "FLOAT field for row 1 does not match: expected=%.17g, received=%.17g\n", - (float) SMALLEST_POS_FLOAT, (float) double_field, connection, 0); - - // Smallest positive double field - retval - = DBGetFieldAsDouble(resultset, 5, &double_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR,"DBGetFieldAsDouble failed: %s\n", err_buf, - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "DOUBLE field for row 1 should not be NULL\n", connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE((double) double_field != (double) SMALLEST_POS_DOUBLE, - "DOUBLE field for row 1 does not match: expected=%.17g, received=%.17g\n", - (double) SMALLEST_POS_DOUBLE, (double) double_field, connection, 0); - - // NULL field - retval = DBGetFieldAsInt(resultset, 6, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, "DBGetFieldAsInt failed: %s\n", err_buf, - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(!is_null_value, - "Field should be NULL\n", connection, 0); - - // Fetch row of maximum numeric values - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, "DBFetch failed: %s\n", err_buf, - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, "DBFetch failed: Could not fetch the second row\n", - connection, 0); - - // Check second row of maximum numeric values - - // Max tinyint field - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, "DBGetFieldAsInt failed: %s\n", err_buf, - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "TINYINT field for row 2 should not be NULL\n", connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != MAX_TINYINT, - "TINYINT field for row 2 does not match: expected=%i, received=%i\n", MAX_TINYINT, - int_field, connection, 0); - - // Max smallint field - retval = DBGetFieldAsInt(resultset, 1, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, "DBGetFieldAsInt failed: %s\n", err_buf, - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "SMALLINT field for row 2 should not be NULL\n", connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != MAX_SMALLINT, - "SMALLINT field for row 2 does not match: expected=%i, received=%i\n", - MAX_SMALLINT, int_field, connection, 0); - - // Max int field - retval = DBGetFieldAsInt(resultset, 2, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, "DBGetFieldAsInt failed: %s\n", err_buf, - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "INTEGER field for row 2 should not be NULL\n", connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_field != MAX_INT, - "INTEGER field for row 2 does not match: expected=%i, received=%i\n", - MAX_INT, int_field, connection, 0); - - // Max bigint field - retval = DBGetFieldAsI64(resultset, 3, &I64_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, "DBGetFieldAsI64 failed: %s\n", err_buf, - connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "BIGINT field for row 2 should not be NULL\n", connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(I64_field != MAX_BIGINT, - "BIGINT field for row 2 does not match: expected=%lld, received=%lld\n", - (long long) MAX_BIGINT, (long long) I64_field, connection, 0); - - // Biggest positive float field - retval - = DBGetFieldAsDouble(resultset, 4, &double_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsDouble failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "FLOAT field for row 2 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE((float) double_field != (float) BIGGEST_POS_FLOAT, - "FLOAT field for row 2 does not match: expected=%.17g, received=%.17g\n", - (float) BIGGEST_POS_FLOAT, (float) double_field, connection, 0); - - // Biggest positive double field - retval - = DBGetFieldAsDouble(resultset, 5, &double_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsDouble failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(is_null_value, - "DOUBLE field for row 2 should not be NULL\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE((double) double_field != (double) BIGGEST_POS_DOUBLE, - "DOUBLE field for row 2 does not match: expected=%.17g, received=%.17g\n", - (double) BIGGEST_POS_DOUBLE, (double) double_field, connection, 0); - - // NULL field - retval = DBGetFieldAsInt(resultset, 6, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(!is_null_value, - "Field should be NULL\n", - connection, 0); - - // Clean up table - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Close the handles - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG(retval == HIVE_ERROR, - "DBDisconnect failed: %s\n", - err_buf, 0); - - return 1; -} - -int field_multifetch_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - const char* table_name = "ehwang_tmp_test"; - const char* test_data_path = TEST_DATA_DIR_STR "/dataset2.input"; - HiveReturn retval; - char query[MAX_QUERY_LEN]; - char string_field[MAX_FIELD_LEN]; - size_t data_byte_size; - int int_field; - int is_null_value; - HiveResultSet* resultset; - - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - assert(connection != NULL); - - // Drop pre-existing tables of the same name - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Create the table - sprintf(query, "CREATE TABLE %s (fixed_len_field int, var_len_field string) STORED AS TEXTFILE", - table_name); - retval = DBExecute(connection, query, NULL, 0, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Load data into the table - // NOTE: test_data_path has to be local to the hive server - // NOTE: test_data_path is a ctrl-A separated file with two fields per line - sprintf(query, "LOAD DATA LOCAL INPATH '%s' INTO TABLE %s", test_data_path, table_name); - retval = DBExecute(connection, query, NULL, 0, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Run Select * query - sprintf(query, "SELECT * FROM %s", table_name); - retval = DBExecute(connection, query, &resultset, 1, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Fetch row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the first row\n", - connection, 0); - - // Test multi-fetches on fixed length fields: - // First fetch - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_SUCCESS, - "First fetch of a fixed length field should be successful\n", - connection, 0); - - // Second fetch - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "Second consecutive fetch of a fixed length field should return HIVE_NO_MORE_DATA\n", - connection, 0); - - // Third fetch - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "Third consecutive fetch of a fixed length field should return HIVE_NO_MORE_DATA\n", - connection, 0); - - // Test multi-fetches on var length fields: - // First fetch with sufficient buffer space - retval = DBGetFieldAsCString(resultset, 1, string_field, sizeof(string_field), &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - /* Length of alphabet string in data */ - RETURN_ON_ASSERT_TWO_ARG_CLOSE(data_byte_size != 26, - "DBGetFieldAsCString failed: incorrect data_byte_size: expected=%zu, received=%zu\n", - (size_t) 26, data_byte_size, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_SUCCESS, - "First fetch of a variable length field with sufficient buffer space should be successful\n", - connection, 0); - - // Second fetch with sufficient buffer space - retval = DBGetFieldAsCString(resultset, 1, string_field, sizeof(string_field), &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "Second consecutive fetch of a completely fetched variable length field should return HIVE_NO_MORE_DATA\n", - connection, 0); - - // Third fetch with sufficient buffer space - retval = DBGetFieldAsCString(resultset, 1, string_field, sizeof(string_field), &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "Third consecutive fetch of a completely fetched variable length field should return HIVE_NO_MORE_DATA\n", - connection, 0); - - // Test multi-fetches on fixed length fields after reset column reset: - // First fetch - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_SUCCESS, - "First fetch of a fixed length field after a column reset should be successful\n", - connection, 0); - // Second fetch - retval = DBGetFieldAsInt(resultset, 0, &int_field, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "Second consecutive fetch of a fixed length field should always return HIVE_NO_MORE_DATA\n", - connection, 0); - - // Test multi-fetches on var length fields after column reset with insufficient buffer space: - // First fetch with insufficient buffer space after a column reset - size_t reduced_buffer_size = 13; // For a source data size of 26 bytes - retval = DBGetFieldAsCString(resultset, 1, string_field, reduced_buffer_size, &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - /* Length of available alphabet string to return before truncation */ - RETURN_ON_ASSERT_TWO_ARG_CLOSE(data_byte_size != 26, - "DBGetFieldAsCString failed: incorrect data_byte_size: expected=%zu, received=%zu\n", - (size_t) 26, data_byte_size, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_SUCCESS_WITH_MORE_DATA, - "First fetch of a variable length field with insufficient buffer space should return HIVE_SUCCESS_WITH_MORE_DATA\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(string_field, "abcdefghijkl") != 0, - "Fetched string does not match: expected:%s, received:%s\n", - "abcdefghijkl", string_field, connection, 0); - - // Second fetch with insufficient buffer space - retval = DBGetFieldAsCString(resultset, 1, string_field, reduced_buffer_size, &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - /* Length of remaining alphabet string to return before truncation */ - RETURN_ON_ASSERT_TWO_ARG_CLOSE(data_byte_size != 14, - "DBGetFieldAsCString failed: incorrect data_byte_size: expected=%zu, received=%zu\n", - (size_t) 14, data_byte_size, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_SUCCESS_WITH_MORE_DATA, - "Second consecutive fetch with still insufficient buffer space should return HIVE_SUCCESS_WITH_MORE_DATA\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(string_field, "mnopqrstuvwx"), - "Fetched string does not match: expected:%s, received:%s\n", - "mnopqrstuvwx", string_field, connection, 0); - - // Third fetch to obtain the remainder of the buffer data - retval = DBGetFieldAsCString(resultset, 1, string_field, reduced_buffer_size, &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - /* Length of remaining alphabet string to return before truncation */ - RETURN_ON_ASSERT_TWO_ARG_CLOSE(data_byte_size != 2, - "DBGetFieldAsCString failed: incorrect data_byte_size: expected=%zu, received=%zu\n", - (size_t) 2, data_byte_size, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_SUCCESS, - "Fetch that returns all or the complete remainder of the data buffer should return HIVE_SUCCESS\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(string_field, "yz") != 0, - "Fetched string does not match: expected:%s, received:%s\n", - "yz", string_field, connection, 0); - - // Fourth fetch after all data has already been obtained - retval = DBGetFieldAsCString(resultset, 1, string_field, reduced_buffer_size, &data_byte_size, - &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "Fourth consecutive fetch of a completely fetched variable length field should return HIVE_NO_MORE_DATA\n", - connection, 0); - - // Clean up table - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Close the handles - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG(retval == HIVE_ERROR, - "DBDisconnect failed: %s\n", - err_buf, 0); - - return 1; -} - -int meta_data_function_test() { - fprintf(stderr, "Running %s...\n", __FUNCTION__); - char err_buf[MAX_HIVE_ERR_MSG_LEN]; - const char* table_name = "ehwang_tmp_test"; - HiveReturn retval; - char query[MAX_QUERY_LEN]; - char field[MAX_FIELD_LEN]; - int has_results; - int int_buffer; - size_t col_count; - size_t col_len; - size_t data_byte_size; - int is_null_value; - HiveResultSet* resultset; - - HiveConnection* connection = DBOpenConnection(DEFAULT_DATABASE, DEFAULT_HOST, atoi(DEFAULT_PORT), - atoi(DEFAULT_FRAMED), err_buf, sizeof(err_buf)); - assert(connection != NULL); /* If this fails, make sure that Hive server is running with the connect parameter arguments */ - - // Drop pre-existing tables of the same name - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Create the table - sprintf(query, "CREATE TABLE %s (key int, value string)", table_name); - retval = DBExecute(connection, query, NULL, 10, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBExecute failed: %s\n", - err_buf, connection, 0); - - // Test DBTables - retval = DBTables(connection, table_name, &resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBTables failed: %s\n", - err_buf, connection, 0); - retval = DBHasResults(resultset, &has_results, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBHasResults failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(!has_results, - "DBTables could not find table '%s'\n", - table_name, connection, 0); - - retval = DBGetColumnCount(resultset, &col_count, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetColumnCount failed: '%s'\n", - err_buf, connection, 0); - /* The DBTables function should always return a result set with exactly 5 columns */ - RETURN_ON_ASSERT_ONE_ARG_CLOSE(col_count != 5, - "Column count not equal to five: %zu\n", - col_count, connection, 0); - - // Fetch row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the only row\n", - connection, 0); - - // Check row data - // Index 2 (a.k.a column 3) in a row will always contain the name of the table - retval = DBGetFieldAsCString(resultset, 2, field, sizeof(field), &data_byte_size, &is_null_value, - err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(field, table_name) != 0, - "Tables do not have the same name: table_name:%s, field:%s\n", - table_name, field, connection, 0); - - retval = DBGetFieldDataLen(resultset, 2, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as table_name (%zu)\n", - col_len, strlen(field), connection, 0); - - // Fetch row (check that there is nothing else to fetch) - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "DBFetch failed: Only one row, but fetched two\n", - connection, 0); - - // Close the resultset - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - - // Test DBColumns - - // Match all columns in created table - retval = DBColumns(connection, &dummyHiveTypeConverter, table_name, "*", &resultset, err_buf, - sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBColumns failed: %s\n", - err_buf, connection, 0); - - retval = DBHasResults(resultset, &has_results, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBHasResults failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(!has_results, - "DBColumns could not find columns for table '%s'\n", - table_name, connection, 0); - - retval = DBGetColumnCount(resultset, &col_count, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetColumnCount failed: '%s'\n", - err_buf, connection, 0); - /* The DBColumns function should always return a result set with exactly 18 columns */ - RETURN_ON_ASSERT_ONE_ARG_CLOSE(col_count != 18, - "Column count not equal to 18: %zu\n", - col_count, connection, 0); - - // Fetch first row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the only row\n", - connection, 0); - - // Check first row data - // Index 2 (a.k.a column 3) in a row will always contain the name of the table - retval = DBGetFieldAsCString(resultset, 2, field, sizeof(field), &data_byte_size, &is_null_value, - err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(field, table_name) != 0, - "Tables do not have the same name: table_name:%s, field:%s\n", - table_name, field, connection, 0); - - retval = DBGetFieldDataLen(resultset, 2, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as table_name (%zu)\n", - col_len, strlen(field), connection, 0); - - // Index 3 (a.k.a column 4) in a row will always contain the name of the column - retval = DBGetFieldAsCString(resultset, 3, field, sizeof(field), &data_byte_size, &is_null_value, - err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(field, "key") != 0, - "Columns do not have the same name: column_name:%s, field:%s\n", - "key", field, connection, 0); - retval = DBGetFieldDataLen(resultset, 3, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as table_name (%zu)\n", - col_len, strlen(field), connection, 0); - - // Index 4 (a.k.a column 5) in a row will always contain the SQL data type value - retval = DBGetFieldAsInt(resultset, 4, &int_buffer, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_buffer != 1, - "Wrong converted SQL type: expected=%i, received=%i\n", - 1, int_buffer, connection, 0); - - // Index 13 (a.k.a column 14) in a row will also always contain the SQL data type value - retval = DBGetFieldAsInt(resultset, 13, &int_buffer, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_buffer != 1, - "Wrong converted SQL data type: expected=%i, received=%i\n", - 1, int_buffer, connection, 0); - - // Index 16 (a.k.a column 17) in a row will always contain the column ordinal position - retval = DBGetFieldAsInt(resultset, 16, &int_buffer, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_buffer != 1, - "Wrong ordinal position: expected=%i, received=%i\n", - 1, int_buffer, connection, 0); - - // Fetch second row - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_NO_MORE_DATA, - "DBFetch failed: Could not fetch the only row\n", - connection, 0); - - // Check second row data - // Index 2 (a.k.a column 3) in a row will always contain the name of the table - retval = DBGetFieldAsCString(resultset, 2, field, sizeof(field), &data_byte_size, &is_null_value, - err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(field, table_name) != 0, - "Tables do not have the same name: table_name:%s, field:%s\n", - table_name, field, connection, 0); - - retval = DBGetFieldDataLen(resultset, 2, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as table_name (%zu)\n", - col_len, strlen(field), connection, 0); - - // Index 3 (a.k.a column 4) in a row will always contain the name of the column - retval = DBGetFieldAsCString(resultset, 3, field, sizeof(field), &data_byte_size, &is_null_value, - err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsCString failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(strcmp(field, "value") != 0, - "Columns do not have the same name: column_name:%s, field:%s\n", - "key", field, connection, 0); - - retval = DBGetFieldDataLen(resultset, 3, &col_len, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldDataLen failed: Could not get the strlen\n", - connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(col_len != strlen(field), - "DBGetFieldDataLen failed: Returned length (%zu) was not the same as table_name (%zu)\n", - col_len, strlen(field), connection, 0); - - // Index 4 (a.k.a column 5) in a row will always contain the SQL data type value - retval = DBGetFieldAsInt(resultset, 4, &int_buffer, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_buffer != 1, - "Wrong converted SQL type: expected=%i, received=%i\n", - 1, int_buffer, connection, 0); - - // Index 13 (a.k.a column 14) in a row will also always contain the SQL data type value - retval = DBGetFieldAsInt(resultset, 13, &int_buffer, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_buffer != 1, - "Wrong converted SQL data type: expected=%i, received=%i\n", - 1, int_buffer, connection, 0); - - // Index 16 (a.k.a column 17) in a row will always contain the column ordinal position - retval = DBGetFieldAsInt(resultset, 16, &int_buffer, &is_null_value, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBGetFieldAsInt failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_TWO_ARG_CLOSE(int_buffer != 2, - "Wrong ordinal position: expected=%i, received=%i\n", - 2, int_buffer, connection, 0); - - // Fetch row (check that there is nothing else to fetch) - retval = DBFetch(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBFetch failed: %s\n", - err_buf, connection, 0); - RETURN_ON_ASSERT_NO_ARG_CLOSE(retval != HIVE_NO_MORE_DATA, - "DBFetch failed: Only one row, but fetched two\n", - connection, 0); - - // Close the resultset - retval = DBCloseResultSet(resultset, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG_CLOSE(retval == HIVE_ERROR, - "DBCloseResultSet failed: %s\n", - err_buf, connection, 0); - - // Clean up table - if (dropTable(connection, table_name) == HIVE_ERROR) { - DBCloseConnection(connection, err_buf, sizeof(err_buf)); - return 0; - } - - // Close the connection - retval = DBCloseConnection(connection, err_buf, sizeof(err_buf)); - RETURN_ON_ASSERT_ONE_ARG(retval == HIVE_ERROR, - "DBDisconnect failed: %s\n", - err_buf, 0); - return 1; -} - -/************************************************************************************************** - * MAIN FUNCTION - **************************************************************************************************/ - -int main() { - int failed = 0; - fprintf(stderr, "\nStarting Hive Client C tests...\n\n"); - - if (basic_connect_disconnect_test() == 0) { - failed++; - fprintf(stderr, "----FAILED basic_connect_disconnect_test!\n"); - } - if (basic_query_exec_test() == 0) { - failed++; - fprintf(stderr, "----FAILED basic_query_exec_test!\n"); - } - if (basic_fetch_test() == 0) { - failed++; - fprintf(stderr, "----FAILED basic_fetch_test!\n"); - } - if (show_tables_test() == 0) { - failed++; - fprintf(stderr, "----FAILED show_tables_test!\n"); - } - if (query_fetch_test() == 0) { - failed++; - fprintf(stderr, "----FAILED query_fetch_test!\n"); - } - if (numeric_range_test() == 0) { - failed++; - fprintf(stderr, "----FAILED numeric_range_test!\n"); - } - if (field_multifetch_test() == 0) { - failed++; - fprintf(stderr, "----FAILED field_multifetch_test!\n"); - } - if (meta_data_function_test() == 0) { - failed++; - fprintf(stderr, "----FAILED meta_data_function_test!\n"); - } - - if (failed == 0) { - fprintf(stderr, "\nALL HIVE CLIENT TESTS PASSED!\n\n"); - return 0; - } else { - fprintf(stderr, "\nHIVE CLIENT TEST FAILURE: %i test(s) failed.\n\n", failed); - return 1; - } -} - diff --git odbc/testdata/dataset1.input odbc/testdata/dataset1.input deleted file mode 100644 index b930c1b..0000000 --- odbc/testdata/dataset1.input +++ /dev/null @@ -1,2 +0,0 @@ -1foo -2bar diff --git odbc/testdata/dataset2.input odbc/testdata/dataset2.input deleted file mode 100644 index a8e72da..0000000 --- odbc/testdata/dataset2.input +++ /dev/null @@ -1 +0,0 @@ -100abcdefghijklmnopqrstuvwxyz diff --git odbc/testdata/dataset_types.input odbc/testdata/dataset_types.input deleted file mode 100644 index c4507e5..0000000 --- odbc/testdata/dataset_types.input +++ /dev/null @@ -1,2 +0,0 @@ --128-32768-2147483648-92233720368547758081.1754944E-382.225073858507201E-308\N -12732767214748364792233720368547758073.4028235E+381.797693134862315E+308\N diff --git packaging/src/main/assembly/src.xml packaging/src/main/assembly/src.xml index e8fc980..ba73bd5 100644 --- packaging/src/main/assembly/src.xml +++ packaging/src/main/assembly/src.xml @@ -83,7 +83,6 @@ llap-server/**/* lib/**/* findbugs/**/* - odbc/**/* orc/**/* packaging/pom.xml packaging/src/**/* diff --git pom.xml pom.xml index 836e397..2337e89 100644 --- pom.xml +++ pom.xml @@ -43,7 +43,6 @@ hwi jdbc metastore - odbc orc ql serde diff --git testutils/ptest2/conf/example-apache-trunk.properties testutils/ptest2/conf/example-apache-trunk.properties index a13e053..bb6952c 100644 --- testutils/ptest2/conf/example-apache-trunk.properties +++ testutils/ptest2/conf/example-apache-trunk.properties @@ -37,7 +37,7 @@ antArgs = -Dtest.continue.on.failure=true unitTests.directories = build/anttasks/test/classes build/beeline/test/classes build/cli/test/classes \ build/common/test/classes build/contrib/test/classes build/hbase-handler/test/classes \ - build/hwi/test/classes build/jdbc/test/classes build/metastore/test/classes build/odbc/test/classes \ + build/hwi/test/classes build/jdbc/test/classes build/metastore/test/classes \ build/ql/test/classes build/serde/test/classes build/service/test/classes build/shims/test/classes \ build/testutils/test/classes \ hcatalog/core/build/test/classes hcatalog/hcatalog-pig-adapter/build/test/classes \ -- 2.4.0