Coverage Report

Created: 2025-07-12 06:31

/src/tinysparql/src/libtinysparql/tracker-deserializer.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (C) 2022, Red Hat, Inc
3
 *
4
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
6
 * License as published by the Free Software Foundation; either
7
 * version 2.1 of the License, or (at your option) any later version.
8
 *
9
 * This library is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
 * Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
15
 * License along with this library; if not, write to the
16
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
 * Boston, MA  02110-1301, USA.
18
 *
19
 * Author: Carlos Garnacho <carlosg@gnome.org>
20
 */
21
22
#include "config.h"
23
24
#include "tracker-deserializer.h"
25
#include "tracker-deserializer-turtle.h"
26
#include "tracker-deserializer-json.h"
27
#include "tracker-deserializer-json-ld.h"
28
#include "tracker-deserializer-xml.h"
29
30
#include "tracker-private.h"
31
32
enum {
33
  PROP_0,
34
  PROP_STREAM,
35
  PROP_NAMESPACE_MANAGER,
36
  N_PROPS
37
};
38
39
static GParamSpec *props[N_PROPS];
40
41
typedef struct _TrackerDeserializerPrivate TrackerDeserializerPrivate;
42
43
struct _TrackerDeserializerPrivate
44
{
45
  GInputStream *stream;
46
  TrackerNamespaceManager *namespaces;
47
};
48
49
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (TrackerDeserializer, tracker_deserializer,
50
                                     TRACKER_TYPE_SPARQL_CURSOR)
51
52
static void
53
tracker_deserializer_finalize (GObject *object)
54
89.1k
{
55
89.1k
  TrackerDeserializer *deserializer = TRACKER_DESERIALIZER (object);
56
89.1k
  TrackerDeserializerPrivate *priv =
57
89.1k
    tracker_deserializer_get_instance_private (deserializer);
58
59
89.1k
  g_clear_object (&priv->stream);
60
89.1k
  g_clear_object (&priv->namespaces);
61
62
89.1k
  G_OBJECT_CLASS (tracker_deserializer_parent_class)->finalize (object);
63
89.1k
}
64
static void
65
tracker_deserializer_set_property (GObject      *object,
66
                                   guint         prop_id,
67
                                   const GValue *value,
68
                                   GParamSpec   *pspec)
69
178k
{
70
178k
  TrackerDeserializer *deserializer = TRACKER_DESERIALIZER (object);
71
178k
  TrackerDeserializerPrivate *priv =
72
178k
    tracker_deserializer_get_instance_private (deserializer);
73
74
178k
  switch (prop_id) {
75
89.1k
  case PROP_STREAM:
76
89.1k
    priv->stream = g_value_dup_object (value);
77
89.1k
    break;
78
89.1k
  case PROP_NAMESPACE_MANAGER:
79
89.1k
    priv->namespaces = g_value_dup_object (value);
80
89.1k
    break;
81
0
  default:
82
0
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
83
0
    break;
84
178k
  }
85
178k
}
86
87
static gboolean
88
tracker_deserializer_is_bound (TrackerSparqlCursor *cursor,
89
                               gint                 column)
90
2.82M
{
91
2.82M
  return tracker_sparql_cursor_get_string (cursor, column, NULL) != NULL;
92
2.82M
}
93
94
static void
95
tracker_deserializer_close (TrackerSparqlCursor *cursor)
96
74.4k
{
97
74.4k
  TrackerDeserializer *deserializer = TRACKER_DESERIALIZER (cursor);
98
74.4k
  TrackerDeserializerPrivate *priv =
99
74.4k
    tracker_deserializer_get_instance_private (deserializer);
100
101
74.4k
  if (priv->stream)
102
74.4k
    g_input_stream_close (priv->stream, NULL, NULL);
103
74.4k
}
104
105
static void
106
tracker_deserializer_class_init (TrackerDeserializerClass *klass)
107
4
{
108
4
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
109
4
  TrackerSparqlCursorClass *cursor_class = TRACKER_SPARQL_CURSOR_CLASS (klass);
110
111
4
  object_class->finalize = tracker_deserializer_finalize;
112
4
  object_class->set_property = tracker_deserializer_set_property;
113
114
4
  cursor_class->is_bound = tracker_deserializer_is_bound;
115
4
  cursor_class->close = tracker_deserializer_close;
116
117
4
  props[PROP_STREAM] =
118
4
    g_param_spec_object ("stream",
119
4
                         "Stream",
120
4
                         "Stream",
121
4
                         G_TYPE_INPUT_STREAM,
122
4
                         G_PARAM_CONSTRUCT_ONLY |
123
4
                         G_PARAM_STATIC_STRINGS |
124
4
                         G_PARAM_WRITABLE);
125
4
  props[PROP_NAMESPACE_MANAGER] =
126
4
    g_param_spec_object ("namespace-manager",
127
4
                         "Namespace Manager",
128
4
                         "Namespace Manager",
129
4
                         TRACKER_TYPE_NAMESPACE_MANAGER,
130
4
                         G_PARAM_CONSTRUCT_ONLY |
131
4
                         G_PARAM_STATIC_STRINGS |
132
4
                         G_PARAM_WRITABLE);
133
134
4
  g_object_class_install_properties (object_class, N_PROPS, props);
135
4
}
136
137
static void
138
tracker_deserializer_init (TrackerDeserializer *deserializer)
139
89.1k
{
140
89.1k
}
141
142
TrackerSparqlCursor *
143
tracker_deserializer_new (GInputStream            *stream,
144
                          TrackerNamespaceManager *namespaces,
145
                          TrackerSerializerFormat  format)
146
89.1k
{
147
89.1k
  g_return_val_if_fail (G_IS_INPUT_STREAM (stream), NULL);
148
149
89.1k
  switch (format) {
150
0
  case TRACKER_SERIALIZER_FORMAT_JSON:
151
0
    return tracker_deserializer_json_new (stream, namespaces);
152
0
  case TRACKER_SERIALIZER_FORMAT_XML:
153
0
    return tracker_deserializer_xml_new (stream, namespaces);
154
57.2k
  case TRACKER_SERIALIZER_FORMAT_TTL:
155
57.2k
    return tracker_deserializer_turtle_new (stream, namespaces);
156
17.2k
  case TRACKER_SERIALIZER_FORMAT_TRIG:
157
17.2k
    return tracker_deserializer_trig_new (stream, namespaces);
158
14.7k
  case TRACKER_SERIALIZER_FORMAT_JSON_LD:
159
14.7k
    return tracker_deserializer_json_ld_new (stream, namespaces);
160
0
  default:
161
0
    g_warn_if_reached ();
162
0
    return NULL;
163
89.1k
  }
164
89.1k
}
165
166
static TrackerSerializerFormat
167
pick_format_for_file (GFile *file)
168
49.2k
{
169
49.2k
  TrackerSerializerFormat format = TRACKER_SERIALIZER_FORMAT_TTL;
170
49.2k
  TrackerRdfFormat rdf_format = 0;
171
172
49.2k
  if (!tracker_rdf_format_pick_for_file (file, &rdf_format))
173
49.2k
    return format;
174
175
0
  switch (rdf_format) {
176
0
  case TRACKER_RDF_FORMAT_TURTLE:
177
0
    format = TRACKER_SERIALIZER_FORMAT_TTL;
178
0
    break;
179
0
  case TRACKER_RDF_FORMAT_TRIG:
180
0
    format = TRACKER_SERIALIZER_FORMAT_TRIG;
181
0
    break;
182
0
  case TRACKER_RDF_FORMAT_JSON_LD:
183
0
    format = TRACKER_SERIALIZER_FORMAT_JSON_LD;
184
0
    break;
185
0
  default:
186
0
    g_assert_not_reached ();
187
0
    break;
188
0
  }
189
190
0
  return format;
191
0
}
192
193
TrackerSparqlCursor *
194
tracker_deserializer_new_for_file (GFile                    *file,
195
                                   TrackerNamespaceManager  *namespaces,
196
                                   GError                  **error)
197
49.2k
{
198
49.2k
  TrackerSparqlCursor *deserializer;
199
49.2k
  GInputStream *istream;
200
49.2k
  TrackerSerializerFormat format;
201
202
49.2k
  g_return_val_if_fail (G_IS_FILE (file), NULL);
203
49.2k
  g_return_val_if_fail (!error || !*error, NULL);
204
205
49.2k
  istream = G_INPUT_STREAM (g_file_read (file, NULL, error));
206
49.2k
  if (!istream)
207
0
    return NULL;
208
209
49.2k
  format = pick_format_for_file (file);
210
49.2k
  deserializer = tracker_deserializer_new (istream, namespaces, format);
211
49.2k
  g_object_unref (istream);
212
213
49.2k
  return TRACKER_SPARQL_CURSOR (deserializer);
214
49.2k
}
215
216
gboolean
217
tracker_deserializer_get_parser_location (TrackerDeserializer *deserializer,
218
                                          goffset             *line_no,
219
                                          goffset             *column_no)
220
1.93M
{
221
1.93M
  return TRACKER_DESERIALIZER_GET_CLASS (deserializer)->get_parser_location (deserializer,
222
1.93M
                                                                             line_no,
223
1.93M
                                                                             column_no);
224
1.93M
}
225
226
GInputStream *
227
tracker_deserializer_get_stream (TrackerDeserializer *deserializer)
228
89.1k
{
229
89.1k
  TrackerDeserializerPrivate *priv =
230
89.1k
    tracker_deserializer_get_instance_private (deserializer);
231
232
89.1k
  return priv->stream;
233
89.1k
}
234
235
TrackerNamespaceManager *
236
tracker_deserializer_get_namespaces (TrackerDeserializer *deserializer)
237
12.4M
{
238
12.4M
  TrackerDeserializerPrivate *priv =
239
12.4M
    tracker_deserializer_get_instance_private (deserializer);
240
241
12.4M
  if (!priv->namespaces)
242
66.6k
    priv->namespaces = tracker_namespace_manager_new ();
243
244
12.4M
  return priv->namespaces;
245
12.4M
}