[tracker/wip/carlosg/double-precision: 1/2] libtracker-data: Convert from GValues when generating solution for updates



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]