[tracker/wip/carlosg/double-precision: 1/2] libtracker-data: Convert from GValues when generating solution for updates
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/double-precision: 1/2] libtracker-data: Convert from GValues when generating solution for updates
- Date: Sat, 2 Mar 2019 19:07:00 +0000 (UTC)
commit 28cc03cf34317c690cac036da204ba5c09a198f6
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat Mar 2 17:43:11 2019 +0100
libtracker-data: Convert from GValues when generating solution for updates
Conversion to strings in Sqlite may cause precision loss which may result in
mismatches. Instead, get values from the cursor as GValues and handle
conversions to strings ourselves.
Ideally we should be preserving these as GValues, as further down the
updates handling pipe we translate these strings to GValues again. However
that involves heavier refactors.
https://bugzilla.gnome.org/show_bug.cgi?id=659600
Closes: https://gitlab.gnome.org/GNOME/tracker/issues/45
src/libtracker-data/tracker-sparql.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index ff379b7b5..eadc35fec 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -2613,8 +2613,29 @@ get_solution_for_pattern (TrackerSparql *sparql,
while (tracker_db_cursor_iter_next (cursor, NULL, NULL)) {
for (i = 0; i < n_cols; i++) {
- const gchar *str = tracker_db_cursor_get_string (cursor, i, NULL);
- tracker_solution_add_value (solution, str);
+ GValue value = G_VALUE_INIT;
+
+ tracker_db_cursor_get_value (cursor, i, &value);
+
+ if (G_VALUE_TYPE (&value) == G_TYPE_STRING) {
+ tracker_solution_add_value (solution,
+ g_value_get_string (&value));
+ } else if (G_VALUE_TYPE (&value) == G_TYPE_INT64) {
+ gchar *str;
+ str = g_strdup_printf ("%" G_GINT64_FORMAT,
+ g_value_get_int64 (&value));
+ tracker_solution_add_value (solution, str);
+ g_free (str);
+ } else if (G_VALUE_TYPE (&value) == G_TYPE_DOUBLE) {
+ gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+ g_ascii_dtostr (buf, sizeof (buf),
+ g_value_get_double (&value));
+ tracker_solution_add_value (solution, buf);
+ } else {
+ g_assert_not_reached ();
+ }
+
+ g_value_unset (&value);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]