summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-12-31 17:33:00 +0100
committerCarlos Garnacho <carlosg@gnome.org>2023-01-10 15:51:26 +0100
commit857d8a4711f436fa207ffad638c83c4fcc31d90e (patch)
tree037c609ce40c95a86e913f4e20c7b405d20707c5 /src/libtracker-sparql
parente5c81ca041caed717f982f45a59e43c408bde04a (diff)
downloadtracker-857d8a4711f436fa207ffad638c83c4fcc31d90e.tar.gz
libtracker-sparql: Avoid frequent malloc/free in Trig serializer
The TrackerTriple struct we preserve to compare current/previous value and abbreviate the resulting turtle is created for each row. Store this in the serializer, so we avoid a malloc/free for each row.
Diffstat (limited to 'src/libtracker-sparql')
-rw-r--r--src/libtracker-sparql/tracker-serializer-trig.c54
1 files changed, 24 insertions, 30 deletions
diff --git a/src/libtracker-sparql/tracker-serializer-trig.c b/src/libtracker-sparql/tracker-serializer-trig.c
index 0ed05a98a..2af6d557f 100644
--- a/src/libtracker-sparql/tracker-serializer-trig.c
+++ b/src/libtracker-sparql/tracker-serializer-trig.c
@@ -42,7 +42,7 @@ struct _TrackerQuad
struct _TrackerSerializerTrig
{
TrackerSerializer parent_instance;
- TrackerQuad *last_quad;
+ TrackerQuad last_quad;
GString *data;
guint stream_closed : 1;
guint cursor_started : 1;
@@ -63,15 +63,10 @@ typedef enum
TRACKER_QUAD_BREAK_OBJECT,
} TrackerQuadBreak;
-static TrackerQuad *
-tracker_quad_new_from_cursor (TrackerSparqlCursor *cursor)
+static void
+tracker_quad_init_from_cursor (TrackerQuad *quad,
+ TrackerSparqlCursor *cursor)
{
- TrackerQuad *quad;
-
- if (tracker_sparql_cursor_get_n_columns (cursor) < 3)
- return NULL;
-
- quad = g_new0 (TrackerQuad, 1);
quad->subject_type = tracker_sparql_cursor_get_value_type (cursor, 0);
quad->object_type = tracker_sparql_cursor_get_value_type (cursor, 2);
quad->subject = g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL));
@@ -80,6 +75,8 @@ tracker_quad_new_from_cursor (TrackerSparqlCursor *cursor)
if (tracker_sparql_cursor_get_n_columns (cursor) >= 4)
quad->graph = g_strdup (tracker_sparql_cursor_get_string (cursor, 3, NULL));
+ else
+ quad->graph = NULL;
if (quad->subject_type == TRACKER_SPARQL_VALUE_TYPE_STRING) {
if (g_str_has_prefix (quad->subject, "urn:bnode:")) {
@@ -94,25 +91,22 @@ tracker_quad_new_from_cursor (TrackerSparqlCursor *cursor)
quad->object_type = TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE;
}
}
-
- return quad;
}
static void
-tracker_quad_free (TrackerQuad *quad)
+tracker_quad_clear (TrackerQuad *quad)
{
- g_free (quad->subject);
- g_free (quad->predicate);
- g_free (quad->object);
- g_free (quad->graph);
- g_free (quad);
+ g_clear_pointer (&quad->subject, g_free);
+ g_clear_pointer (&quad->predicate, g_free);
+ g_clear_pointer (&quad->object, g_free);
+ g_clear_pointer (&quad->graph, g_free);
}
static TrackerQuadBreak
tracker_quad_get_break (TrackerQuad *last,
TrackerQuad *cur)
{
- if (!last)
+ if (!last->subject)
return TRACKER_QUAD_BREAK_NONE;
if (g_strcmp0 (last->graph, cur->graph) != 0)
@@ -201,7 +195,7 @@ serialize_up_to_size (TrackerSerializerTrig *serializer_trig,
TrackerSparqlCursor *cursor;
TrackerNamespaceManager *namespaces;
GError *inner_error = NULL;
- TrackerQuad *cur;
+ TrackerQuad cur;
if (!serializer_trig->data)
serializer_trig->data = g_string_new (NULL);
@@ -236,9 +230,9 @@ serialize_up_to_size (TrackerSerializerTrig *serializer_trig,
serializer_trig->cursor_started = TRUE;
}
- cur = tracker_quad_new_from_cursor (cursor);
+ tracker_quad_init_from_cursor (&cur, cursor);
- if (!cur) {
+ if (!cur.subject && cur.predicate && cur.object) {
g_set_error (error,
TRACKER_SPARQL_ERROR,
TRACKER_SPARQL_ERROR_INTERNAL,
@@ -246,15 +240,15 @@ serialize_up_to_size (TrackerSerializerTrig *serializer_trig,
return FALSE;
}
- br = tracker_quad_get_break (serializer_trig->last_quad, cur);
+ br = tracker_quad_get_break (&serializer_trig->last_quad, &cur);
if (br <= TRACKER_QUAD_BREAK_GRAPH) {
if (br == TRACKER_QUAD_BREAK_GRAPH)
g_string_append (serializer_trig->data, " .\n}\n\n");
- if (cur->graph) {
+ if (cur.graph) {
g_string_append (serializer_trig->data, "GRAPH ");
- print_value (serializer_trig->data, cur->graph,
+ print_value (serializer_trig->data, cur.graph,
TRACKER_SPARQL_VALUE_TYPE_URI, namespaces);
g_string_append_c (serializer_trig->data, ' ');
}
@@ -265,7 +259,7 @@ serialize_up_to_size (TrackerSerializerTrig *serializer_trig,
if (br <= TRACKER_QUAD_BREAK_SUBJECT) {
if (br == TRACKER_QUAD_BREAK_SUBJECT)
g_string_append (serializer_trig->data, " .\n\n ");
- print_value (serializer_trig->data, cur->subject, cur->subject_type, namespaces);
+ print_value (serializer_trig->data, cur.subject, cur.subject_type, namespaces);
}
if (br <= TRACKER_QUAD_BREAK_PREDICATE) {
@@ -274,7 +268,7 @@ serialize_up_to_size (TrackerSerializerTrig *serializer_trig,
else
g_string_append_c (serializer_trig->data, ' ');
- print_value (serializer_trig->data, cur->predicate,
+ print_value (serializer_trig->data, cur.predicate,
TRACKER_SPARQL_VALUE_TYPE_URI, namespaces);
}
@@ -283,12 +277,12 @@ serialize_up_to_size (TrackerSerializerTrig *serializer_trig,
g_string_append (serializer_trig->data, ",");
g_string_append_c (serializer_trig->data, ' ');
- print_value (serializer_trig->data, cur->object, cur->object_type, namespaces);
+ print_value (serializer_trig->data, cur.object, cur.object_type, namespaces);
}
serializer_trig->has_quads = TRUE;
- g_clear_pointer (&serializer_trig->last_quad, tracker_quad_free);
- serializer_trig->last_quad = cur;
+ tracker_quad_clear (&serializer_trig->last_quad);
+ memcpy (&serializer_trig->last_quad, &cur, sizeof (TrackerQuad));
}
/* Close the last quad */
@@ -337,7 +331,7 @@ tracker_serializer_trig_close (GInputStream *istream,
{
TrackerSerializerTrig *serializer_trig = TRACKER_SERIALIZER_TRIG (istream);
- g_clear_pointer (&serializer_trig->last_quad, tracker_quad_free);
+ tracker_quad_clear (&serializer_trig->last_quad);
if (serializer_trig->data) {
g_string_free (serializer_trig->data, TRUE);