From 38c59fcf4ade1be95e8b7cde61b0fe5cfab7836a Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Thu, 11 Jan 2018 21:01:30 +0000 Subject: [PATCH] Allow saving extra metadata in the history database This will be used to store things like the kernel version in the future, and also means we can stop abusing the vendor property for the fwupd version. --- src/fu-history.c | 42 ++++++++++++++++++++++++++++++++++-------- src/fu-self-test.c | 11 ++++++----- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/fu-history.c b/src/fu-history.c index 54b9abf57..19a049896 100644 --- a/src/fu-history.c +++ b/src/fu-history.c @@ -88,10 +88,17 @@ fu_history_device_from_stmt (sqlite3_stmt *stmt) /* flags */ fu_device_set_flags (device, sqlite3_column_int64 (stmt, 7)); - /* fwupd_version */ + /* metadata */ tmp = (const gchar *) sqlite3_column_text (stmt, 8); - if (tmp != NULL) - fwupd_release_set_vendor (release, tmp); + if (tmp != NULL) { + g_auto(GStrv) split = g_strsplit (tmp, ";", -1); + for (guint i = 0; split[i] != NULL; i++) { + g_auto(GStrv) kv = g_strsplit (split[i], "=", 2); + if (g_strv_length (kv) != 2) + continue; + fwupd_release_add_metadata_item (release, kv[0], kv[1]); + } + } /* guid_default */ tmp = (const gchar *) sqlite3_column_text (stmt, 9); @@ -195,7 +202,7 @@ fu_history_load (FuHistory *self, GError **error) "device_modified INTEGER DEFAULT 0," "checksum TEXT DEFAULT NULL," "flags INTEGER DEFAULT 0," - "fwupd_version TEXT DEFAULT NULL," + "metadata TEXT DEFAULT NULL," "guid_default TEXT DEFAULT NULL," "version_old TEXT," "version_new TEXT);", -1, &stmt, NULL); @@ -217,12 +224,28 @@ fu_history_load (FuHistory *self, GError **error) return TRUE; } +static gchar * +_convert_hash_to_string (GHashTable *hash) +{ + GString *str = g_string_new (NULL); + g_autoptr(GList) keys = g_hash_table_get_keys (hash); + for (GList *l = keys; l != NULL; l = l->next) { + const gchar *key = l->data; + const gchar *value = g_hash_table_lookup (hash, key); + if (str->len > 0) + g_string_append (str, ";"); + g_string_append_printf (str, "%s=%s", key, value); + } + return g_string_free (str, FALSE); +} + gboolean fu_history_add_device (FuHistory *self, FuDevice *device, FwupdRelease *release, GError **error) { FwupdDeviceFlags flags; const gchar *checksum = NULL; gint rc; + g_autofree gchar *metadata = NULL; g_autoptr(sqlite3_stmt) stmt = NULL; g_return_val_if_fail (FU_IS_HISTORY (self), FALSE); @@ -245,6 +268,9 @@ fu_history_add_device (FuHistory *self, FuDevice *device, FwupdRelease *release, flags &= ~FWUPD_DEVICE_FLAG_REGISTERED; flags &= ~FWUPD_DEVICE_FLAG_SUPPORTED; + /* metadata is stored as a simple string */ + metadata = _convert_hash_to_string (fwupd_release_get_metadata (release)); + /* add */ rc = sqlite3_prepare_v2 (self->db, "INSERT INTO history (device_id," @@ -256,7 +282,7 @@ fu_history_add_device (FuHistory *self, FuDevice *device, FwupdRelease *release, "display_name," "plugin," "guid_default," - "fwupd_version," + "metadata," "device_created," "device_modified," "version_old," @@ -278,7 +304,7 @@ fu_history_add_device (FuHistory *self, FuDevice *device, FwupdRelease *release, sqlite3_bind_text (stmt, 7, fu_device_get_name (device), -1, SQLITE_STATIC); sqlite3_bind_text (stmt, 8, fu_device_get_plugin (device), -1, SQLITE_STATIC); sqlite3_bind_text (stmt, 9, fu_device_get_guid_default (device), -1, SQLITE_STATIC); - sqlite3_bind_text (stmt, 10, VERSION, -1, SQLITE_STATIC); + sqlite3_bind_text (stmt, 10, metadata, -1, SQLITE_STATIC); sqlite3_bind_int64 (stmt, 11, fu_device_get_created (device)); sqlite3_bind_int64 (stmt, 12, fu_device_get_modified (device)); sqlite3_bind_text (stmt, 13, fu_device_get_version (device), -1, SQLITE_STATIC); @@ -390,7 +416,7 @@ fu_history_get_device (FuHistory *self, const gchar *device_id, GError **error) "display_name, " "filename, " "flags, " - "fwupd_version, " + "metadata, " "guid_default, " "update_state, " "update_error, " @@ -444,7 +470,7 @@ fu_history_get_devices (FuHistory *self, GError **error) "display_name, " "filename, " "flags, " - "fwupd_version, " + "metadata, " "guid_default, " "update_state, " "update_error, " diff --git a/src/fu-self-test.c b/src/fu-self-test.c index e554042e6..4ebe9277b 100644 --- a/src/fu-self-test.c +++ b/src/fu-self-test.c @@ -381,6 +381,7 @@ fu_engine_history_func (void) g_assert_cmpint (fu_device_get_update_state (device2), ==, FWUPD_UPDATE_STATE_SUCCESS); g_assert_cmpstr (fu_device_get_update_error (device2), ==, NULL); fu_device_set_modified (device2, 1514338000); + g_hash_table_remove_all (fwupd_release_get_metadata (fu_device_get_release_default (device2))); device_str = fu_device_to_string (device2); checksum = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, blob_cab); device_str_expected = g_strdup_printf ( @@ -397,9 +398,8 @@ fu_engine_history_func (void) " [Release]\n" " Version: 1.2.3\n" " Checksum: SHA1(%s)\n" - " Vendor: %s\n" " TrustFlags: none\n", - checksum, VERSION); + checksum); ret = fu_test_compare_lines (device_str, device_str_expected, &error); g_assert_no_error (error); g_assert (ret); @@ -481,6 +481,7 @@ fu_engine_history_error_func (void) g_assert_cmpstr (fu_device_get_update_error (device2), ==, error->message); g_clear_error (&error); fu_device_set_modified (device2, 1514338000); + g_hash_table_remove_all (fwupd_release_get_metadata (fu_device_get_release_default (device2))); device_str = fu_device_to_string (device2); checksum = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, blob_cab); device_str_expected = g_strdup_printf ( @@ -498,9 +499,8 @@ fu_engine_history_error_func (void) " [Release]\n" " Version: 1.2.3\n" " Checksum: SHA1(%s)\n" - " Vendor: %s\n" " TrustFlags: none\n", - checksum, VERSION); + checksum); ret = fu_test_compare_lines (device_str, device_str_expected, &error); g_assert_no_error (error); g_assert (ret); @@ -1214,6 +1214,7 @@ fu_history_func (void) fwupd_release_set_filename (release, "/var/lib/dave.cap"), fwupd_release_add_checksum (release, "abcdef"); fwupd_release_set_version (release, "3.0.2"); + fwupd_release_add_metadata_item (release, "FwupdVersion", VERSION); ret = fu_history_add_device (history, device, release, &error); g_assert_no_error (error); g_assert (ret); @@ -1252,7 +1253,7 @@ fu_history_func (void) g_assert (release != NULL); g_assert_cmpstr (fwupd_release_get_version (release), ==, "3.0.2"); g_assert_cmpstr (fwupd_release_get_filename (release), ==, "/var/lib/dave.cap"); - g_assert_cmpstr (fwupd_release_get_vendor (release), ==, VERSION); + g_assert_cmpstr (fwupd_release_get_metadata_item (release, "FwupdVersion"), ==, VERSION); checksums = fwupd_release_get_checksums (release); g_assert (checksums != NULL); g_assert_cmpint (checksums->len, ==, 1);