[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:14:02 +0000 (UTC)
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]