/src/tinysparql/src/libtinysparql/tracker-deserializer-merger.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) 2025, 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-merger.h" |
25 | | |
26 | | typedef struct _TrackerDeserializerMergerPrivate TrackerDeserializerMergerPrivate; |
27 | | struct _TrackerDeserializerMergerPrivate { |
28 | | TrackerDeserializerRdf parent_instance; |
29 | | GList *deserializers; |
30 | | GList *current_deserializer; |
31 | | }; |
32 | | |
33 | 11.9k | G_DEFINE_TYPE_WITH_PRIVATE (TrackerDeserializerMerger, |
34 | 11.9k | tracker_deserializer_merger, |
35 | 11.9k | TRACKER_TYPE_DESERIALIZER_RDF) |
36 | 11.9k | |
37 | 11.9k | static void |
38 | 11.9k | tracker_deserializer_merger_finalize (GObject *object) |
39 | 11.9k | { |
40 | 9.93k | TrackerDeserializerMerger *deserializer = |
41 | 9.93k | TRACKER_DESERIALIZER_MERGER (object); |
42 | 9.93k | TrackerDeserializerMergerPrivate *priv = |
43 | 9.93k | tracker_deserializer_merger_get_instance_private (deserializer); |
44 | | |
45 | 9.93k | g_list_free_full (priv->deserializers, g_object_unref); |
46 | 9.93k | priv->current_deserializer = NULL; |
47 | | |
48 | 9.93k | G_OBJECT_CLASS (tracker_deserializer_merger_parent_class)->finalize (object); |
49 | 9.93k | } |
50 | | |
51 | | static TrackerSparqlValueType |
52 | | tracker_deserializer_merger_get_value_type (TrackerSparqlCursor *cursor, |
53 | | gint column) |
54 | 143k | { |
55 | 143k | TrackerDeserializerMerger *deserializer = |
56 | 143k | TRACKER_DESERIALIZER_MERGER (cursor); |
57 | 143k | TrackerDeserializerMergerPrivate *priv = |
58 | 143k | tracker_deserializer_merger_get_instance_private (deserializer); |
59 | | |
60 | 143k | if (!priv->current_deserializer) |
61 | 0 | return TRACKER_SPARQL_VALUE_TYPE_UNBOUND; |
62 | | |
63 | 143k | return tracker_sparql_cursor_get_value_type (priv->current_deserializer->data, |
64 | 143k | column); |
65 | 143k | } |
66 | | |
67 | | static gboolean |
68 | | tracker_deserializer_merger_next (TrackerSparqlCursor *cursor, |
69 | | GCancellable *cancellable, |
70 | | GError **error) |
71 | 2.48M | { |
72 | 2.48M | TrackerDeserializerMerger *deserializer = |
73 | 2.48M | TRACKER_DESERIALIZER_MERGER (cursor); |
74 | 2.48M | TrackerDeserializerMergerPrivate *priv = |
75 | 2.48M | tracker_deserializer_merger_get_instance_private (deserializer); |
76 | 2.48M | gboolean has_next = FALSE; |
77 | | |
78 | 2.48M | if (!priv->current_deserializer) |
79 | 19.8k | priv->current_deserializer = g_list_last (priv->deserializers); |
80 | | |
81 | 4.97M | while (!has_next && priv->current_deserializer) { |
82 | 2.48M | has_next = tracker_sparql_cursor_next (priv->current_deserializer->data, |
83 | 2.48M | cancellable, error); |
84 | 2.48M | if (!has_next) { |
85 | 23.8k | GList *to_remove; |
86 | | |
87 | 23.8k | to_remove = priv->current_deserializer; |
88 | 23.8k | priv->current_deserializer = priv->current_deserializer->prev; |
89 | 23.8k | priv->deserializers = g_list_remove_link (priv->deserializers, to_remove); |
90 | 23.8k | g_object_unref (to_remove->data); |
91 | 23.8k | g_list_free1 (to_remove); |
92 | 23.8k | } |
93 | 2.48M | } |
94 | | |
95 | 2.48M | return has_next; |
96 | 2.48M | } |
97 | | |
98 | | static const gchar * |
99 | | tracker_deserializer_merger_get_string (TrackerSparqlCursor *cursor, |
100 | | gint column, |
101 | | const gchar **langtag, |
102 | | glong *length) |
103 | 8.16M | { |
104 | 8.16M | TrackerDeserializerMerger *deserializer = |
105 | 8.16M | TRACKER_DESERIALIZER_MERGER (cursor); |
106 | 8.16M | TrackerDeserializerMergerPrivate *priv = |
107 | 8.16M | tracker_deserializer_merger_get_instance_private (deserializer); |
108 | | |
109 | 8.16M | if (!priv->current_deserializer) { |
110 | 0 | if (langtag) |
111 | 0 | *langtag = NULL; |
112 | 0 | if (length) |
113 | 0 | *length = 0; |
114 | |
|
115 | 0 | return NULL; |
116 | 0 | } |
117 | | |
118 | 8.16M | if (langtag) { |
119 | 1.23M | return tracker_sparql_cursor_get_langstring (priv->current_deserializer->data, |
120 | 1.23M | column, langtag, length); |
121 | 6.93M | } else { |
122 | 6.93M | return tracker_sparql_cursor_get_string (priv->current_deserializer->data, |
123 | 6.93M | column, length); |
124 | 6.93M | } |
125 | 8.16M | } |
126 | | |
127 | | void |
128 | | tracker_deserializer_merger_close (TrackerSparqlCursor* cursor) |
129 | 0 | { |
130 | 0 | TrackerDeserializerMerger *deserializer = |
131 | 0 | TRACKER_DESERIALIZER_MERGER (cursor); |
132 | 0 | TrackerDeserializerMergerPrivate *priv = |
133 | 0 | tracker_deserializer_merger_get_instance_private (deserializer); |
134 | |
|
135 | 0 | tracker_sparql_cursor_close (priv->current_deserializer->data); |
136 | 0 | } |
137 | | |
138 | | static gboolean |
139 | | tracker_deserializer_merger_get_parser_location (TrackerDeserializer *deserializer, |
140 | | const char **name, |
141 | | goffset *line_no, |
142 | | goffset *column_no) |
143 | 1.23M | { |
144 | 1.23M | TrackerDeserializerMerger *deserializer_merger = |
145 | 1.23M | TRACKER_DESERIALIZER_MERGER (deserializer); |
146 | 1.23M | TrackerDeserializerMergerPrivate *priv = |
147 | 1.23M | tracker_deserializer_merger_get_instance_private (deserializer_merger); |
148 | | |
149 | 1.23M | if (!priv->current_deserializer) |
150 | 0 | return FALSE; |
151 | | |
152 | 1.23M | return tracker_deserializer_get_parser_location (priv->current_deserializer->data, |
153 | 1.23M | name, line_no, column_no); |
154 | 1.23M | } |
155 | | |
156 | | static void |
157 | | tracker_deserializer_merger_class_init (TrackerDeserializerMergerClass *klass) |
158 | 1 | { |
159 | 1 | GObjectClass *object_class = G_OBJECT_CLASS (klass); |
160 | 1 | TrackerSparqlCursorClass *cursor_class = TRACKER_SPARQL_CURSOR_CLASS (klass); |
161 | 1 | TrackerDeserializerClass *deserializer_class = TRACKER_DESERIALIZER_CLASS (klass); |
162 | | |
163 | 1 | object_class->finalize = tracker_deserializer_merger_finalize; |
164 | | |
165 | 1 | cursor_class->get_value_type = tracker_deserializer_merger_get_value_type; |
166 | 1 | cursor_class->get_string = tracker_deserializer_merger_get_string; |
167 | 1 | cursor_class->next = tracker_deserializer_merger_next; |
168 | 1 | cursor_class->close = tracker_deserializer_merger_close; |
169 | | |
170 | 1 | deserializer_class->get_parser_location = tracker_deserializer_merger_get_parser_location; |
171 | 1 | } |
172 | | |
173 | | static void |
174 | | tracker_deserializer_merger_init (TrackerDeserializerMerger *deserializer) |
175 | 9.93k | { |
176 | 9.93k | } |
177 | | |
178 | | TrackerSparqlCursor * |
179 | | tracker_deserializer_merger_new (void) |
180 | 3.97k | { |
181 | 3.97k | return g_object_new (TRACKER_TYPE_DESERIALIZER_MERGER, NULL); |
182 | 3.97k | } |
183 | | |
184 | | void |
185 | | tracker_deserializer_merger_add_child (TrackerDeserializerMerger *deserializer, |
186 | | TrackerDeserializer *child) |
187 | 23.8k | { |
188 | 23.8k | TrackerDeserializerMergerPrivate *priv = |
189 | 23.8k | tracker_deserializer_merger_get_instance_private (deserializer); |
190 | | |
191 | 23.8k | priv->deserializers = g_list_prepend (priv->deserializers, g_object_ref (child)); |
192 | 23.8k | } |