diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-12-31 17:33:00 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2023-01-10 15:51:26 +0100 |
commit | 857d8a4711f436fa207ffad638c83c4fcc31d90e (patch) | |
tree | 037c609ce40c95a86e913f4e20c7b405d20707c5 /src/libtracker-sparql | |
parent | e5c81ca041caed717f982f45a59e43c408bde04a (diff) | |
download | tracker-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.c | 54 |
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); |