[tracker/wip/carlosg/double-precision: 3/4] 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: 3/4] libtracker-data: Convert from GValues when generating solution for updates
- Date: Sat, 2 Mar 2019 19:06:35 +0000 (UTC)
commit 2a5f40812180242c12c46306fc039acb592a8095
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
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]