diff --git a/c_glib/arrow-glib/reader.cpp b/c_glib/arrow-glib/reader.cpp index f1683a69ee8..636a3c74707 100644 --- a/c_glib/arrow-glib/reader.cpp +++ b/c_glib/arrow-glib/reader.cpp @@ -1484,7 +1484,7 @@ typedef struct GArrowCSVReaderPrivate_ { enum { PROP_CSV_TABLE_READER = 1, - PROP_INPUT, + PROP_CSV_READER_INPUT, }; G_DEFINE_TYPE_WITH_PRIVATE(GArrowCSVReader, @@ -1532,7 +1532,7 @@ garrow_csv_reader_set_property(GObject *object, priv->reader = *static_cast *>(g_value_get_pointer(value)); break; - case PROP_INPUT: + case PROP_CSV_READER_INPUT: priv->input = GARROW_INPUT_STREAM(g_value_dup_object(value)); break; default: @@ -1550,7 +1550,7 @@ garrow_csv_reader_get_property(GObject *object, auto priv = GARROW_CSV_READER_GET_PRIVATE(object); switch (prop_id) { - case PROP_INPUT: + case PROP_CSV_READER_INPUT: g_value_set_object(value, priv->input); break; default: @@ -1590,7 +1590,9 @@ garrow_csv_reader_class_init(GArrowCSVReaderClass *klass) GARROW_TYPE_INPUT_STREAM, static_cast(G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property(gobject_class, PROP_INPUT, spec); + g_object_class_install_property(gobject_class, + PROP_CSV_READER_INPUT, + spec); } /** @@ -1666,11 +1668,11 @@ typedef struct GArrowJSONReadOptionsPrivate_ { } GArrowJSONReadOptionsPrivate; enum { - PROP_JSON_READER_USE_THREADS = 1, - PROP_JSON_READER_BLOCK_SIZE, - PROP_JSON_READER_ALLOW_NEWLINES_IN_VALUES, - PROP_JSON_READER_UNEXPECTED_FIELD_BEHAVIOR, - PROP_JSON_READER_SCHEMA + PROP_JSON_READ_OPTIONS_USE_THREADS = 1, + PROP_JSON_READ_OPTIONS_BLOCK_SIZE, + PROP_JSON_READ_OPTIONS_ALLOW_NEWLINES_IN_VALUES, + PROP_JSON_READ_OPTIONS_UNEXPECTED_FIELD_BEHAVIOR, + PROP_JSON_READ_OPTIONS_SCHEMA, }; G_DEFINE_TYPE_WITH_PRIVATE(GArrowJSONReadOptions, @@ -1704,20 +1706,20 @@ garrow_json_read_options_set_property(GObject *object, auto priv = GARROW_JSON_READ_OPTIONS_GET_PRIVATE(object); switch (prop_id) { - case PROP_JSON_READER_USE_THREADS: + case PROP_JSON_READ_OPTIONS_USE_THREADS: priv->read_options.use_threads = g_value_get_boolean(value); break; - case PROP_JSON_READER_BLOCK_SIZE: + case PROP_JSON_READ_OPTIONS_BLOCK_SIZE: priv->read_options.block_size = g_value_get_int(value); break; - case PROP_JSON_READER_ALLOW_NEWLINES_IN_VALUES: + case PROP_JSON_READ_OPTIONS_ALLOW_NEWLINES_IN_VALUES: priv->parse_options.newlines_in_values = g_value_get_boolean(value); break; - case PROP_JSON_READER_UNEXPECTED_FIELD_BEHAVIOR: + case PROP_JSON_READ_OPTIONS_UNEXPECTED_FIELD_BEHAVIOR: priv->parse_options.unexpected_field_behavior = static_cast(g_value_get_enum(value)); break; - case PROP_JSON_READER_SCHEMA: + case PROP_JSON_READ_OPTIONS_SCHEMA: { auto schema = g_value_dup_object(value); if (priv->schema) { @@ -1747,19 +1749,19 @@ garrow_json_read_options_get_property(GObject *object, auto priv = GARROW_JSON_READ_OPTIONS_GET_PRIVATE(object); switch (prop_id) { - case PROP_JSON_READER_USE_THREADS: + case PROP_JSON_READ_OPTIONS_USE_THREADS: g_value_set_boolean(value, priv->read_options.use_threads); break; - case PROP_JSON_READER_BLOCK_SIZE: + case PROP_JSON_READ_OPTIONS_BLOCK_SIZE: g_value_set_int(value, priv->read_options.block_size); break; - case PROP_JSON_READER_ALLOW_NEWLINES_IN_VALUES: + case PROP_JSON_READ_OPTIONS_ALLOW_NEWLINES_IN_VALUES: g_value_set_boolean(value, priv->parse_options.newlines_in_values); break; - case PROP_JSON_READER_UNEXPECTED_FIELD_BEHAVIOR: + case PROP_JSON_READ_OPTIONS_UNEXPECTED_FIELD_BEHAVIOR: g_value_set_enum(value, static_cast(priv->parse_options.unexpected_field_behavior)); break; - case PROP_JSON_READER_SCHEMA: + case PROP_JSON_READ_OPTIONS_SCHEMA: g_value_set_object(value, priv->schema); break; default: @@ -1802,7 +1804,7 @@ garrow_json_read_options_class_init(GArrowJSONReadOptionsClass *klass) read_options.use_threads, static_cast(G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, - PROP_JSON_READER_USE_THREADS, + PROP_JSON_READ_OPTIONS_USE_THREADS, spec); /** @@ -1823,7 +1825,7 @@ garrow_json_read_options_class_init(GArrowJSONReadOptionsClass *klass) read_options.block_size, static_cast(G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, - PROP_JSON_READER_BLOCK_SIZE, + PROP_JSON_READ_OPTIONS_BLOCK_SIZE, spec); @@ -1845,7 +1847,7 @@ garrow_json_read_options_class_init(GArrowJSONReadOptionsClass *klass) parse_options.newlines_in_values, static_cast(G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, - PROP_JSON_READER_ALLOW_NEWLINES_IN_VALUES, + PROP_JSON_READ_OPTIONS_ALLOW_NEWLINES_IN_VALUES, spec); /** @@ -1862,7 +1864,7 @@ garrow_json_read_options_class_init(GArrowJSONReadOptionsClass *klass) GARROW_JSON_READ_INFER_TYPE, static_cast(G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, - PROP_JSON_READER_UNEXPECTED_FIELD_BEHAVIOR, + PROP_JSON_READ_OPTIONS_UNEXPECTED_FIELD_BEHAVIOR, spec); /** @@ -1878,7 +1880,7 @@ garrow_json_read_options_class_init(GArrowJSONReadOptionsClass *klass) GARROW_TYPE_SCHEMA, static_cast(G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, - PROP_JSON_READER_SCHEMA, + PROP_JSON_READ_OPTIONS_SCHEMA, spec); } @@ -1899,10 +1901,12 @@ garrow_json_read_options_new(void) typedef struct GArrowJSONReaderPrivate_ { std::shared_ptr reader; + GArrowInputStream *input; } GArrowJSONReaderPrivate; enum { - PROP_JSON_TABLE_READER = 1 + PROP_JSON_TABLE_READER = 1, + PROP_JSON_READER_INPUT, }; G_DEFINE_TYPE_WITH_PRIVATE(GArrowJSONReader, @@ -1919,11 +1923,24 @@ garrow_json_reader_dispose(GObject *object) { auto priv = GARROW_JSON_READER_GET_PRIVATE(object); - priv->reader = nullptr; + if (priv->input) { + g_object_unref(priv->input); + priv->input = nullptr; + } G_OBJECT_CLASS(garrow_json_reader_parent_class)->dispose(object); } +static void +garrow_json_reader_finalize(GObject *object) +{ + auto priv = GARROW_JSON_READER_GET_PRIVATE(object); + + priv->reader.~shared_ptr(); + + G_OBJECT_CLASS(garrow_json_reader_parent_class)->finalize(object); +} + static void garrow_json_reader_set_property(GObject *object, guint prop_id, @@ -1937,6 +1954,9 @@ garrow_json_reader_set_property(GObject *object, priv->reader = *static_cast *>(g_value_get_pointer(value)); break; + case PROP_JSON_READER_INPUT: + priv->input = GARROW_INPUT_STREAM(g_value_dup_object(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -1949,7 +1969,12 @@ garrow_json_reader_get_property(GObject *object, GValue *value, GParamSpec *pspec) { + auto priv = GARROW_JSON_READER_GET_PRIVATE(object); + switch (prop_id) { + case PROP_JSON_READER_INPUT: + g_value_set_object(value, priv->input); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -1959,25 +1984,37 @@ garrow_json_reader_get_property(GObject *object, static void garrow_json_reader_init(GArrowJSONReader *object) { + auto priv = GARROW_JSON_READER_GET_PRIVATE(object); + new(&priv->reader) std::shared_ptr; } static void garrow_json_reader_class_init(GArrowJSONReaderClass *klass) { - GParamSpec *spec; - auto gobject_class = G_OBJECT_CLASS(klass); gobject_class->dispose = garrow_json_reader_dispose; + gobject_class->finalize = garrow_json_reader_finalize; gobject_class->set_property = garrow_json_reader_set_property; gobject_class->get_property = garrow_json_reader_get_property; + GParamSpec *spec; spec = g_param_spec_pointer("json-table-reader", "JSON table reader", "The raw std::shared *", static_cast(G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property(gobject_class, PROP_JSON_TABLE_READER, spec); + + spec = g_param_spec_object("input", + "Input", + "The input stream to be read", + GARROW_TYPE_INPUT_STREAM, + static_cast(G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property(gobject_class, + PROP_JSON_READER_INPUT, + spec); } /** @@ -2013,7 +2050,7 @@ garrow_json_reader_new(GArrowInputStream *input, } if (garrow::check(error, arrow_reader, "[json-reader][new]")) { - return garrow_json_reader_new_raw(&(arrow_reader.ValueOrDie())); + return garrow_json_reader_new_raw(&*arrow_reader, input); } else { return NULL; } @@ -2136,10 +2173,12 @@ garrow_csv_reader_get_raw(GArrowCSVReader *reader) } GArrowJSONReader * -garrow_json_reader_new_raw(std::shared_ptr *arrow_reader) +garrow_json_reader_new_raw(std::shared_ptr *arrow_reader, + GArrowInputStream *input) { auto reader = GARROW_JSON_READER(g_object_new(GARROW_TYPE_JSON_READER, "json-table-reader", arrow_reader, + "input", input, NULL)); return reader; } diff --git a/c_glib/arrow-glib/reader.hpp b/c_glib/arrow-glib/reader.hpp index e4f44a32ca2..c7b2b76f215 100644 --- a/c_glib/arrow-glib/reader.hpp +++ b/c_glib/arrow-glib/reader.hpp @@ -50,6 +50,7 @@ std::shared_ptr garrow_csv_reader_get_raw(GArrowCSVReader *reader); GArrowJSONReader * -garrow_json_reader_new_raw(std::shared_ptr *arrow_reader); +garrow_json_reader_new_raw(std::shared_ptr *arrow_reader, + GArrowInputStream *input); std::shared_ptr garrow_json_reader_get_raw(GArrowJSONReader *reader);