summaryrefslogtreecommitdiffstats
path: root/src/arrow/c_glib/arrow-glib/ipc-options.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/arrow/c_glib/arrow-glib/ipc-options.cpp')
-rw-r--r--src/arrow/c_glib/arrow-glib/ipc-options.cpp529
1 files changed, 529 insertions, 0 deletions
diff --git a/src/arrow/c_glib/arrow-glib/ipc-options.cpp b/src/arrow/c_glib/arrow-glib/ipc-options.cpp
new file mode 100644
index 000000000..86bae4adf
--- /dev/null
+++ b/src/arrow/c_glib/arrow-glib/ipc-options.cpp
@@ -0,0 +1,529 @@
+/*
+ * 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-glib/codec.hpp>
+#include <arrow-glib/enums.h>
+#include <arrow-glib/ipc-options.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: ipc-options
+ * @section_id: ipc-options-classes
+ * @title: IPC options classes
+ * @include: arrow-glib/arrow-glib.h
+ *
+ * #GArrowReadOptions provides options for reading data.
+ *
+ * #GArrowWriteOptions provides options for writing data.
+ */
+
+typedef struct GArrowReadOptionsPrivate_ {
+ arrow::ipc::IpcReadOptions options;
+ arrow::ipc::DictionaryMemo dictionary_memo;
+} GArrowReadOptionsPrivate;
+
+enum {
+ PROP_READ_OPTIONS_MAX_RECURSION_DEPTH = 1,
+ PROP_READ_OPTIONS_USE_THREADS,
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(GArrowReadOptions,
+ garrow_read_options,
+ G_TYPE_OBJECT);
+
+#define GARROW_READ_OPTIONS_GET_PRIVATE(obj) \
+ static_cast<GArrowReadOptionsPrivate *>( \
+ garrow_read_options_get_instance_private( \
+ GARROW_READ_OPTIONS(obj)))
+
+static void
+garrow_read_options_finalize(GObject *object)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(object);
+
+ priv->options.~IpcReadOptions();
+ priv->dictionary_memo.~DictionaryMemo();
+
+ G_OBJECT_CLASS(garrow_read_options_parent_class)->finalize(object);
+}
+
+static void
+garrow_read_options_set_property(GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(object);
+
+ switch (prop_id) {
+ case PROP_READ_OPTIONS_MAX_RECURSION_DEPTH:
+ priv->options.max_recursion_depth = g_value_get_int(value);
+ break;
+ case PROP_READ_OPTIONS_USE_THREADS:
+ priv->options.use_threads = g_value_get_boolean(value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+garrow_read_options_get_property(GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(object);
+
+ switch (prop_id) {
+ case PROP_READ_OPTIONS_MAX_RECURSION_DEPTH:
+ g_value_set_int(value, priv->options.max_recursion_depth);
+ break;
+ case PROP_READ_OPTIONS_USE_THREADS:
+ g_value_set_boolean(value, priv->options.use_threads);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+garrow_read_options_init(GArrowReadOptions *object)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(object);
+ new(&priv->options) arrow::ipc::IpcReadOptions;
+ priv->options = arrow::ipc::IpcReadOptions::Defaults();
+ new(&priv->dictionary_memo) arrow::ipc::DictionaryMemo;
+}
+
+static void
+garrow_read_options_class_init(GArrowReadOptionsClass *klass)
+{
+ auto gobject_class = G_OBJECT_CLASS(klass);
+
+ gobject_class->finalize = garrow_read_options_finalize;
+ gobject_class->set_property = garrow_read_options_set_property;
+ gobject_class->get_property = garrow_read_options_get_property;
+
+ auto options = arrow::ipc::IpcReadOptions::Defaults();
+
+ GParamSpec *spec;
+
+ /**
+ * GArrowReadOptions:max-recursion-depth:
+ *
+ * The maximum permitted schema nesting depth.
+ *
+ * Since: 1.0.0
+ */
+ spec = g_param_spec_int("max-recursion-depth",
+ "Max recursion depth",
+ "The maximum permitted schema nesting depth",
+ 0,
+ arrow::ipc::kMaxNestingDepth,
+ options.max_recursion_depth,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_READ_OPTIONS_MAX_RECURSION_DEPTH,
+ spec);
+
+ /**
+ * GArrowReadOptions:use-threads:
+ *
+ * Whether to use the global CPU thread pool.
+ *
+ * Since: 1.0.0
+ */
+ spec = g_param_spec_boolean("use-threads",
+ "Use threads",
+ "Whether to use the global CPU thread pool",
+ options.use_threads,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_READ_OPTIONS_USE_THREADS,
+ spec);
+}
+
+/**
+ * garrow_read_options_new:
+ *
+ * Returns: A newly created #GArrowReadOptions.
+ *
+ * Since: 1.0.0
+ */
+GArrowReadOptions *
+garrow_read_options_new(void)
+{
+ auto options = g_object_new(GARROW_TYPE_READ_OPTIONS, NULL);
+ return GARROW_READ_OPTIONS(options);
+}
+
+/**
+ * garrow_read_options_get_included_fields:
+ * @options: A #GArrowReadOptions.
+ * @n_fields: (out): The number of included fields.
+ *
+ * Returns: (array length=n_fields) (transfer full):
+ * Top-level schema fields to include when deserializing
+ * RecordBatch. If empty, return all deserialized fields.
+ *
+ * It should be freed with g_free() when no longer needed.
+ *
+ * Since: 1.0.0
+ */
+int *
+garrow_read_options_get_included_fields(GArrowReadOptions *options,
+ gsize *n_fields)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(options);
+ if (priv->options.included_fields.empty()) {
+ if (n_fields) {
+ *n_fields = 0;
+ }
+ return NULL;
+ }
+
+ auto n = priv->options.included_fields.size();
+ auto fields = g_new(int, n);
+ if (n_fields) {
+ *n_fields = n;
+ }
+ for (size_t i = 0; i < n; ++i) {
+ fields[i] = priv->options.included_fields[i];
+ }
+ return fields;
+}
+
+/**
+ * garrow_read_options_set_included_fields:
+ * @options: A #GArrowReadOptions.
+ * @fields: (array length=n_fields): Top-level schema fields to
+ * include when deserializing RecordBatch. If empty, return all
+ * deserialized fields.
+ * @n_fields: The number of included fields.
+ *
+ * Since: 1.0.0
+ */
+void
+garrow_read_options_set_included_fields(GArrowReadOptions *options,
+ int *fields,
+ gsize n_fields)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(options);
+
+ priv->options.included_fields.resize(n_fields);
+ for (gsize i = 0; i < n_fields; ++i) {
+ priv->options.included_fields[i] = fields[i];
+ }
+}
+
+
+typedef struct GArrowWriteOptionsPrivate_ {
+ arrow::ipc::IpcWriteOptions options;
+ GArrowCodec *codec;
+} GArrowWriteOptionsPrivate;
+
+enum {
+ PROP_WRITE_OPTIONS_ALLOW_64BIT = 1,
+ PROP_WRITE_OPTIONS_MAX_RECURSION_DEPTH,
+ PROP_WRITE_OPTIONS_ALIGNMENT,
+ PROP_WRITE_OPTIONS_WRITE_LEGACY_IPC_FORMAT,
+ PROP_WRITE_OPTIONS_CODEC,
+ PROP_WRITE_OPTIONS_USE_THREADS,
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(GArrowWriteOptions,
+ garrow_write_options,
+ G_TYPE_OBJECT);
+
+#define GARROW_WRITE_OPTIONS_GET_PRIVATE(obj) \
+ static_cast<GArrowWriteOptionsPrivate *>( \
+ garrow_write_options_get_instance_private( \
+ GARROW_WRITE_OPTIONS(obj)))
+
+static void
+garrow_write_options_dispose(GObject *object)
+{
+ auto priv = GARROW_WRITE_OPTIONS_GET_PRIVATE(object);
+
+ if (priv->codec) {
+ g_object_unref(priv->codec);
+ priv->codec = NULL;
+ }
+
+ G_OBJECT_CLASS(garrow_write_options_parent_class)->dispose(object);
+}
+
+static void
+garrow_write_options_finalize(GObject *object)
+{
+ auto priv = GARROW_WRITE_OPTIONS_GET_PRIVATE(object);
+
+ priv->options.~IpcWriteOptions();
+
+ G_OBJECT_CLASS(garrow_write_options_parent_class)->finalize(object);
+}
+
+static void
+garrow_write_options_set_property(GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ auto priv = GARROW_WRITE_OPTIONS_GET_PRIVATE(object);
+
+ switch (prop_id) {
+ case PROP_WRITE_OPTIONS_ALLOW_64BIT:
+ priv->options.allow_64bit = g_value_get_boolean(value);
+ break;
+ case PROP_WRITE_OPTIONS_MAX_RECURSION_DEPTH:
+ priv->options.max_recursion_depth = g_value_get_int(value);
+ break;
+ case PROP_WRITE_OPTIONS_ALIGNMENT:
+ priv->options.alignment = g_value_get_int(value);
+ break;
+ case PROP_WRITE_OPTIONS_WRITE_LEGACY_IPC_FORMAT:
+ priv->options.write_legacy_ipc_format = g_value_get_boolean(value);
+ break;
+ case PROP_WRITE_OPTIONS_CODEC:
+ if (priv->codec) {
+ g_object_unref(priv->codec);
+ }
+ priv->codec = GARROW_CODEC(g_value_dup_object(value));
+ priv->options.codec = garrow_codec_get_raw(priv->codec);
+ break;
+ case PROP_WRITE_OPTIONS_USE_THREADS:
+ priv->options.use_threads = g_value_get_boolean(value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+garrow_write_options_get_property(GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ auto priv = GARROW_WRITE_OPTIONS_GET_PRIVATE(object);
+
+ switch (prop_id) {
+ case PROP_WRITE_OPTIONS_ALLOW_64BIT:
+ g_value_set_boolean(value, priv->options.allow_64bit);
+ break;
+ case PROP_WRITE_OPTIONS_MAX_RECURSION_DEPTH:
+ g_value_set_int(value, priv->options.max_recursion_depth);
+ break;
+ case PROP_WRITE_OPTIONS_ALIGNMENT:
+ g_value_set_int(value, priv->options.alignment);
+ break;
+ case PROP_WRITE_OPTIONS_WRITE_LEGACY_IPC_FORMAT:
+ g_value_set_boolean(value, priv->options.write_legacy_ipc_format);
+ break;
+ case PROP_WRITE_OPTIONS_CODEC:
+ g_value_set_object(value, priv->codec);
+ break;
+ case PROP_WRITE_OPTIONS_USE_THREADS:
+ g_value_set_boolean(value, priv->options.use_threads);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+garrow_write_options_init(GArrowWriteOptions *object)
+{
+ auto priv = GARROW_WRITE_OPTIONS_GET_PRIVATE(object);
+ new(&priv->options) arrow::ipc::IpcWriteOptions;
+ priv->options = arrow::ipc::IpcWriteOptions::Defaults();
+ if (priv->options.codec) {
+ priv->codec = garrow_codec_new_raw(&(priv->options.codec));
+ } else {
+ priv->codec = NULL;
+ }
+}
+
+static void
+garrow_write_options_class_init(GArrowWriteOptionsClass *klass)
+{
+ auto gobject_class = G_OBJECT_CLASS(klass);
+
+ gobject_class->dispose = garrow_write_options_dispose;
+ gobject_class->finalize = garrow_write_options_finalize;
+ gobject_class->set_property = garrow_write_options_set_property;
+ gobject_class->get_property = garrow_write_options_get_property;
+
+ auto options = arrow::ipc::IpcWriteOptions::Defaults();
+
+ GParamSpec *spec;
+
+ /**
+ * GArrowWriteOptions:allow-64bit:
+ *
+ * Whether to allow field lengths that don't fit in a signed 32-bit
+ * int. Some implementations may not be able to parse such streams.
+ *
+ * Since: 1.0.0
+ */
+ spec = g_param_spec_boolean("allow-64bit",
+ "Allow 64bit",
+ "Whether to allow signed 64-bit int "
+ "for field length",
+ options.allow_64bit,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_WRITE_OPTIONS_ALLOW_64BIT,
+ spec);
+
+ /**
+ * GArrowWriteOptions:max-recursion-depth:
+ *
+ * The maximum permitted schema nesting depth.
+ *
+ * Since: 1.0.0
+ */
+ spec = g_param_spec_int("max-recursion-depth",
+ "Max recursion depth",
+ "The maximum permitted schema nesting depth",
+ 0,
+ arrow::ipc::kMaxNestingDepth,
+ options.max_recursion_depth,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_WRITE_OPTIONS_MAX_RECURSION_DEPTH,
+ spec);
+
+ /**
+ * GArrowWriteOptions:alignment:
+ *
+ * Write padding after memory buffers to this multiple of
+ * bytes. Generally 8 or 64.
+ *
+ * Since: 1.0.0
+ */
+ spec = g_param_spec_int("alignment",
+ "Alignment",
+ "Write padding "
+ "after memory buffers to this multiple of bytes",
+ 0,
+ G_MAXINT,
+ options.alignment,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_WRITE_OPTIONS_ALIGNMENT,
+ spec);
+
+ /**
+ * GArrowWriteOptions:write-legacy-ipc-format:
+ *
+ * Whether to write the pre-0.15.0 encapsulated IPC message format
+ * consisting of a 4-byte prefix instead of 8 byte.
+ *
+ * Since: 1.0.0
+ */
+ spec = g_param_spec_boolean("write-legacy-ipc-format",
+ "Write legacy IPC format",
+ "Whether to write legacy IPC format",
+ options.write_legacy_ipc_format,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_WRITE_OPTIONS_WRITE_LEGACY_IPC_FORMAT,
+ spec);
+
+ /**
+ * GArrowWriteOptions:codec:
+ *
+ * Codec to use for compressing and decompressing record batch body
+ * buffers. This is not part of the Arrow IPC protocol and only for
+ * internal use (e.g. Feather files).
+ *
+ * May only be UNCOMPRESSED, LZ4_FRAME and ZSTD.
+ *
+ * Since: 2.0.0
+ */
+ spec = g_param_spec_object("codec",
+ "Codec",
+ "Codec to use for "
+ "compressing record batch body buffers.",
+ GARROW_TYPE_CODEC,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_WRITE_OPTIONS_CODEC,
+ spec);
+
+ /**
+ * GArrowWriteOptions:use-threads:
+ *
+ * Whether to use the global CPU thread pool.
+ *
+ * Since: 1.0.0
+ */
+ spec = g_param_spec_boolean("use-threads",
+ "Use threads",
+ "Whether to use the global CPU thread pool",
+ options.use_threads,
+ static_cast<GParamFlags>(G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class,
+ PROP_WRITE_OPTIONS_USE_THREADS,
+ spec);
+}
+
+/**
+ * garrow_write_options_new:
+ *
+ * Returns: A newly created #GArrowWriteOptions.
+ *
+ * Since: 1.0.0
+ */
+GArrowWriteOptions *
+garrow_write_options_new(void)
+{
+ auto options = g_object_new(GARROW_TYPE_WRITE_OPTIONS, NULL);
+ return GARROW_WRITE_OPTIONS(options);
+}
+
+G_END_DECLS
+
+arrow::ipc::IpcReadOptions *
+garrow_read_options_get_raw(GArrowReadOptions *options)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(options);
+ return &(priv->options);
+}
+
+arrow::ipc::DictionaryMemo *
+garrow_read_options_get_dictionary_memo_raw(GArrowReadOptions *options)
+{
+ auto priv = GARROW_READ_OPTIONS_GET_PRIVATE(options);
+ return &(priv->dictionary_memo);
+}
+
+arrow::ipc::IpcWriteOptions *
+garrow_write_options_get_raw(GArrowWriteOptions *options)
+{
+ auto priv = GARROW_WRITE_OPTIONS_GET_PRIVATE(options);
+ return &(priv->options);
+}