Coverage Report

Created: 2025-12-23 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tinysparql/src/libtinysparql/tracker-deserializer.c
Line
Count
Source
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
  PROP_NAME,
37
  N_PROPS
38
};
39
40
static GParamSpec *props[N_PROPS];
41
42
typedef struct _TrackerDeserializerPrivate TrackerDeserializerPrivate;
43
44
struct _TrackerDeserializerPrivate
45
{
46
  GInputStream *stream;
47
  TrackerNamespaceManager *namespaces;
48
  char *name;
49
};
50
51
4
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (TrackerDeserializer, tracker_deserializer,
52
4
                                     TRACKER_TYPE_SPARQL_CURSOR)
53
4
54
4
static void
55
4
tracker_deserializer_finalize (GObject *object)
56
34.3k
{
57
34.3k
  TrackerDeserializer *deserializer = TRACKER_DESERIALIZER (object);
58
34.3k
  TrackerDeserializerPrivate *priv =
59
34.3k
    tracker_deserializer_get_instance_private (deserializer);
60
61
34.3k
  g_clear_object (&priv->stream);
62
34.3k
  g_clear_object (&priv->namespaces);
63
34.3k
  g_clear_pointer (&priv->name, g_free);
64
65
34.3k
  G_OBJECT_CLASS (tracker_deserializer_parent_class)->finalize (object);
66
34.3k
}
67
static void
68
tracker_deserializer_set_property (GObject      *object,
69
                                   guint         prop_id,
70
                                   const GValue *value,
71
                                   GParamSpec   *pspec)
72
84.3k
{
73
84.3k
  TrackerDeserializer *deserializer = TRACKER_DESERIALIZER (object);
74
84.3k
  TrackerDeserializerPrivate *priv =
75
84.3k
    tracker_deserializer_get_instance_private (deserializer);
76
77
84.3k
  switch (prop_id) {
78
34.3k
  case PROP_STREAM:
79
34.3k
    priv->stream = g_value_dup_object (value);
80
34.3k
    break;
81
34.3k
  case PROP_NAMESPACE_MANAGER:
82
34.3k
    priv->namespaces = g_value_dup_object (value);
83
34.3k
    break;
84
15.5k
  case PROP_NAME:
85
15.5k
    g_clear_pointer (&priv->name, g_free);
86
15.5k
    priv->name = g_value_dup_string (value);
87
15.5k
    break;
88
0
  default:
89
0
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
90
0
    break;
91
84.3k
  }
92
84.3k
}
93
94
static gboolean
95
tracker_deserializer_is_bound (TrackerSparqlCursor *cursor,
96
                               gint                 column)
97
2.80M
{
98
2.80M
  return tracker_sparql_cursor_get_string (cursor, column, NULL) != NULL;
99
2.80M
}
100
101
static void
102
tracker_deserializer_close (TrackerSparqlCursor *cursor)
103
24.6k
{
104
24.6k
  TrackerDeserializer *deserializer = TRACKER_DESERIALIZER (cursor);
105
24.6k
  TrackerDeserializerPrivate *priv =
106
24.6k
    tracker_deserializer_get_instance_private (deserializer);
107
108
24.6k
  if (priv->stream)
109
24.6k
    g_input_stream_close (priv->stream, NULL, NULL);
110
24.6k
}
111
112
static void
113
tracker_deserializer_class_init (TrackerDeserializerClass *klass)
114
1
{
115
1
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
116
1
  TrackerSparqlCursorClass *cursor_class = TRACKER_SPARQL_CURSOR_CLASS (klass);
117
118
1
  object_class->finalize = tracker_deserializer_finalize;
119
1
  object_class->set_property = tracker_deserializer_set_property;
120
121
1
  cursor_class->is_bound = tracker_deserializer_is_bound;
122
1
  cursor_class->close = tracker_deserializer_close;
123
124
1
  props[PROP_STREAM] =
125
1
    g_param_spec_object ("stream",
126
1
                         "Stream",
127
1
                         "Stream",
128
1
                         G_TYPE_INPUT_STREAM,
129
1
                         G_PARAM_CONSTRUCT_ONLY |
130
1
                         G_PARAM_STATIC_STRINGS |
131
1
                         G_PARAM_WRITABLE);
132
1
  props[PROP_NAMESPACE_MANAGER] =
133
1
    g_param_spec_object ("namespace-manager",
134
1
                         "Namespace Manager",
135
1
                         "Namespace Manager",
136
1
                         TRACKER_TYPE_NAMESPACE_MANAGER,
137
1
                         G_PARAM_CONSTRUCT_ONLY |
138
1
                         G_PARAM_STATIC_STRINGS |
139
1
                         G_PARAM_WRITABLE);
140
1
  props[PROP_NAME] =
141
1
    g_param_spec_string ("name", NULL, NULL,
142
1
                         NULL,
143
1
                         G_PARAM_STATIC_STRINGS |
144
1
                         G_PARAM_WRITABLE);
145
146
1
  g_object_class_install_properties (object_class, N_PROPS, props);
147
1
}
148
149
static void
150
tracker_deserializer_init (TrackerDeserializer *deserializer)
151
34.3k
{
152
34.3k
}
153
154
TrackerSparqlCursor *
155
tracker_deserializer_new (GInputStream            *stream,
156
                          TrackerNamespaceManager *namespaces,
157
                          TrackerSerializerFormat  format)
158
24.6k
{
159
24.6k
  g_return_val_if_fail (G_IS_INPUT_STREAM (stream), NULL);
160
161
24.6k
  switch (format) {
162
0
  case TRACKER_SERIALIZER_FORMAT_JSON:
163
0
    return tracker_deserializer_json_new (stream, namespaces);
164
0
  case TRACKER_SERIALIZER_FORMAT_XML:
165
0
    return tracker_deserializer_xml_new (stream, namespaces);
166
24.6k
  case TRACKER_SERIALIZER_FORMAT_TTL:
167
24.6k
    return tracker_deserializer_turtle_new (stream, namespaces);
168
0
  case TRACKER_SERIALIZER_FORMAT_TRIG:
169
0
    return tracker_deserializer_trig_new (stream, namespaces);
170
0
  case TRACKER_SERIALIZER_FORMAT_JSON_LD:
171
0
    return tracker_deserializer_json_ld_new (stream, namespaces);
172
0
  default:
173
0
    g_warn_if_reached ();
174
0
    return NULL;
175
24.6k
  }
176
24.6k
}
177
178
static TrackerSerializerFormat
179
pick_format_for_file (GFile *file)
180
15.5k
{
181
15.5k
  TrackerSerializerFormat format = TRACKER_SERIALIZER_FORMAT_TTL;
182
15.5k
  TrackerRdfFormat rdf_format = 0;
183
184
15.5k
  if (!tracker_rdf_format_pick_for_file (file, &rdf_format))
185
15.5k
    return format;
186
187
0
  switch (rdf_format) {
188
0
  case TRACKER_RDF_FORMAT_TURTLE:
189
0
    format = TRACKER_SERIALIZER_FORMAT_TTL;
190
0
    break;
191
0
  case TRACKER_RDF_FORMAT_TRIG:
192
0
    format = TRACKER_SERIALIZER_FORMAT_TRIG;
193
0
    break;
194
0
  case TRACKER_RDF_FORMAT_JSON_LD:
195
0
    format = TRACKER_SERIALIZER_FORMAT_JSON_LD;
196
0
    break;
197
0
  default:
198
0
    g_assert_not_reached ();
199
0
    break;
200
0
  }
201
202
0
  return format;
203
0
}
204
205
TrackerSparqlCursor *
206
tracker_deserializer_new_for_file (GFile                    *file,
207
                                   TrackerNamespaceManager  *namespaces,
208
                                   GError                  **error)
209
15.5k
{
210
15.5k
  TrackerSparqlCursor *deserializer;
211
15.5k
  GInputStream *istream;
212
15.5k
  TrackerSerializerFormat format;
213
15.5k
  char *name;
214
215
15.5k
  g_return_val_if_fail (G_IS_FILE (file), NULL);
216
15.5k
  g_return_val_if_fail (!error || !*error, NULL);
217
218
15.5k
  istream = G_INPUT_STREAM (g_file_read (file, NULL, error));
219
15.5k
  if (!istream)
220
0
    return NULL;
221
222
15.5k
  format = pick_format_for_file (file);
223
15.5k
  deserializer = tracker_deserializer_new (istream, namespaces, format);
224
15.5k
  g_object_unref (istream);
225
226
15.5k
  name = g_file_get_uri (file);
227
15.5k
  g_object_set (deserializer, "name", name, NULL);
228
15.5k
  g_free (name);
229
230
15.5k
  return TRACKER_SPARQL_CURSOR (deserializer);
231
15.5k
}
232
233
gboolean
234
tracker_deserializer_get_parser_location (TrackerDeserializer  *deserializer,
235
                                          const char          **name,
236
                                          goffset              *line_no,
237
                                          goffset              *column_no)
238
1.81M
{
239
1.81M
  gboolean retval;
240
241
1.81M
  retval = TRACKER_DESERIALIZER_GET_CLASS (deserializer)->get_parser_location (deserializer,
242
1.81M
                                                                               name,
243
1.81M
                                                                               line_no,
244
1.81M
                                                                               column_no);
245
1.81M
  if (name && !*name)
246
6.56k
    *name = "<stream>";
247
248
1.81M
  return retval;
249
1.81M
}
250
251
GInputStream *
252
tracker_deserializer_get_stream (TrackerDeserializer *deserializer)
253
24.6k
{
254
24.6k
  TrackerDeserializerPrivate *priv =
255
24.6k
    tracker_deserializer_get_instance_private (deserializer);
256
257
24.6k
  return priv->stream;
258
24.6k
}
259
260
TrackerNamespaceManager *
261
tracker_deserializer_get_namespaces (TrackerDeserializer *deserializer)
262
4.36M
{
263
4.36M
  TrackerDeserializerPrivate *priv =
264
4.36M
    tracker_deserializer_get_instance_private (deserializer);
265
266
4.36M
  if (!priv->namespaces)
267
18.5k
    priv->namespaces = tracker_namespace_manager_new ();
268
269
4.36M
  return priv->namespaces;
270
4.36M
}
271
272
const char *
273
tracker_deserializer_get_name (TrackerDeserializer *deserializer)
274
610k
{
275
610k
  TrackerDeserializerPrivate *priv =
276
610k
    tracker_deserializer_get_instance_private (deserializer);
277
278
610k
  return priv->name;
279
610k
}