Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/cpp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ jobs:
ARROW_DATASET: ON
ARROW_FLIGHT: ON
ARROW_FLIGHT_SQL: ON
ARROW_FLIGHT_SQL_ODBC: ON
ARROW_GANDIVA: ON
ARROW_GCS: ON
ARROW_HDFS: OFF
Expand Down
8 changes: 8 additions & 0 deletions cpp/CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,14 @@
"ARROW_FLIGHT_SQL": "ON"
}
},
{
"name": "features-flight-sql-odbc",
"inherits": "features-flight-sql",
"hidden": true,
"cacheVariables": {
"ARROW_FLIGHT_SQL_ODBC": "ON"
}
},
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remove this and add only "ARROW_FLIGHT_SQL_ODBC": "ON" to features-maximal instead?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Kou, I'll look into your comments, thanks

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed the code

{
"name": "features-gandiva",
"inherits": "features-basic",
Expand Down
3 changes: 3 additions & 0 deletions cpp/build-support/lint_cpp_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ def lint_file(path):

EXCLUSIONS = _paths('''\
arrow/arrow-config.cmake
arrow/flight/sql/odbc/flight_sql/get_info_cache.h
arrow/flight/sql/odbc/odbcabstraction/include/odbcabstraction/blocking_queue.h
arrow/flight/sql/odbc/odbcabstraction/include/odbcabstraction/odbc_impl/odbc_handle.h
Comment on lines +80 to +82
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need them?
Are they copied from somewhere?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The arrow/flight/sql/odbc code are part of the flightsql-odbc contribution.

CLI/C++ support is being removed (#45810) to allow usage of std::mutex, so adding the lint ignore here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, OK. Let's work on #45810 (remove CLI/C++ support) before this.

Do you want to work on #45810 or do you want me to work on #45810?

arrow/python/iterators.h
arrow/util/hashing.h
arrow/util/macros.h
Expand Down
7 changes: 7 additions & 0 deletions cpp/cmake_modules/DefineOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,13 @@ takes precedence over ccache if a storage backend is configured" ON)
DEPENDS
ARROW_FLIGHT)

define_option(ARROW_FLIGHT_SQL_ODBC
"Build the Arrow Flight SQL ODBC extension"
OFF
DEPENDS
ARROW_FLIGHT_SQL
ARROW_COMPUTE)

define_option(ARROW_GANDIVA
"Build the Gandiva libraries"
OFF
Expand Down
4 changes: 4 additions & 0 deletions cpp/src/arrow/flight/sql/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -168,3 +168,7 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_EXAMPLES)
endforeach()
endif()
endif()

if(ARROW_FLIGHT_SQL_ODBC)
add_subdirectory(odbc)
endif()
32 changes: 32 additions & 0 deletions cpp/src/arrow/flight/sql/odbc/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# 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.

cmake_minimum_required(VERSION 3.16)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need this because we have this in the top-level CMakeLists.txt.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

set(CMAKE_CXX_STANDARD 17)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remove this because this is configured in other place?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed


add_custom_target(arrow_flight_sql_odbc)

if(CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_definitions(NDEBUG)
endif()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remove this?
CMake does this by default.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed


# Add Boost dependencies. Should be pre-installed (Brew on Mac).
find_package(Boost REQUIRED)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remove this and update

# - Gandiva has a compile-time (header-only) dependency on Boost, not runtime.
# - Tests need Boost at runtime.
# - S3FS and Flight benchmarks need Boost at runtime.
# - arrow_testing uses boost::filesystem. So arrow_testing requires
# Boost library. (boost::filesystem isn't header-only.) But if we
# use arrow_testing as a static library without
# using arrow::util::Process, we don't need boost::filesystem.
if(ARROW_BUILD_INTEGRATION
OR ARROW_BUILD_TESTS
OR (ARROW_FLIGHT AND (ARROW_TESTING OR ARROW_BUILD_BENCHMARKS))
OR (ARROW_S3 AND ARROW_BUILD_BENCHMARKS)
OR (ARROW_TESTING AND ARROW_BUILD_SHARED))
set(ARROW_USE_BOOST TRUE)
set(ARROW_BOOST_REQUIRE_LIBRARY TRUE)
elseif(ARROW_GANDIVA
OR ARROW_TESTING
OR ARROW_WITH_THRIFT
OR (NOT ARROW_USE_NATIVE_INT128))
set(ARROW_USE_BOOST TRUE)
set(ARROW_BOOST_REQUIRE_LIBRARY FALSE)
else()
set(ARROW_USE_BOOST FALSE)
endif()
instead?

BTW, do we really need Boost? For example, boost/optional.h can be replaced with std::optional in C++17.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question, the flightsql-odbc uses Boost algorithm and Boost copy as well, so would keep the Boost dependency

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed find_package for Boost, updated ThirdpartyToolchain.cmake

find_package(ODBC REQUIRED)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you do this in cpp/cmake_modules/ThirdpartyToolchain.cmake instead?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved to ThirdpartyToolchain.cmake


add_subdirectory(flight_sql)
add_subdirectory(odbcabstraction)
176 changes: 176 additions & 0 deletions cpp/src/arrow/flight/sql/odbc/flight_sql/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
# 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.

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 17)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed


set(CMAKE_POSITION_INDEPENDENT_CODE ON)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is enabled by default:

define_option(ARROW_POSITION_INDEPENDENT_CODE
"Whether to create position-independent target" ON)

Do we need this?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, removed


include_directories(include include/flight_sql
${CMAKE_SOURCE_DIR}/odbcabstraction/include)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you use target based CMake API (target_include_directories()) instead of traditional global CMake API?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup, used target_include_directories instead


if(DEFINED CMAKE_TOOLCHAIN_FILE)
include(${CMAKE_TOOLCHAIN_FILE})
endif()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove this because this is not a top-level CMakeLists.txt?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, removed


find_package(RapidJSON CONFIG REQUIRED)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you update

# ----------------------------------------------------------------------
# Some EP's require other EP's
if(ARROW_WITH_OPENTELEMETRY)
set(ARROW_WITH_NLOHMANN_JSON ON)
set(ARROW_WITH_PROTOBUF ON)
endif()
if(ARROW_PARQUET)
set(ARROW_WITH_RAPIDJSON ON)
set(ARROW_WITH_THRIFT ON)
endif()
if(ARROW_WITH_THRIFT)
set(ARROW_WITH_ZLIB ON)
endif()
if(ARROW_FLIGHT)
set(ARROW_WITH_GRPC ON)
endif()
if(ARROW_WITH_GRPC)
set(ARROW_WITH_RE2 ON)
set(ARROW_WITH_ZLIB ON)
endif()
if(ARROW_GCS)
set(ARROW_WITH_GOOGLE_CLOUD_CPP ON)
set(ARROW_WITH_NLOHMANN_JSON ON)
set(ARROW_WITH_ZLIB ON)
endif()
if(ARROW_AZURE)
set(ARROW_WITH_AZURE_SDK ON)
endif()
if(ARROW_JSON)
set(ARROW_WITH_RAPIDJSON ON)
endif()
if(ARROW_ORC OR ARROW_FLIGHT)
set(ARROW_WITH_PROTOBUF ON)
endif()
if(ARROW_SUBSTRAIT)
set(ARROW_WITH_PROTOBUF ON)
endif()
if(ARROW_S3)
set(ARROW_WITH_ZLIB ON)
endif()
if((NOT ARROW_COMPUTE) AND (NOT ARROW_GANDIVA))
set(ARROW_WITH_UTF8PROC OFF)
endif()
if((NOT ARROW_COMPUTE)
AND (NOT ARROW_GANDIVA)
AND (NOT ARROW_WITH_GRPC))
set(ARROW_WITH_RE2 OFF)
endif()
instead of this?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, done


if(MSVC)
# the following definitions stop arrow from using __declspec when statically
# linking and will break on Windows without them
add_compile_definitions(ARROW_STATIC ARROW_FLIGHT_STATIC)
endif()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need this because arrow_static/arrow_flight_static CMake targets do this automatically.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed


enable_testing()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately, Apache Arrow C++ doesn't use CMake's standard testing mechanism for now...

Could you remove this for now?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, removed


add_library(arrow_odbc_spi_impl
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you use our add_arrow_lib() instead?

function(ADD_ARROW_LIB LIB_NAME)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have an upcoming PR#46099 that uses add_arrow_lib(arrow_flight_sql_odbc) to add an arrow library at the odbc directory. The flight_sql and odbcabstraction directories are subfolders to arrow_flight_sql_odbc, so I suggest we keep add_library for these 2 subfolders.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I may misunderstand your comment... What will be focused in #46099? Will #46099 focus on replacing add_library() with add_arrow_lib()?

The flight_sql and odbcabstraction directories are subfolders to arrow_flight_sql_odbc, so I suggest we keep add_library for these 2 subfolders.

Could you explain why add_library() is better for them? (I'm not sure why "subfolders" is important here.)

include/flight_sql/flight_sql_driver.h
accessors/binary_array_accessor.cc
accessors/binary_array_accessor.h
accessors/boolean_array_accessor.cc
accessors/boolean_array_accessor.h
accessors/common.h
accessors/date_array_accessor.cc
accessors/date_array_accessor.h
accessors/decimal_array_accessor.cc
accessors/decimal_array_accessor.h
accessors/main.h
accessors/primitive_array_accessor.cc
accessors/primitive_array_accessor.h
accessors/string_array_accessor.cc
accessors/string_array_accessor.h
accessors/time_array_accessor.cc
accessors/time_array_accessor.h
accessors/timestamp_array_accessor.cc
accessors/timestamp_array_accessor.h
address_info.cc
address_info.h
flight_sql_auth_method.cc
flight_sql_auth_method.h
flight_sql_connection.cc
flight_sql_connection.h
flight_sql_driver.cc
flight_sql_get_tables_reader.cc
flight_sql_get_tables_reader.h
flight_sql_get_type_info_reader.cc
flight_sql_get_type_info_reader.h
flight_sql_result_set.cc
flight_sql_result_set.h
flight_sql_result_set_accessors.cc
flight_sql_result_set_accessors.h
flight_sql_result_set_column.cc
flight_sql_result_set_column.h
flight_sql_result_set_metadata.cc
flight_sql_result_set_metadata.h
flight_sql_ssl_config.cc
flight_sql_ssl_config.h
flight_sql_statement.cc
flight_sql_statement.h
flight_sql_statement_get_columns.cc
flight_sql_statement_get_columns.h
flight_sql_statement_get_tables.cc
flight_sql_statement_get_tables.h
flight_sql_statement_get_type_info.cc
flight_sql_statement_get_type_info.h
flight_sql_stream_chunk_buffer.cc
flight_sql_stream_chunk_buffer.h
get_info_cache.cc
get_info_cache.h
json_converter.cc
json_converter.h
record_batch_transformer.cc
record_batch_transformer.h
scalar_function_reporter.cc
scalar_function_reporter.h
system_trust_store.cc
system_trust_store.h
utils.cc)
target_include_directories(arrow_odbc_spi_impl PUBLIC ${CMAKE_CURRENT_LIST_DIR})

if(WIN32)
target_sources(arrow_odbc_spi_impl
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
target_sources(arrow_odbc_spi_impl
target_sources(arrow_odbc_spi_impl PRIVATE

According to cmake docs, target_sources need a INTERFACE, PUBLIC or PRIVATE keyword to be able to build. I feel PRIVATE might be suitable here

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding the keyword resolved some build issues from my local environment

PRIVATE include/flight_sql/config/configuration.h
include/flight_sql/config/connection_string_parser.h
include/flight_sql/ui/add_property_window.h
include/flight_sql/ui/custom_window.h
include/flight_sql/ui/dsn_configuration_window.h
include/flight_sql/ui/window.h
config/configuration.cc
config/connection_string_parser.cc
ui/custom_window.cc
ui/window.cc
ui/dsn_configuration_window.cc
ui/add_property_window.cc
system_dsn.cc)
endif()

find_package(ArrowFlightSql)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need this, right?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup, removed


target_link_libraries(arrow_odbc_spi_impl PUBLIC odbcabstraction arrow_flight_sql_shared)

if(MSVC)
set(CMAKE_CXX_FLAGS_RELEASE "/MD")
set(CMAKE_CXX_FLAGS_DEBUG "/MDd")
# else
# target_link_libraries(arrow_odbc_spi_impl PUBLIC ArrowFlightSql::arrow_flight_sql_static)
endif()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this?
I think that they are default.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed this block of code


# set(ARROW_ODBC_SPI_THIRDPARTY_LIBS
# ${ARROW_LIBS} gRPC::grpc++ ${ZLIB_LIBRARIES} ${Protobuf_LIBRARIES}
# ${OPENSSL_LIBRARIES} ${RapidJSON_LIBRARIES})
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove this?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed


if(MSVC)
find_package(Boost REQUIRED COMPONENTS locale)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you do this in ThirdpartyToolchain.cmake?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, moved to ThirdpartyToolchain.cmake

target_link_libraries(arrow_odbc_spi_impl PUBLIC Boost::locale)
endif()

set_target_properties(arrow_odbc_spi_impl
PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/$<CONFIG>/lib
LIBRARY_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/$<CONFIG>/lib
RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/$<CONFIG>/lib)
Comment on lines +108 to +114
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We may be able to remove this by add_arrow_lib().

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


# target_include_directories(arrow_odbc_spi_impl
# PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove this?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed


# CLI
add_executable(arrow_odbc_spi_impl_cli main.cc)
set_target_properties(arrow_odbc_spi_impl_cli
PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/$<CONFIG>/bin)
target_link_libraries(arrow_odbc_spi_impl_cli arrow_odbc_spi_impl)

# Unit tests
add_arrow_test(arrow_odbc_spi_impl_test
SOURCES
accessors/boolean_array_accessor_test.cc
accessors/binary_array_accessor_test.cc
accessors/date_array_accessor_test.cc
accessors/decimal_array_accessor_test.cc
accessors/primitive_array_accessor_test.cc
accessors/string_array_accessor_test.cc
accessors/time_array_accessor_test.cc
accessors/timestamp_array_accessor_test.cc
flight_sql_connection_test.cc
parse_table_types_test.cc
json_converter_test.cc
record_batch_transformer_test.cc
utils_test.cc
EXTRA_LINK_LIBS
arrow_odbc_spi_impl)
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// 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 "arrow/flight/sql/odbc/flight_sql/accessors/binary_array_accessor.h"

#include <algorithm>
#include <cstdint>
#include "arrow/array.h"

namespace driver {
namespace flight_sql {

using arrow::BinaryArray;
using odbcabstraction::RowStatus;

namespace {

inline RowStatus MoveSingleCellToBinaryBuffer(ColumnBinding* binding, BinaryArray* array,
int64_t arrow_row, int64_t i,
int64_t& value_offset,
bool update_value_offset,
odbcabstraction::Diagnostics& diagnostics) {
RowStatus result = odbcabstraction::RowStatus_SUCCESS;

const char* value = array->Value(arrow_row).data();
size_t size_in_bytes = array->value_length(arrow_row);

size_t remaining_length = static_cast<size_t>(size_in_bytes - value_offset);
size_t value_length = std::min(remaining_length, binding->buffer_length);

auto* byte_buffer =
static_cast<unsigned char*>(binding->buffer) + i * binding->buffer_length;
memcpy(byte_buffer, ((char*)value) + value_offset, value_length);

if (remaining_length > binding->buffer_length) {
result = odbcabstraction::RowStatus_SUCCESS_WITH_INFO;
diagnostics.AddTruncationWarning();
if (update_value_offset) {
value_offset += value_length;
}
} else if (update_value_offset) {
value_offset = -1;
}

if (binding->strlen_buffer) {
binding->strlen_buffer[i] = static_cast<ssize_t>(remaining_length);
}

return result;
}

} // namespace

template <CDataType TARGET_TYPE>
BinaryArrayFlightSqlAccessor<TARGET_TYPE>::BinaryArrayFlightSqlAccessor(Array* array)
: FlightSqlAccessor<BinaryArray, TARGET_TYPE,
BinaryArrayFlightSqlAccessor<TARGET_TYPE>>(array) {}

template <>
RowStatus
BinaryArrayFlightSqlAccessor<odbcabstraction::CDataType_BINARY>::MoveSingleCell_impl(
ColumnBinding* binding, int64_t arrow_row, int64_t i, int64_t& value_offset,
bool update_value_offset, odbcabstraction::Diagnostics& diagnostics) {
return MoveSingleCellToBinaryBuffer(binding, this->GetArray(), arrow_row, i,
value_offset, update_value_offset, diagnostics);
}

template <CDataType TARGET_TYPE>
size_t BinaryArrayFlightSqlAccessor<TARGET_TYPE>::GetCellLength_impl(
ColumnBinding* binding) const {
return binding->buffer_length;
}

template class BinaryArrayFlightSqlAccessor<odbcabstraction::CDataType_BINARY>;

} // namespace flight_sql
} // namespace driver
Loading
Loading