/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 | } |