Coverage Report

Created: 2026-02-14 06:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tinysparql/src/libtinysparql/tracker-utils.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2010, Nokia <ivan.frade@nokia.com>
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
20
#include "config.h"
21
22
#include "tracker-utils.h"
23
24
#include "tracker-enums.h"
25
26
#include "tracker-gresources.h"
27
#include "tracker-nepomuk-gresources.h"
28
29
#include "core/tracker-uuid.h"
30
31
static const char *extensions[] = {
32
  ".ttl",
33
  ".trig",
34
  ".jsonld",
35
};
36
37
G_STATIC_ASSERT (G_N_ELEMENTS (extensions) == TRACKER_N_RDF_FORMATS);
38
39
/**
40
 * tracker_sparql_escape_string:
41
 * @literal: a string to escape
42
 *
43
 * Escapes @literal so it is suitable for insertion in
44
 * SPARQL queries as string literals.
45
 *
46
 * Manual construction of query strings based user input is best
47
 * avoided at all cost, use of #TrackerSparqlStatement is recommended
48
 * instead.
49
 *
50
 * Returns: (transfer full): the escaped string
51
 **/
52
gchar *
53
tracker_sparql_escape_string (const gchar* literal)
54
0
{
55
0
  GString *str;
56
0
  const gchar *p;
57
58
0
  str = g_string_new (NULL);
59
0
  p = literal;
60
61
0
  while (*p != '\0') {
62
0
    size_t len;
63
64
0
    len = strcspn (p, "\t\n\r\b\f\'\"\\");
65
0
    g_string_append_len (str, p, len);
66
0
    p += len;
67
68
0
    switch (*p) {
69
0
    case '\t':
70
0
      g_string_append (str, "\\t");
71
0
      break;
72
0
    case '\n':
73
0
      g_string_append (str, "\\n");
74
0
      break;
75
0
    case '\r':
76
0
      g_string_append (str, "\\r");
77
0
      break;
78
0
    case '\b':
79
0
      g_string_append (str, "\\b");
80
0
      break;
81
0
    case '\f':
82
0
      g_string_append (str, "\\f");
83
0
      break;
84
0
    case '"':
85
0
      g_string_append (str, "\\\"");
86
0
      break;
87
0
    case '\'':
88
0
      g_string_append (str, "\\'");
89
0
      break;
90
0
    case '\\':
91
0
      g_string_append (str, "\\\\");
92
0
      break;
93
0
    default:
94
0
      continue;
95
0
    }
96
97
0
    p++;
98
0
  }
99
100
0
  return g_string_free (str, FALSE);
101
0
}
102
103
/**
104
 * tracker_sparql_get_uuid_urn:
105
 *
106
 * Creates a fresh UUID-based URN.
107
 *
108
 * Returns: (transfer full): A newly generated UUID URN.
109
 **/
110
gchar *
111
tracker_sparql_get_uuid_urn (void)
112
0
{
113
0
  return tracker_generate_uuid ("urn:uuid");
114
0
}
115
116
/**
117
 * tracker_sparql_get_ontology_nepomuk:
118
 *
119
 * Returns a path to the built-in Nepomuk ontologies.
120
 *
121
 * Returns: (transfer full): a #GFile instance.
122
 */
123
GFile *
124
tracker_sparql_get_ontology_nepomuk (void)
125
0
{
126
0
  tracker_ensure_resources ();
127
128
0
  return g_file_new_for_uri ("resource://org/freedesktop/tracker/nepomuk");
129
0
}
130
131
GBytes *
132
tracker_sparql_make_langstring (const gchar *str,
133
                                const gchar *langtag)
134
128k
{
135
128k
  GString *langstr;
136
128k
  GBytes *bytes;
137
128k
  gsize len;
138
139
128k
  langstr = g_string_new (str);
140
141
128k
  if (langtag) {
142
128k
    g_string_append_c (langstr, '\0');
143
128k
    g_string_append_printf (langstr, "%s", langtag);
144
128k
  }
145
146
  /* Account for trailing \0 */
147
128k
  len = langstr->len + 1;
148
128k
  bytes = g_bytes_new_take (g_string_free (langstr, FALSE), len);
149
150
128k
  return bytes;
151
128k
}
152
153
gboolean
154
tracker_rdf_format_pick_for_file (GFile            *file,
155
                                  TrackerRdfFormat *format_out)
156
97.5k
{
157
97.5k
  TrackerRdfFormat format;
158
97.5k
  gchar *uri;
159
160
97.5k
  uri = g_file_get_uri (file);
161
162
97.5k
  if (g_str_has_suffix (uri, extensions[TRACKER_RDF_FORMAT_TRIG])) {
163
0
    format = TRACKER_RDF_FORMAT_TRIG;
164
97.5k
  } else if (g_str_has_suffix (uri, extensions[TRACKER_RDF_FORMAT_JSON_LD])) {
165
0
    format = TRACKER_RDF_FORMAT_JSON_LD;
166
97.5k
  } else if (g_str_has_suffix (uri, extensions[TRACKER_RDF_FORMAT_TURTLE])) {
167
0
    format = TRACKER_RDF_FORMAT_TURTLE;
168
97.5k
  } else {
169
97.5k
    g_free (uri);
170
97.5k
    return FALSE;
171
97.5k
  }
172
173
0
  if (format_out)
174
0
    *format_out = format;
175
176
0
  g_free (uri);
177
0
  return TRUE;
178
97.5k
}
179
180
static gpointer
181
register_resources (gpointer data)
182
5
{
183
5
  builtin_ontology_register_resource ();
184
5
  nepomuk_ontology_register_resource ();
185
5
  return NULL;
186
5
}
187
188
void
189
tracker_ensure_resources (void)
190
5
{
191
5
  static GOnce register_resources_once = G_ONCE_INIT;
192
193
5
  g_once (&register_resources_once, register_resources, NULL);
194
5
}