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



commit bb88e1d3940e88a008aebed001d9f06734c93bd4
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 2a7f78181..fcb8a93df 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]