Coverage Report

Created: 2025-11-02 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tinysparql/src/libtinysparql/tracker-statement.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2018, Red Hat Ltd.
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
 * TrackerSparqlStatement:
21
 *
22
 * `TrackerSparqlStatement` represents a prepared statement for a SPARQL query.
23
 *
24
 * The SPARQL query will be internally compiled into the format that is most
25
 * optimal to execute the query many times. For connections created
26
 * through [ctor@SparqlConnection.new] that will be a
27
 * SQLite compiled statement.
28
 *
29
 * The SPARQL query may contain parameterized variables expressed via the
30
 * `~` prefix in the SPARQL syntax (e.g. `~var`), these may happen anywhere
31
 * in the SPARQL where a literal or variable would typically happen. These
32
 * parameterized variables may be mapped to arbitrary values prior to
33
 * execution. The `TrackerSparqlStatement` may be reused for future
34
 * queries with different values.
35
 *
36
 * The argument bindings may be changed through the [method@SparqlStatement.bind_int],
37
 * [method@SparqlStatement.bind_int], etc... family of functions. Those functions
38
 * receive a @name argument corresponding for the variable name in the SPARQL query
39
 * (eg. `"var"` for `~var`) and a value to map the variable to.
40
 *
41
 * Once all arguments have a value, the query may be executed through
42
 * [method@SparqlStatement.execute_async] or [method@SparqlStatement.execute].
43
 *
44
 * It is possible to use any `TrackerSparqlStatement` from other threads than
45
 * the one it was created from. However, binding values and executing the
46
 * statement must only happen from one thread at a time. It is possible to reuse
47
 * the `TrackerSparqlStatement` right after [method@SparqlStatement.execute_async]
48
 * was called, there is no need to wait for [method@SparqlStatement.execute_finish].
49
 *
50
 * In some circumstances, it is possible that the query needs to be recompiled
51
 * from the SPARQL source. This will happen transparently.
52
 */
53
#include "config.h"
54
55
#include "tracker-statement.h"
56
#include "tracker-private.h"
57
58
enum {
59
  PROP_0,
60
  PROP_CONNECTION,
61
  PROP_SPARQL,
62
  N_PROPS
63
};
64
65
static GParamSpec *props[N_PROPS];
66
67
typedef struct {
68
  TrackerSparqlConnection *connection;
69
  gchar *sparql;
70
} TrackerSparqlStatementPrivate;
71
72
0
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (TrackerSparqlStatement,
73
0
                                     tracker_sparql_statement,
74
0
                                     G_TYPE_OBJECT)
75
0
76
0
static void
77
0
tracker_sparql_statement_init (TrackerSparqlStatement *stmt)
78
0
{
79
0
}
80
81
static void
82
tracker_sparql_statement_finalize (GObject *object)
83
0
{
84
0
  TrackerSparqlStatement *stmt = TRACKER_SPARQL_STATEMENT (object);
85
0
  TrackerSparqlStatementPrivate *priv = tracker_sparql_statement_get_instance_private (stmt);
86
87
0
  g_clear_object (&priv->connection);
88
0
  g_free (priv->sparql);
89
0
  G_OBJECT_CLASS (tracker_sparql_statement_parent_class)->finalize (object);
90
0
}
91
92
static void
93
tracker_sparql_statement_set_property (GObject      *object,
94
                                       guint         prop_id,
95
                                       const GValue *value,
96
                                       GParamSpec   *pspec)
97
0
{
98
0
  TrackerSparqlStatement *stmt = TRACKER_SPARQL_STATEMENT (object);
99
0
  TrackerSparqlStatementPrivate *priv = tracker_sparql_statement_get_instance_private (stmt);
100
101
0
  switch (prop_id) {
102
0
  case PROP_CONNECTION:
103
0
    priv->connection = g_value_dup_object (value);
104
0
    break;
105
0
  case PROP_SPARQL:
106
0
    priv->sparql = g_value_dup_string (value);
107
0
    break;
108
0
  default:
109
0
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
110
0
  }
111
0
}
112
113
static void
114
tracker_sparql_statement_get_property (GObject    *object,
115
                                       guint       prop_id,
116
                                       GValue     *value,
117
                                       GParamSpec *pspec)
118
0
{
119
0
  TrackerSparqlStatement *stmt = TRACKER_SPARQL_STATEMENT (object);
120
0
  TrackerSparqlStatementPrivate *priv = tracker_sparql_statement_get_instance_private (stmt);
121
122
0
  switch (prop_id) {
123
0
  case PROP_CONNECTION:
124
0
    g_value_set_object (value, priv->connection);
125
0
    break;
126
0
  case PROP_SPARQL:
127
0
    g_value_set_string (value, priv->sparql);
128
0
    break;
129
0
  default:
130
0
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
131
0
  }
132
0
}
133
134
static void
135
tracker_sparql_statement_class_init (TrackerSparqlStatementClass *klass)
136
0
{
137
0
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
138
139
0
  object_class->finalize = tracker_sparql_statement_finalize;
140
0
  object_class->set_property = tracker_sparql_statement_set_property;
141
0
  object_class->get_property = tracker_sparql_statement_get_property;
142
143
  /**
144
   * TrackerSparqlStatement:connection:
145
   *
146
   * The [class@SparqlConnection] the statement was created for.
147
   */
148
0
  props[PROP_CONNECTION] =
149
0
    g_param_spec_object ("connection",
150
0
                         "connection",
151
0
                         "connection",
152
0
                         TRACKER_TYPE_SPARQL_CONNECTION,
153
0
             G_PARAM_CONSTRUCT_ONLY |
154
0
                         G_PARAM_STATIC_STRINGS |
155
0
                         G_PARAM_READABLE |
156
0
                         G_PARAM_WRITABLE);
157
  /**
158
   * TrackerSparqlStatement:sparql:
159
   *
160
   * SPARQL query stored in this statement.
161
   */
162
0
  props[PROP_SPARQL] =
163
0
    g_param_spec_string ("sparql",
164
0
                         "sparql",
165
0
                         "sparql",
166
0
                         NULL,
167
0
             G_PARAM_CONSTRUCT_ONLY |
168
0
                         G_PARAM_STATIC_STRINGS |
169
0
                         G_PARAM_READABLE |
170
0
             G_PARAM_WRITABLE);
171
172
0
  g_object_class_install_properties (object_class, N_PROPS, props);
173
0
}
174
175
/**
176
 * tracker_sparql_statement_get_connection:
177
 * @stmt: a `TrackerSparqlStatement`
178
 *
179
 * Returns the [class@SparqlConnection] that this statement was created for.
180
 *
181
 * Returns: (transfer none): The SPARQL connection of this statement.
182
 **/
183
TrackerSparqlConnection *
184
tracker_sparql_statement_get_connection (TrackerSparqlStatement *stmt)
185
0
{
186
0
  TrackerSparqlStatementPrivate *priv = tracker_sparql_statement_get_instance_private (stmt);
187
188
0
  g_return_val_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt), NULL);
189
190
0
  return priv->connection;
191
0
}
192
193
/**
194
 * tracker_sparql_statement_get_sparql:
195
 * @stmt: a `TrackerSparqlStatement`
196
 *
197
 * Returns the SPARQL string that this prepared statement holds.
198
 *
199
 * Returns: The contained SPARQL query
200
 **/
201
const gchar *
202
tracker_sparql_statement_get_sparql (TrackerSparqlStatement *stmt)
203
0
{
204
0
  TrackerSparqlStatementPrivate *priv = tracker_sparql_statement_get_instance_private (stmt);
205
206
0
  g_return_val_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt), NULL);
207
208
0
  return priv->sparql;
209
0
}
210
211
/**
212
 * tracker_sparql_statement_bind_boolean:
213
 * @stmt: a `TrackerSparqlStatement`
214
 * @name: variable name
215
 * @value: value
216
 *
217
 * Binds the boolean @value to the parameterized variable given by @name.
218
 */
219
void
220
tracker_sparql_statement_bind_boolean (TrackerSparqlStatement *stmt,
221
                                       const gchar            *name,
222
                                       gboolean                value)
223
0
{
224
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
225
0
  g_return_if_fail (name != NULL);
226
227
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->bind_boolean (stmt,
228
0
                                                           name,
229
0
                                                           value);
230
0
}
231
232
/**
233
 * tracker_sparql_statement_bind_int:
234
 * @stmt: a `TrackerSparqlStatement`
235
 * @name: variable name
236
 * @value: value
237
 *
238
 * Binds the integer @value to the parameterized variable given by @name.
239
 */
240
void
241
tracker_sparql_statement_bind_int (TrackerSparqlStatement *stmt,
242
                                   const gchar            *name,
243
                                   gint64                  value)
244
0
{
245
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
246
0
  g_return_if_fail (name != NULL);
247
248
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->bind_int (stmt,
249
0
                                                       name,
250
0
                                                       value);
251
0
}
252
253
/**
254
 * tracker_sparql_statement_bind_double:
255
 * @stmt: a `TrackerSparqlStatement`
256
 * @name: variable name
257
 * @value: value
258
 *
259
 * Binds the double @value to the parameterized variable given by @name.
260
 */
261
void
262
tracker_sparql_statement_bind_double (TrackerSparqlStatement *stmt,
263
                                      const gchar            *name,
264
                                      gdouble                 value)
265
0
{
266
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
267
0
  g_return_if_fail (name != NULL);
268
269
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->bind_double (stmt,
270
0
                                                          name,
271
0
                                                          value);
272
0
}
273
274
/**
275
 * tracker_sparql_statement_bind_string:
276
 * @stmt: a `TrackerSparqlStatement`
277
 * @name: variable name
278
 * @value: value
279
 *
280
 * Binds the string @value to the parameterized variable given by @name.
281
 */
282
void
283
tracker_sparql_statement_bind_string (TrackerSparqlStatement *stmt,
284
                                      const gchar            *name,
285
                                      const gchar            *value)
286
0
{
287
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
288
0
  g_return_if_fail (name != NULL);
289
0
  g_return_if_fail (value != NULL);
290
291
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->bind_string (stmt,
292
0
                                                          name,
293
0
                                                          value);
294
0
}
295
296
/**
297
 * tracker_sparql_statement_bind_datetime:
298
 * @stmt: a `TrackerSparqlStatement`
299
 * @name: variable name
300
 * @value: value
301
 *
302
 * Binds the [type@GLib.DateTime] @value to the parameterized variable given by @name.
303
 *
304
 * Since: 3.2
305
 */
306
307
void
308
tracker_sparql_statement_bind_datetime (TrackerSparqlStatement *stmt,
309
                                        const gchar            *name,
310
                                        GDateTime              *value)
311
0
{
312
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
313
0
  g_return_if_fail (name != NULL);
314
0
  g_return_if_fail (value != NULL);
315
316
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->bind_datetime (stmt,
317
0
                                                            name,
318
0
                                                            value);
319
0
}
320
321
/**
322
 * tracker_sparql_statement_bind_langstring:
323
 * @stmt: a `TrackerSparqlStatement`
324
 * @name: variable name
325
 * @value: value
326
 * @langtag: language tag
327
 *
328
 * Binds the @value to the parameterized variable given by @name, tagged
329
 * with the language defined by @langtag. The language tag should follow
330
 * [RFC 5646](https://www.rfc-editor.org/rfc/rfc5646.html). The parameter
331
 * will be represented as a [`rdf:langString`](rdf-ontology.html#rdf:langString).
332
 *
333
 * Since: 3.7
334
 **/
335
void
336
tracker_sparql_statement_bind_langstring (TrackerSparqlStatement *stmt,
337
                                          const gchar            *name,
338
                                          const gchar            *value,
339
                                          const gchar            *langtag)
340
0
{
341
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
342
0
  g_return_if_fail (name != NULL);
343
0
  g_return_if_fail (value != NULL);
344
0
  g_return_if_fail (langtag != NULL);
345
346
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->bind_langstring (stmt,
347
0
                                                              name,
348
0
                                                              value,
349
0
                                                              langtag);
350
0
}
351
352
/**
353
 * tracker_sparql_statement_execute:
354
 * @stmt: a `TrackerSparqlStatement`
355
 * @cancellable: (nullable): Optional [type@Gio.Cancellable]
356
 * @error: Error location
357
 *
358
 * Executes the `SELECT` or `ASK` SPARQL query with the currently bound values.
359
 *
360
 * This function also works for `DESCRIBE` and `CONSTRUCT` queries that
361
 * retrieve data from the triple store. These query forms that return
362
 * RDF data are however more useful together with [method@SparqlStatement.serialize_async].
363
 *
364
 * This function should only be called on `TrackerSparqlStatement` objects
365
 * obtained through [method@SparqlConnection.query_statement] or
366
 * SELECT/CONSTRUCT/DESCRIBE statements loaded through
367
 * [method@SparqlConnection.load_statement_from_gresource].
368
 * An error will be raised if this method is called on a `INSERT` or `DELETE`
369
 * SPARQL query.
370
 *
371
 * Returns: (transfer full): A `TrackerSparqlCursor` with the query results.
372
 */
373
TrackerSparqlCursor *
374
tracker_sparql_statement_execute (TrackerSparqlStatement  *stmt,
375
                                  GCancellable            *cancellable,
376
                                  GError                 **error)
377
0
{
378
0
  TrackerSparqlStatementPrivate *priv =
379
0
    tracker_sparql_statement_get_instance_private (stmt);
380
0
  TrackerSparqlCursor *cursor;
381
382
0
  g_return_val_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt), NULL);
383
0
  g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), NULL);
384
0
  g_return_val_if_fail (!error || !*error, NULL);
385
386
0
  if (tracker_sparql_connection_set_error_on_closed (priv->connection, error))
387
0
    return NULL;
388
389
0
  cursor = TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->execute (stmt,
390
0
                                                               cancellable,
391
0
                                                               error);
392
0
  if (cursor)
393
0
    tracker_sparql_cursor_set_connection (cursor, priv->connection);
394
395
0
  return cursor;
396
0
}
397
398
/**
399
 * tracker_sparql_statement_execute_async:
400
 * @stmt: a `TrackerSparqlStatement`
401
 * @cancellable: (nullable): Optional [type@Gio.Cancellable]
402
 * @callback: user-defined [type@Gio.AsyncReadyCallback] to be called when
403
 *            the asynchronous operation is finished.
404
 * @user_data: user-defined data to be passed to @callback
405
 *
406
 * Executes asynchronously the `SELECT` or `ASK` SPARQL query with the currently bound values.
407
 *
408
 * This function also works for `DESCRIBE` and `CONSTRUCT` queries that
409
 * retrieve data from the triple store. These query forms that return
410
 * RDF data are however more useful together with [method@SparqlStatement.serialize_async].
411
 *
412
 * This function should only be called on `TrackerSparqlStatement` objects
413
 * obtained through [method@SparqlConnection.query_statement] or
414
 * SELECT/CONSTRUCT/DESCRIBE statements loaded through
415
 * [method@SparqlConnection.load_statement_from_gresource].
416
 * An error will be raised if this method is called on a `INSERT` or `DELETE`
417
 * SPARQL query.
418
 */
419
void
420
tracker_sparql_statement_execute_async (TrackerSparqlStatement *stmt,
421
                                        GCancellable           *cancellable,
422
                                        GAsyncReadyCallback     callback,
423
                                        gpointer                user_data)
424
0
{
425
0
  TrackerSparqlStatementPrivate *priv =
426
0
    tracker_sparql_statement_get_instance_private (stmt);
427
428
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
429
0
  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
430
431
0
  if (tracker_sparql_connection_report_async_error_on_closed (priv->connection,
432
0
                                                              callback,
433
0
                                                              user_data))
434
0
    return;
435
436
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->execute_async (stmt,
437
0
                                                            cancellable,
438
0
                                                            callback,
439
0
                                                            user_data);
440
0
}
441
442
/**
443
 * tracker_sparql_statement_execute_finish:
444
 * @stmt: a `TrackerSparqlStatement`
445
 * @res: a [type@Gio.AsyncResult] with the result of the operation
446
 * @error: Error location
447
 *
448
 * Finishes the asynchronous operation started through
449
 * [method@SparqlStatement.execute_async].
450
 *
451
 * Returns: (transfer full): A `TrackerSparqlCursor` with the query results.
452
 */
453
TrackerSparqlCursor *
454
tracker_sparql_statement_execute_finish (TrackerSparqlStatement  *stmt,
455
                                         GAsyncResult            *res,
456
                                         GError                 **error)
457
0
{
458
0
  TrackerSparqlStatementPrivate *priv =
459
0
    tracker_sparql_statement_get_instance_private (stmt);
460
0
  TrackerSparqlCursor *cursor;
461
462
0
  g_return_val_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt), NULL);
463
0
  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL);
464
0
  g_return_val_if_fail (!error || !*error, NULL);
465
466
0
  cursor = TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->execute_finish (stmt,
467
0
                                                                      res,
468
0
                                                                      error);
469
0
  if (cursor)
470
0
    tracker_sparql_cursor_set_connection (cursor, priv->connection);
471
472
0
  return cursor;
473
0
}
474
475
/**
476
 * tracker_sparql_statement_update:
477
 * @stmt: a `TrackerSparqlStatement`
478
 * @cancellable: (nullable): Optional [type@Gio.Cancellable]
479
 * @error: Error location
480
 *
481
 * Executes the `INSERT`/`DELETE` SPARQL query series with the currently bound values.
482
 *
483
 * This function should only be called on `TrackerSparqlStatement` objects
484
 * obtained through [method@SparqlConnection.update_statement] or
485
 * `INSERT`/`DELETE` statements loaded through
486
 * [method@SparqlConnection.load_statement_from_gresource].
487
 * An error will be raised if this method is called on
488
 * `SELECT`/`ASK`/`DESCRIBE`/`CONSTRUCT` SPARQL queries.
489
 *
490
 * Returns: %TRUE if the update finished with no errors, %FALSE otherwise
491
 *
492
 * Since: 3.5
493
 */
494
gboolean
495
tracker_sparql_statement_update (TrackerSparqlStatement  *stmt,
496
                                 GCancellable            *cancellable,
497
                                 GError                 **error)
498
0
{
499
0
  TrackerSparqlStatementPrivate *priv =
500
0
    tracker_sparql_statement_get_instance_private (stmt);
501
502
0
  g_return_val_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt), FALSE);
503
0
  g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);
504
0
  g_return_val_if_fail (!error || !*error, FALSE);
505
506
0
  if (tracker_sparql_connection_set_error_on_closed (priv->connection, error))
507
0
    return FALSE;
508
509
0
  return TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->update (stmt,
510
0
                                                            cancellable,
511
0
                                                            error);
512
0
}
513
514
/**
515
 * tracker_sparql_statement_update_async:
516
 * @stmt: a `TrackerSparqlStatement`
517
 * @cancellable: (nullable): Optional [type@Gio.Cancellable]
518
 * @callback: user-defined [type@Gio.AsyncReadyCallback] to be called when
519
 *            the asynchronous operation is finished.
520
 * @user_data: user-defined data to be passed to @callback
521
 *
522
 * Executes asynchronously the `INSERT`/`DELETE` SPARQL query series with the currently bound values.
523
 *
524
 * This function should only be called on `TrackerSparqlStatement` objects
525
 * obtained through [method@SparqlConnection.update_statement] or
526
 * `INSERT`/`DELETE` statements loaded through
527
 * [method@SparqlConnection.load_statement_from_gresource].
528
 * An error will be raised if this method is called on
529
 * `SELECT`/`ASK`/`DESCRIBE`/`CONSTRUCT` SPARQL queries.
530
 *
531
 * Since: 3.5
532
 */
533
void
534
tracker_sparql_statement_update_async (TrackerSparqlStatement *stmt,
535
                                       GCancellable           *cancellable,
536
                                       GAsyncReadyCallback     callback,
537
                                       gpointer                user_data)
538
0
{
539
0
  TrackerSparqlStatementPrivate *priv =
540
0
    tracker_sparql_statement_get_instance_private (stmt);
541
542
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
543
0
  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
544
545
0
  if (tracker_sparql_connection_report_async_error_on_closed (priv->connection,
546
0
                                                              callback,
547
0
                                                              user_data))
548
0
    return;
549
550
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->update_async (stmt,
551
0
                                                           cancellable,
552
0
                                                           callback,
553
0
                                                           user_data);
554
0
}
555
556
/**
557
 * tracker_sparql_statement_update_finish:
558
 * @stmt: a `TrackerSparqlStatement`
559
 * @result: a [type@Gio.AsyncResult] with the result of the operation
560
 * @error: Error location
561
 *
562
 * Finishes the asynchronous update started through
563
 * [method@SparqlStatement.update_async].
564
 *
565
 * Returns: %TRUE if the update finished with no errors, %FALSE otherwise
566
 *
567
 * Since: 3.5
568
 */
569
gboolean
570
tracker_sparql_statement_update_finish (TrackerSparqlStatement  *stmt,
571
                                        GAsyncResult            *result,
572
                                        GError                 **error)
573
0
{
574
0
  g_return_val_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt), FALSE);
575
0
  g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
576
0
  g_return_val_if_fail (!error || !*error, FALSE);
577
578
0
  return TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->update_finish (stmt,
579
0
                                                                   result,
580
0
                                                                   error);
581
0
}
582
583
584
/**
585
 * tracker_sparql_statement_clear_bindings:
586
 * @stmt: a `TrackerSparqlStatement`
587
 *
588
 * Clears all bindings.
589
 */
590
void
591
tracker_sparql_statement_clear_bindings (TrackerSparqlStatement *stmt)
592
0
{
593
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
594
595
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->clear_bindings (stmt);
596
0
}
597
598
/**
599
 * tracker_sparql_statement_serialize_async:
600
 * @stmt: a `TrackerSparqlStatement`
601
 * @flags: serialization flags
602
 * @format: RDF format of the serialized data
603
 * @cancellable: (nullable): Optional [type@Gio.Cancellable]
604
 * @callback: user-defined [type@Gio.AsyncReadyCallback] to be called when
605
 *            the asynchronous operation is finished.
606
 * @user_data: user-defined data to be passed to @callback
607
 *
608
 * Serializes a `DESCRIBE` or `CONSTRUCT` query into the given RDF @format.
609
 *
610
 * The query @stmt was created from must be either a `DESCRIBE` or `CONSTRUCT`
611
 * query, an error will be raised otherwise.
612
 *
613
 * This is an asynchronous operation, @callback will be invoked when the
614
 * data is available for reading.
615
 *
616
 * The SPARQL endpoint may not support the specified format, in that case
617
 * an error will be raised.
618
 *
619
 * The @flags argument is reserved for future expansions, currently
620
 * #TRACKER_SERIALIZE_FLAGS_NONE must be passed.
621
 *
622
 * Since: 3.3
623
 **/
624
void
625
tracker_sparql_statement_serialize_async (TrackerSparqlStatement *stmt,
626
                                          TrackerSerializeFlags   flags,
627
                                          TrackerRdfFormat        format,
628
                                          GCancellable           *cancellable,
629
                                          GAsyncReadyCallback     callback,
630
                                          gpointer                user_data)
631
0
{
632
0
  TrackerSparqlStatementPrivate *priv =
633
0
    tracker_sparql_statement_get_instance_private (stmt);
634
635
0
  g_return_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt));
636
0
  g_return_if_fail (flags == TRACKER_SERIALIZE_FLAGS_NONE);
637
0
  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
638
0
  g_return_if_fail (callback != NULL);
639
640
0
  if (tracker_sparql_connection_report_async_error_on_closed (priv->connection,
641
0
                                                              callback,
642
0
                                                              user_data))
643
0
    return;
644
645
0
  TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->serialize_async (stmt,
646
0
                                                              flags,
647
0
                                                              format,
648
0
                                                              cancellable,
649
0
                                                              callback,
650
0
                                                              user_data);
651
0
}
652
653
/**
654
 * tracker_sparql_statement_serialize_finish:
655
 * @stmt: a `TrackerSparqlStatement`
656
 * @result: a [type@Gio.AsyncResult] with the result of the operation
657
 * @error: Error location
658
 *
659
 * Finishes the asynchronous operation started through
660
 * [method@SparqlStatement.serialize_async].
661
 *
662
 * Returns: (transfer full): a [class@Gio.InputStream] to read RDF content.
663
 *
664
 * Since: 3.3
665
 **/
666
GInputStream *
667
tracker_sparql_statement_serialize_finish (TrackerSparqlStatement  *stmt,
668
                                           GAsyncResult            *result,
669
                                           GError                 **error)
670
0
{
671
0
  g_return_val_if_fail (TRACKER_IS_SPARQL_STATEMENT (stmt), NULL);
672
0
  g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL);
673
0
  g_return_val_if_fail (!error || !*error, NULL);
674
675
0
  return TRACKER_SPARQL_STATEMENT_GET_CLASS (stmt)->serialize_finish (stmt,
676
0
                                                                      result,
677
0
                                                                      error);
678
0
}