Coverage Report

Created: 2026-10-17 07:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}