This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new fc3be9ee53 GH-50911: [C++][FlightSQL][ODBC] Replace RapidJSON with
JsonWriter (#50912)
fc3be9ee53 is described below
commit fc3be9ee53480e59b3a193dd641a75917e96939b
Author: Aaditya Srinivasan <[email protected]>
AuthorDate: Thu Aug 20 02:54:36 2026 +0530
GH-50911: [C++][FlightSQL][ODBC] Replace RapidJSON with JsonWriter (#50912)
### Rationale for this change
This PR continues the simdjson migration by replacing the remaining
RapidJSON usage in the FlightSQL ODBC JSON converter with Arrow's existing
`JsonWriter`.
### Changes
- Replace `rapidjson::Writer` and `rapidjson::StringBuffer` with
`arrow::json::JsonWriter`.
- Replace RapidJSON-specific `SizeType` usage with the `JsonWriter`
interface.
- Replace RapidJSON `RawValue` usage with `JsonWriter::RawValue`.
- Remove the unused RapidJSON dependency from the ODBC implementation
target.
- Preserve the existing `ConvertToJson` behavior and test coverage.
* GitHub Issue: #50911
Authored-by: Aaditya Srinivasan <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
.../arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 7 ++--
.../flight/sql/odbc/odbc_impl/json_converter.cc | 42 ++++++++++------------
2 files changed, 24 insertions(+), 25 deletions(-)
diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt
b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt
index 5a16c0361f..a455ddadd2 100644
--- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt
+++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt
@@ -134,7 +134,10 @@ if(WIN32)
find_package(ODBC REQUIRED)
target_include_directories(arrow_odbc_spi_impl PUBLIC ${ODBC_INCLUDE_DIR})
target_link_libraries(arrow_odbc_spi_impl
- PUBLIC arrow_flight_sql_shared arrow_compute_shared
Boost::locale
+ PUBLIC arrow_flight_sql_shared
+ arrow_compute_shared
+ Boost::locale
+ arrow::simdjson
${ODBCINST})
else()
# Unix
@@ -144,7 +147,7 @@ else()
arrow_compute_static
Boost::locale
Boost::headers
- RapidJSON)
+ arrow::simdjson)
if(NOT APPLE)
# Explicitly link to unix-odbc on Linux
diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/json_converter.cc
b/cpp/src/arrow/flight/sql/odbc/odbc_impl/json_converter.cc
index cfc8377a76..64e91ecd9b 100644
--- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/json_converter.cc
+++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/json_converter.cc
@@ -17,11 +17,10 @@
#include "arrow/flight/sql/odbc/odbc_impl/json_converter.h"
-#include <rapidjson/rapidjson.h>
-#include <rapidjson/writer.h>
#include <boost/beast/core/detail/base64.hpp>
#include "arrow/builder.h"
#include "arrow/flight/sql/odbc/odbc_impl/util.h"
+#include "arrow/json/json_writer_internal.h"
#include "arrow/scalar.h"
#include "arrow/visitor.h"
@@ -31,32 +30,31 @@ namespace base64 = boost::beast::detail::base64;
namespace arrow::flight::sql::odbc {
+using ::arrow::json::JsonWriter;
using util::ThrowIfNotOK;
namespace {
template <typename ScalarT>
-Status ConvertScalarToStringAndWrite(const ScalarT& scalar,
-
rapidjson::Writer<rapidjson::StringBuffer>& writer) {
+Status ConvertScalarToStringAndWrite(const ScalarT& scalar, JsonWriter&
writer) {
ARROW_ASSIGN_OR_RAISE(auto string_scalar, scalar.CastTo(arrow::utf8()))
const auto& view =
reinterpret_cast<StringScalar*>(string_scalar.get())->view();
- writer.String(view.data(), static_cast<rapidjson::SizeType>(view.length()),
true);
+ writer.String(view);
return Status::OK();
}
template <typename BinaryScalarT>
-Status ConvertBinaryToBase64StringAndWrite(
- const BinaryScalarT& scalar, rapidjson::Writer<rapidjson::StringBuffer>&
writer) {
+Status ConvertBinaryToBase64StringAndWrite(const BinaryScalarT& scalar,
+ JsonWriter& writer) {
const auto& view = scalar.view();
size_t encoded_size = base64::encoded_size(view.length());
std::vector<char> encoded(std::max(encoded_size, static_cast<size_t>(1)));
base64::encode(&encoded[0], view.data(), view.length());
- writer.String(&encoded[0], static_cast<rapidjson::SizeType>(encoded_size),
true);
+ writer.String(std::string_view(encoded.data(), encoded_size));
return Status::OK();
}
template <typename ListScalarT>
-Status WriteListScalar(const ListScalarT& scalar,
- rapidjson::Writer<rapidjson::StringBuffer>& writer,
+Status WriteListScalar(const ListScalarT& scalar, JsonWriter& writer,
ScalarVisitor* visitor) {
writer.StartArray();
for (int64_t i = 0; i < scalar.value->length(); ++i) {
@@ -75,16 +73,16 @@ Status WriteListScalar(const ListScalarT& scalar,
class ScalarToJson : public ScalarVisitor {
private:
- rapidjson::StringBuffer string_buffer_;
- rapidjson::Writer<rapidjson::StringBuffer> writer_{string_buffer_};
+ JsonWriter writer_;
public:
- void Reset() {
- string_buffer_.Clear();
- writer_.Reset(string_buffer_);
- }
+ void Reset() { writer_.Clear(); }
- std::string ToString() { return string_buffer_.GetString(); }
+ std::string ToString() {
+ auto result = writer_.GetString();
+ ThrowIfNotOK(result.status());
+ return std::string(*result);
+ }
Status Visit(const NullScalar& scalar) override {
writer_.Null();
@@ -164,7 +162,7 @@ class ScalarToJson : public ScalarVisitor {
Status Visit(const StringScalar& scalar) override {
const auto& view = scalar.view();
- writer_.String(view.data(),
static_cast<rapidjson::SizeType>(view.length()));
+ writer_.String(view);
return Status::OK();
}
@@ -175,7 +173,7 @@ class ScalarToJson : public ScalarVisitor {
Status Visit(const LargeStringScalar& scalar) override {
const auto& view = scalar.view();
- writer_.String(view.data(),
static_cast<rapidjson::SizeType>(view.length()));
+ writer_.String(view);
return Status::OK();
}
@@ -227,16 +225,14 @@ class ScalarToJson : public ScalarVisitor {
Status Visit(const Decimal128Scalar& scalar) override {
const auto& view = scalar.ToString();
- writer_.RawValue(view.data(),
static_cast<rapidjson::SizeType>(view.length()),
- rapidjson::kNumberType);
+ writer_.RawValue(view);
return Status::OK();
}
Status Visit(const Decimal256Scalar& scalar) override {
const auto& view = scalar.ToString();
- writer_.RawValue(view.data(),
static_cast<rapidjson::SizeType>(view.length()),
- rapidjson::kNumberType);
+ writer_.RawValue(view);
return Status::OK();
}