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