From 6b5e50db94382f9924c8f2205b43f837ec6cc829 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Mon, 1 Oct 2018 02:08:49 +0500 Subject: [PATCH 01/23] database-game: Use only one developer per game Creating a new DatabaseDeveloper each time makes it impossible to connect to developer signals and receive notifications, so only use one object. --- src/database/database-game.vala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/database/database-game.vala b/src/database/database-game.vala index fe322f5b..f9175a72 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -8,9 +8,13 @@ private class Games.DatabaseGame : Object, Game { private Database database; private Game game; + private Developer developer; + public DatabaseGame (Database database, Game game) { this.database = database; this.game = game; + + developer = database.get_developer (game.get_developer (), get_uid ()); } public Uid get_uid () { @@ -42,7 +46,7 @@ private class Games.DatabaseGame : Object, Game { } public Developer get_developer () { - return database.get_developer (game.get_developer (), get_uid ()); + return developer; } public Publisher get_publisher () { -- GitLab From 85f8e14f3d8ac51e06e087bb4ce7b2870b7e5deb Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sun, 30 Sep 2018 13:33:11 +0500 Subject: [PATCH 02/23] developer: Add 'has-loaded' property This will be used in subsequent commits to get rid of changed() signal. Use 'true' value for GenericDeveloper, because it's a simple string that is always available. Use 'false' for DummyDeveloper, because it doesn't have any value. Use 'notify::has-loaded' instead of 'connect' signal in DatabaseDeveloper, and connect signal lazily because it's impossible to handle already loaded (such as GenericDeveloper) case otherwise. --- src/core/developer.vala | 2 ++ src/database/database-developer.vala | 28 +++++++++++++++++++++++++--- src/dummy/dummy-developer.vala | 2 ++ src/generic/generic-developer.vala | 6 ++++++ src/grilo/grilo-developer.vala | 7 ++++--- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/core/developer.vala b/src/core/developer.vala index a0507c17..c86c4e18 100644 --- a/src/core/developer.vala +++ b/src/core/developer.vala @@ -3,6 +3,8 @@ public interface Games.Developer : Object { public signal void changed (); + public abstract bool has_loaded { get; protected set; } + public abstract string get_developer (); public static uint hash (Developer developer) { diff --git a/src/database/database-developer.vala b/src/database/database-developer.vala index ef17dd87..3affeebc 100644 --- a/src/database/database-developer.vala +++ b/src/database/database-developer.vala @@ -15,6 +15,8 @@ private class Games.DatabaseDeveloper : Object, Developer { private Sqlite.Statement save_statement; private string loaded; + public bool has_loaded { get; protected set; } + public DatabaseDeveloper (Sqlite.Database database, Developer developer, Uid uid) { this.developer = developer; this.uid = uid; @@ -30,14 +32,31 @@ private class Games.DatabaseDeveloper : Object, Developer { } } + private void on_developer_loaded () { + if (!developer.has_loaded) + return; + + has_loaded = true; + + try { + save_developer (); + } + catch (Error e) { + warning (e.message); + } + } + public string get_developer () { + if (!has_loaded) { + on_developer_loaded (); + developer.notify["has-loaded"].connect (on_developer_loaded); + } + try { if (loaded == null) load_developer (); - if (loaded != "") + if (loaded != "" && loaded != null) return loaded; - else - save_developer (); } catch (Error e) { warning (e.message); @@ -56,6 +75,9 @@ private class Games.DatabaseDeveloper : Object, Developer { loaded = load_statement.column_text (0) ?? ""; else warning ("Execution failed."); + + if (loaded != "" && loaded != null) + has_loaded = true; } private void save_developer () throws Error { diff --git a/src/dummy/dummy-developer.vala b/src/dummy/dummy-developer.vala index e3462812..84b5d759 100644 --- a/src/dummy/dummy-developer.vala +++ b/src/dummy/dummy-developer.vala @@ -1,6 +1,8 @@ // This file is part of GNOME Games. License: GPL-3.0+. public class Games.DummyDeveloper : Object, Developer { + public bool has_loaded { get; protected set; } + public string get_developer () { return ""; } diff --git a/src/generic/generic-developer.vala b/src/generic/generic-developer.vala index 3499c940..cd791e37 100644 --- a/src/generic/generic-developer.vala +++ b/src/generic/generic-developer.vala @@ -3,6 +3,12 @@ public class Games.GenericDeveloper : Object, Developer { private string developer; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericDeveloper (string developer) { this.developer = developer; } diff --git a/src/grilo/grilo-developer.vala b/src/grilo/grilo-developer.vala index a679b99a..66a9ab14 100644 --- a/src/grilo/grilo-developer.vala +++ b/src/grilo/grilo-developer.vala @@ -4,7 +4,8 @@ public class Games.GriloDeveloper : Object, Developer { private GriloMedia media; private string developer; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloDeveloper (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloDeveloper : Object, Developer { } public string get_developer () { - if (resolving || resolved) + if (resolving || has_loaded) return developer; resolving = true; @@ -36,7 +37,7 @@ public class Games.GriloDeveloper : Object, Developer { developer = grl_media.get_string (metadata_key); - resolved = true; + has_loaded = true; changed (); } -- GitLab From 2509ad6080d24ef02617defcaf324fb7e7f891dc Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Mon, 1 Oct 2018 16:43:01 +0500 Subject: [PATCH 03/23] collection-icon-view: Add invalidate_filter() This will be used in the next commit to refresh "Unknown" developer filter each time a developer has loaded. --- src/ui/collection-icon-view.vala | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ui/collection-icon-view.vala b/src/ui/collection-icon-view.vala index 572a1784..098340c1 100644 --- a/src/ui/collection-icon-view.vala +++ b/src/ui/collection-icon-view.vala @@ -10,7 +10,7 @@ private class Games.CollectionIconView : Gtk.Bin { if (value != null) filtering_terms = value.split (" "); - flow_box.invalidate_filter (); + invalidate_filter (); } } @@ -19,7 +19,7 @@ private class Games.CollectionIconView : Gtk.Bin { get { return _filtering_developer; } set { _filtering_developer = value; - flow_box.invalidate_filter (); + invalidate_filter (); } } @@ -28,7 +28,7 @@ private class Games.CollectionIconView : Gtk.Bin { get { return _filtering_platform; } set { _filtering_platform = value; - flow_box.invalidate_filter (); + invalidate_filter (); } } @@ -108,6 +108,10 @@ private class Games.CollectionIconView : Gtk.Bin { is_active = false; } + public void invalidate_filter () { + flow_box.invalidate_filter (); + } + public bool gamepad_button_press_event (Manette.Event event) { if (!get_mapped ()) return false; -- GitLab From d220f0e81213a6702f37345c0fe3fde06bc99dbb Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sun, 30 Sep 2018 18:12:19 +0500 Subject: [PATCH 04/23] developer-view: Rework developer loading Make use of newly added 'has-loaded' property to handle already loaded developers (such as GenericDeveloper) immediately and and special-case DummyDeveloper row. Also stop updating DeveloperListItem label, because it's not used anymore. --- src/ui/developer-list-item.vala | 1 - src/ui/developers-view.vala | 76 ++++++++++++++++----------------- 2 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/ui/developer-list-item.vala b/src/ui/developer-list-item.vala index 23871e8b..ebf066ad 100644 --- a/src/ui/developer-list-item.vala +++ b/src/ui/developer-list-item.vala @@ -9,7 +9,6 @@ private class Games.DeveloperListItem: Gtk.ListBoxRow { set { _developer = value; update_label (); - value.changed.connect (update_label); } } diff --git a/src/ui/developers-view.vala b/src/ui/developers-view.vala index 0cce1477..8df6bb64 100644 --- a/src/ui/developers-view.vala +++ b/src/ui/developers-view.vala @@ -1,68 +1,66 @@ // This file is part of GNOME Games. License: GPL-3.0+. private class Games.DevelopersView : SidebarView { - // This is a List because Developer objects are mutable, - // and can't be stored in a GenericSet without breaking. - private List shown_developers; - private List all_developers; + private GenericSet shown_developers; + + private uint unknown_games; + private DeveloperListItem unknown_item; construct { - shown_developers = new List (); - all_developers = new List (); + shown_developers = new GenericSet (Developer.hash, Developer.equal); + unknown_games = 0; } protected override void game_added (Game game) { var developer = game.get_developer (); - all_developers.append (developer); - show_developer (developer); - developer.changed.connect (invalidate_developer); + if (developer.has_loaded && developer.get_developer () != "") + show_developer (developer); + else { + show_unknown (); + developer.notify["has-loaded"].connect (invalidate_developer); + } } - private bool show_developer (Developer developer) { - var not_shown = shown_developers.find_custom (developer, Developer.compare) == null; - if (not_shown) { - shown_developers.append (developer); + private void show_developer (Developer developer) { + var shown = shown_developers.contains (developer); + if (!shown) { + shown_developers.add (developer); list_box.add (new DeveloperListItem (developer)); var selected_row = list_box.get_selected_row (); if (selected_row != null) invalidate (selected_row); } - - return not_shown; } - private void hide_developer (Developer developer) { - Gtk.ListBoxRow? first_occurence = null; + private void show_unknown () { + unknown_games++; - foreach (var row in list_box.get_children ()) { - var list_item = row as DeveloperListItem; + if (unknown_item != null) + return; - if (Developer.equal (list_item.developer, developer)) { - if (first_occurence != null) { - if (row == list_box.get_selected_row ()) - list_box.select_row (first_occurence); + var developer = new DummyDeveloper (); + shown_developers.add (developer); - row.destroy (); + unknown_item = new DeveloperListItem (developer); - break; - } - else { - first_occurence = list_item; - first_occurence.changed (); - } - } - } + list_box.add (unknown_item); } - private void invalidate_developer (Developer developer) { - if (!show_developer (developer)) { - // If already shown, this developer's list item gets updated, - // hence try to show developers that are now not represented, - // and hide the developers that are now multiply represented. - all_developers.foreach ((item) => show_developer (item)); - hide_developer (developer); + private void invalidate_developer (Object object, ParamSpec param) { + var developer = object as Developer; + + if (developer.has_loaded) + show_developer (developer); + + unknown_games--; + collection_view.invalidate_filter (); + + if (unknown_games == 0) { + list_box.remove (unknown_item); + unknown_item = null; + select_default_row (); } } -- GitLab From 3c00827587d8bddf23637b33ea31deb1570b53aa Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Mon, 1 Oct 2018 16:53:52 +0500 Subject: [PATCH 05/23] developer: Drop changed() signal It's not used anymore, so remove it. --- src/core/developer.vala | 2 -- src/database/database-developer.vala | 2 -- src/grilo/grilo-developer.vala | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/core/developer.vala b/src/core/developer.vala index c86c4e18..771fa30c 100644 --- a/src/core/developer.vala +++ b/src/core/developer.vala @@ -1,8 +1,6 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.Developer : Object { - public signal void changed (); - public abstract bool has_loaded { get; protected set; } public abstract string get_developer (); diff --git a/src/database/database-developer.vala b/src/database/database-developer.vala index 3affeebc..92868cea 100644 --- a/src/database/database-developer.vala +++ b/src/database/database-developer.vala @@ -21,8 +21,6 @@ private class Games.DatabaseDeveloper : Object, Developer { this.developer = developer; this.uid = uid; - developer.changed.connect (() => changed ()); - try { load_statement = Database.prepare (database, LOAD_DEVELOPER_QUERY); save_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); diff --git a/src/grilo/grilo-developer.vala b/src/grilo/grilo-developer.vala index 66a9ab14..5b1ae94a 100644 --- a/src/grilo/grilo-developer.vala +++ b/src/grilo/grilo-developer.vala @@ -38,7 +38,5 @@ public class Games.GriloDeveloper : Object, Developer { developer = grl_media.get_string (metadata_key); has_loaded = true; - - changed (); } } -- GitLab From 9e2bb36f33c20dd596ce9af9baa4c5e733f9c43c Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Mon, 3 Sep 2018 22:40:17 +0500 Subject: [PATCH 06/23] database: Add DatabaseMetadata This will be used in the following commits to represent full metadata of a game, and a full row from 'game_metadata' database table. This allows loading all metadata of a given game via a single SQL query. --- src/database/database-metadata.vala | 117 ++++++++++++++++++++++++++++ src/database/database.vala | 4 + src/meson.build | 1 + 3 files changed, 122 insertions(+) create mode 100644 src/database/database-metadata.vala diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala new file mode 100644 index 00000000..e7af16c2 --- /dev/null +++ b/src/database/database-metadata.vala @@ -0,0 +1,117 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabaseMetadata : Object { + private const string LOAD_QUERY = """ + SELECT developer FROM game_metadata WHERE uid=$UID; + """; + + private const string ADD_GAME_QUERY = """ + INSERT OR IGNORE INTO game_metadata (uid) VALUES ($UID); + """; + + private const string SAVE_DEVELOPER_QUERY = """ + UPDATE game_metadata SET developer=$DEVELOPER WHERE uid=$UID; + """; + + private Game game; + private Uid uid; + private Developer developer; + + private string uid_value; + private string developer_value; + + private Sqlite.Statement add_game_statement; + private Sqlite.Statement load_statement; + private Sqlite.Statement save_developer_statement; + + public bool developer_loaded { get; set; } + + private bool game_added; + + public DatabaseMetadata (Sqlite.Database database, Game game) { + this.game = game; + + uid = game.get_uid (); + developer = game.get_developer (); + + try { + uid_value = game.get_uid ().get_uid (); + + add_game_statement = Database.prepare (database, ADD_GAME_QUERY); + load_statement = Database.prepare (database, LOAD_QUERY); + save_developer_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); + + load_metadata (); + } + catch (Error e) { + warning (e.message); + } + } + + public string get_developer () { + if (!developer_loaded) { + on_developer_loaded (); + developer.notify.connect (on_developer_loaded); + return developer.get_developer (); + } + + return developer_value; + } + + private void on_developer_loaded () { + if (!developer.has_loaded) + return; + + developer_value = developer.get_developer (); + developer_loaded = true; + + add_game (); + save_developer (); + } + + private void save_developer () { + try { + save_developer_statement.reset (); + Database.bind_text (save_developer_statement, "$UID", uid_value); + Database.bind_text (save_developer_statement, "$DEVELOPER", developer_value); + + if (save_developer_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + + private void add_game () { + if (game_added) + return; + + game_added = true; + + try { + add_game_statement.reset (); + + Database.bind_text (add_game_statement, "$UID", uid_value); + + if (add_game_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + + private void load_metadata () throws Error { + load_statement.reset (); + + Database.bind_text (load_statement, "$UID", uid_value); + + if (load_statement.step () == Sqlite.ROW) { + developer_value = load_statement.column_text (0); + + if (developer_value != null) + developer_loaded = true; + } + } +} diff --git a/src/database/database.vala b/src/database/database.vala index b513df88..da7904ed 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -71,6 +71,10 @@ private class Games.Database : Object { return new DatabaseDeveloper (database, developer, uid); } + public DatabaseMetadata get_metadata (Game game) { + return new DatabaseMetadata (database, game); + } + private void create_tables () throws Error { exec (CREATE_RESOURCES_TABLE_QUERY, null); exec (CREATE_METADATA_TABLE_QUERY, null); diff --git a/src/meson.build b/src/meson.build index 9a886051..fab72bb9 100644 --- a/src/meson.build +++ b/src/meson.build @@ -49,6 +49,7 @@ vala_sources = [ 'database/database-developer.vala', 'database/database-error.vala', 'database/database-game.vala', + 'database/database-metadata.vala', 'database/database-uid.vala', 'database/database-uri-iterator.vala', 'database/database-uri-source.vala', -- GitLab From e531447663c9587bfc79e7b95d2916d63cf1633d Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Mon, 1 Oct 2018 21:33:13 +0500 Subject: [PATCH 07/23] database-developer: Reimplement using DatabaseMetadata Since DatabaseMetadata can fetch developers now, turn DatabaseDeveloper into an adapter object. Also remove now unused Database.get_developer(). --- src/database/database-developer.vala | 91 ++++------------------------ src/database/database-game.vala | 4 +- src/database/database.vala | 4 -- 3 files changed, 14 insertions(+), 85 deletions(-) diff --git a/src/database/database-developer.vala b/src/database/database-developer.vala index 92868cea..8293ba4b 100644 --- a/src/database/database-developer.vala +++ b/src/database/database-developer.vala @@ -1,95 +1,26 @@ // This file is part of GNOME Games. License: GPL-3.0+. private class Games.DatabaseDeveloper : Object, Developer { - private const string LOAD_DEVELOPER_QUERY = """ - SELECT developer FROM game_metadata WHERE uid=$UID; - """; - - private const string SAVE_DEVELOPER_QUERY = """ - UPDATE game_metadata SET developer=$DEVELOPER WHERE uid=$UID; - """; - - private Developer developer; - private Uid uid; - private Sqlite.Statement load_statement; - private Sqlite.Statement save_statement; - private string loaded; + private DatabaseMetadata metadata; public bool has_loaded { get; protected set; } - public DatabaseDeveloper (Sqlite.Database database, Developer developer, Uid uid) { - this.developer = developer; - this.uid = uid; + public DatabaseDeveloper (DatabaseMetadata metadata) { + this.metadata = metadata; - try { - load_statement = Database.prepare (database, LOAD_DEVELOPER_QUERY); - save_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); - } - catch (Error e) { - warning (e.message); + if (metadata.developer_loaded) + has_loaded = true; + else { + metadata.notify["developer-loaded"].connect (on_developer_loaded); + metadata.get_developer (); } } - private void on_developer_loaded () { - if (!developer.has_loaded) - return; - - has_loaded = true; - - try { - save_developer (); - } - catch (Error e) { - warning (e.message); - } + private void on_developer_loaded (Object object, ParamSpec param) { + has_loaded = metadata.developer_loaded; } public string get_developer () { - if (!has_loaded) { - on_developer_loaded (); - developer.notify["has-loaded"].connect (on_developer_loaded); - } - - try { - if (loaded == null) - load_developer (); - if (loaded != "" && loaded != null) - return loaded; - } - catch (Error e) { - warning (e.message); - } - - return developer.get_developer (); - } - - private void load_developer () throws Error { - if (load_statement == null) - return; - - Database.bind_text (load_statement, "$UID", uid.get_uid ()); - - if (load_statement.step () == Sqlite.ROW) - loaded = load_statement.column_text (0) ?? ""; - else - warning ("Execution failed."); - - if (loaded != "" && loaded != null) - has_loaded = true; - } - - private void save_developer () throws Error { - if (save_statement == null) - return; - - loaded = developer.get_developer (); - if (loaded == "") - return; - - Database.bind_text (save_statement, "$UID", uid.get_uid ()); - Database.bind_text (save_statement, "$DEVELOPER", loaded); - - if (save_statement.step () != Sqlite.DONE) - warning ("Execution failed."); + return metadata.get_developer (); } } diff --git a/src/database/database-game.vala b/src/database/database-game.vala index f9175a72..71d3137f 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -14,7 +14,9 @@ private class Games.DatabaseGame : Object, Game { this.database = database; this.game = game; - developer = database.get_developer (game.get_developer (), get_uid ()); + var metadata = database.get_metadata (game); + + developer = new DatabaseDeveloper (metadata); } public Uid get_uid () { diff --git a/src/database/database.vala b/src/database/database.vala index da7904ed..ebd54f45 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -67,10 +67,6 @@ private class Games.Database : Object { return new DatabaseUid (database, uid); } - public DatabaseDeveloper get_developer (Developer developer, Uid uid) { - return new DatabaseDeveloper (database, developer, uid); - } - public DatabaseMetadata get_metadata (Game game) { return new DatabaseMetadata (database, game); } -- GitLab From cf53ba371bc9e983a3cc4962dd81edb185141c3a Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Mon, 1 Oct 2018 21:35:33 +0500 Subject: [PATCH 08/23] database: Remove DatabaseUid Since DatabaseMetadata handles uid loading now, this class is no longer necessary and can be removed. Also remove now unused Database.get_uid(). --- src/database/database-game.vala | 2 +- src/database/database-uid.vala | 66 --------------------------------- src/database/database.vala | 4 -- src/meson.build | 1 - 4 files changed, 1 insertion(+), 72 deletions(-) delete mode 100644 src/database/database-uid.vala diff --git a/src/database/database-game.vala b/src/database/database-game.vala index 71d3137f..aa86ff62 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -20,7 +20,7 @@ private class Games.DatabaseGame : Object, Game { } public Uid get_uid () { - return database.get_uid (game.get_uid ()); + return game.get_uid (); } public Icon get_icon () { diff --git a/src/database/database-uid.vala b/src/database/database-uid.vala deleted file mode 100644 index b5700e18..00000000 --- a/src/database/database-uid.vala +++ /dev/null @@ -1,66 +0,0 @@ -// This file is part of GNOME Games. License: GPL-3.0+. - -private class Games.DatabaseUid : Object, Uid { - private const string HAS_UID_QUERY = """ - SELECT EXISTS (SELECT 1 FROM game_metadata WHERE uid=$UID LIMIT 1); - """; - - private const string ADD_UID_QUERY = """ - INSERT INTO game_metadata (uid) VALUES ($UID); - """; - - private Uid uid; - private Sqlite.Statement has_statement; - private Sqlite.Statement add_statement; - private bool has; - - internal DatabaseUid (Sqlite.Database database, Uid uid) { - this.uid = uid; - - try { - has_statement = Database.prepare (database, HAS_UID_QUERY); - add_statement = Database.prepare (database, ADD_UID_QUERY); - } - catch (Error e) { - warning (e.message); - } - } - - public string get_uid () throws Error { - try { - if (!has) - has_uid (); - if (!has) - add_uid (); - } - catch (Error e) { - warning (e.message); - } - - return uid.get_uid (); - } - - private void has_uid () throws Error { - if (has_statement == null) - return; - - Database.bind_text (has_statement, "$UID", uid.get_uid ()); - - if (has_statement.step () == Sqlite.ROW) - has = has_statement.column_text (0) == "1"; - else - warning ("Execution failed."); - } - - private void add_uid () throws Error { - if (add_statement == null) - return; - - has = true; - - Database.bind_text (add_statement, "$UID", uid.get_uid ()); - - if (add_statement.step () != Sqlite.DONE) - warning ("Execution failed."); - } -} diff --git a/src/database/database.vala b/src/database/database.vala index ebd54f45..352b0caa 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -63,10 +63,6 @@ private class Games.Database : Object { return new DatabaseUriSource (database); } - public DatabaseUid get_uid (Uid uid) { - return new DatabaseUid (database, uid); - } - public DatabaseMetadata get_metadata (Game game) { return new DatabaseMetadata (database, game); } diff --git a/src/meson.build b/src/meson.build index fab72bb9..e77705d9 100644 --- a/src/meson.build +++ b/src/meson.build @@ -50,7 +50,6 @@ vala_sources = [ 'database/database-error.vala', 'database/database-game.vala', 'database/database-metadata.vala', - 'database/database-uid.vala', 'database/database-uri-iterator.vala', 'database/database-uri-source.vala', -- GitLab From bdbadd691d554eb9487f9241f127081cc0945bc4 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 18:54:47 +0500 Subject: [PATCH 09/23] cooperative: Add 'has-loaded' property and remove changed() --- src/core/cooperative.vala | 2 +- src/dummy/dummy-cooperative.vala | 2 ++ src/generic/generic-cooperative.vala | 6 ++++++ src/grilo/grilo-cooperative.vala | 9 ++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/core/cooperative.vala b/src/core/cooperative.vala index 40945b3d..ffc62fbf 100644 --- a/src/core/cooperative.vala +++ b/src/core/cooperative.vala @@ -1,7 +1,7 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.Cooperative : Object { - public signal void changed (); + public abstract bool has_loaded { get; protected set; } public abstract bool get_cooperative (); } diff --git a/src/dummy/dummy-cooperative.vala b/src/dummy/dummy-cooperative.vala index a5aff939..b0e4b7d7 100644 --- a/src/dummy/dummy-cooperative.vala +++ b/src/dummy/dummy-cooperative.vala @@ -1,6 +1,8 @@ // This file is part of GNOME Games. License: GPL-3.0+. public class Games.DummyCooperative : Object, Cooperative { + public bool has_loaded { get; protected set; } + public bool get_cooperative () { return false; } diff --git a/src/generic/generic-cooperative.vala b/src/generic/generic-cooperative.vala index 8073a25e..a3e4a918 100644 --- a/src/generic/generic-cooperative.vala +++ b/src/generic/generic-cooperative.vala @@ -3,6 +3,12 @@ public class Games.GenericCooperative : Object, Cooperative { private bool cooperative; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericCooperative (bool cooperative) { this.cooperative = cooperative; } diff --git a/src/grilo/grilo-cooperative.vala b/src/grilo/grilo-cooperative.vala index 3cafcef0..07393b10 100644 --- a/src/grilo/grilo-cooperative.vala +++ b/src/grilo/grilo-cooperative.vala @@ -4,7 +4,8 @@ public class Games.GriloCooperative : Object, Cooperative { private GriloMedia media; private bool cooperative; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloCooperative (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloCooperative : Object, Cooperative { } public bool get_cooperative () { - if (resolving || resolved) + if (resolving || has_loaded) return cooperative; resolving = true; @@ -36,8 +37,6 @@ public class Games.GriloCooperative : Object, Cooperative { cooperative = grl_media.get_boolean (metadata_key); - resolved = true; - - changed (); + has_loaded = true; } } -- GitLab From 3e8a2d44cfbd3cb38deac1a17c6fc6ada6fff1c4 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 18:55:32 +0500 Subject: [PATCH 10/23] description: Add 'has-loaded' property and remove changed() --- src/core/description.vala | 2 +- src/dummy/dummy-description.vala | 2 ++ src/generic/generic-description.vala | 6 ++++++ src/grilo/grilo-description.vala | 9 ++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/core/description.vala b/src/core/description.vala index 69058c8a..b4d771de 100644 --- a/src/core/description.vala +++ b/src/core/description.vala @@ -1,7 +1,7 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.Description : Object { - public signal void changed (); + public abstract bool has_loaded { get; protected set; } public abstract string get_description (); } diff --git a/src/dummy/dummy-description.vala b/src/dummy/dummy-description.vala index 53a40650..07571457 100644 --- a/src/dummy/dummy-description.vala +++ b/src/dummy/dummy-description.vala @@ -1,6 +1,8 @@ // This file is part of GNOME Games. License: GPL-3.0+. public class Games.DummyDescription : Object, Description { + public bool has_loaded { get; protected set; } + public string get_description () { return ""; } diff --git a/src/generic/generic-description.vala b/src/generic/generic-description.vala index fa08666f..41ba950c 100644 --- a/src/generic/generic-description.vala +++ b/src/generic/generic-description.vala @@ -3,6 +3,12 @@ public class Games.GenericDescription : Object, Description { private string description; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericDescription (string description) { this.description = description; } diff --git a/src/grilo/grilo-description.vala b/src/grilo/grilo-description.vala index 7a9d824d..5b97f02b 100644 --- a/src/grilo/grilo-description.vala +++ b/src/grilo/grilo-description.vala @@ -4,7 +4,8 @@ public class Games.GriloDescription : Object, Description { private GriloMedia media; private string description; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloDescription (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloDescription : Object, Description { } public string get_description () { - if (resolving || resolved) + if (resolving || has_loaded) return description; resolving = true; @@ -33,8 +34,6 @@ public class Games.GriloDescription : Object, Description { description = grl_media.get_description (); - resolved = true; - - changed (); + has_loaded = true; } } -- GitLab From b2fdce30316c62420d60c2ed5584079d02d1e23e Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 18:55:49 +0500 Subject: [PATCH 11/23] genre: Add 'has-loaded' property and remove changed() --- src/core/genre.vala | 2 +- src/dummy/dummy-genre.vala | 2 ++ src/generic/generic-genre.vala | 6 ++++++ src/grilo/grilo-genre.vala | 9 ++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/core/genre.vala b/src/core/genre.vala index 8411d214..84a0be86 100644 --- a/src/core/genre.vala +++ b/src/core/genre.vala @@ -1,7 +1,7 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.Genre : Object { - public signal void changed (); + public abstract bool has_loaded { get; protected set; } public abstract unowned string[] get_genre (); } diff --git a/src/dummy/dummy-genre.vala b/src/dummy/dummy-genre.vala index b23b6c0f..97ba1bf4 100644 --- a/src/dummy/dummy-genre.vala +++ b/src/dummy/dummy-genre.vala @@ -4,6 +4,8 @@ public class Games.DummyGenre : Object, Genre { // This is needed because get_genre() can't transfer ownership of the list. private string[] genres; + public bool has_loaded { get; protected set; } + construct { genres = {}; } diff --git a/src/generic/generic-genre.vala b/src/generic/generic-genre.vala index 3ffd7b2c..d66fa0a6 100644 --- a/src/generic/generic-genre.vala +++ b/src/generic/generic-genre.vala @@ -3,6 +3,12 @@ public class Games.GenericGenre : Object, Genre { private string[] genre; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericGenre (string[] genre) { this.genre = genre.copy (); } diff --git a/src/grilo/grilo-genre.vala b/src/grilo/grilo-genre.vala index b221dcb1..2aa3e24b 100644 --- a/src/grilo/grilo-genre.vala +++ b/src/grilo/grilo-genre.vala @@ -4,7 +4,8 @@ public class Games.GriloGenre : Object, Genre { private GriloMedia media; private string[] genre; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloGenre (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloGenre : Object, Genre { } public unowned string[] get_genre () { - if (resolving || resolved) + if (resolving || has_loaded) return genre; resolving = true; @@ -36,8 +37,6 @@ public class Games.GriloGenre : Object, Genre { for (uint index = 0; index < genre_count; index++) genre += grl_media.get_genre_nth (index); - resolved = true; - - changed (); + has_loaded = true; } } -- GitLab From 94f54404fd515228c3bb1c19a38966c65fc93916 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 18:56:05 +0500 Subject: [PATCH 12/23] players: Add 'has-loaded' property and remove changed() --- src/core/players.vala | 2 +- src/dummy/dummy-players.vala | 2 ++ src/generic/generic-players.vala | 6 ++++++ src/grilo/grilo-players.vala | 9 ++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/core/players.vala b/src/core/players.vala index bcf28555..35905b3d 100644 --- a/src/core/players.vala +++ b/src/core/players.vala @@ -1,7 +1,7 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.Players : Object { - public signal void changed (); + public abstract bool has_loaded { get; protected set; } public abstract string get_players (); } diff --git a/src/dummy/dummy-players.vala b/src/dummy/dummy-players.vala index 0f015d91..7acb1c7c 100644 --- a/src/dummy/dummy-players.vala +++ b/src/dummy/dummy-players.vala @@ -1,6 +1,8 @@ // This file is part of GNOME Games. License: GPL-3.0+. public class Games.DummyPlayers : Object, Players { + public bool has_loaded { get; protected set; } + public string get_players () { return ""; } diff --git a/src/generic/generic-players.vala b/src/generic/generic-players.vala index 549a865d..917db04c 100644 --- a/src/generic/generic-players.vala +++ b/src/generic/generic-players.vala @@ -3,6 +3,12 @@ public class Games.GenericPlayers : Object, Players { private string players; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericPlayers (string players) { this.players = players; } diff --git a/src/grilo/grilo-players.vala b/src/grilo/grilo-players.vala index 7ab4fddc..0cb69d6e 100644 --- a/src/grilo/grilo-players.vala +++ b/src/grilo/grilo-players.vala @@ -4,7 +4,8 @@ public class Games.GriloPlayers : Object, Players { private GriloMedia media; private string players; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloPlayers (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloPlayers : Object, Players { } public string get_players () { - if (resolving || resolved) + if (resolving || has_loaded) return players; resolving = true; @@ -41,8 +42,6 @@ public class Games.GriloPlayers : Object, Players { else players = _("Multi-player"); - resolved = true; - - changed (); + has_loaded = true; } } -- GitLab From beb3a09d7ecb8bfab03736493706033a7fb438d0 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 18:56:22 +0500 Subject: [PATCH 13/23] publisher: Add 'has-loaded' property and remove changed() --- src/core/publisher.vala | 2 +- src/dummy/dummy-publisher.vala | 2 ++ src/generic/generic-publisher.vala | 6 ++++++ src/grilo/grilo-publisher.vala | 9 ++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/core/publisher.vala b/src/core/publisher.vala index f50ea2c9..753542d2 100644 --- a/src/core/publisher.vala +++ b/src/core/publisher.vala @@ -1,7 +1,7 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.Publisher : Object { - public signal void changed (); + public abstract bool has_loaded { get; protected set; } public abstract string get_publisher (); } diff --git a/src/dummy/dummy-publisher.vala b/src/dummy/dummy-publisher.vala index 0ddb432a..82e1dd18 100644 --- a/src/dummy/dummy-publisher.vala +++ b/src/dummy/dummy-publisher.vala @@ -1,6 +1,8 @@ // This file is part of GNOME Games. License: GPL-3.0+. public class Games.DummyPublisher : Object, Publisher { + public bool has_loaded { get; protected set; } + public string get_publisher () { return ""; } diff --git a/src/generic/generic-publisher.vala b/src/generic/generic-publisher.vala index bbebea9c..0945d33c 100644 --- a/src/generic/generic-publisher.vala +++ b/src/generic/generic-publisher.vala @@ -3,6 +3,12 @@ public class Games.GenericPublisher : Object, Publisher { private string publisher; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericPublisher (string publisher) { this.publisher = publisher; } diff --git a/src/grilo/grilo-publisher.vala b/src/grilo/grilo-publisher.vala index ee5c7efe..035ce95c 100644 --- a/src/grilo/grilo-publisher.vala +++ b/src/grilo/grilo-publisher.vala @@ -4,7 +4,8 @@ public class Games.GriloPublisher : Object, Publisher { private GriloMedia media; private string publisher; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloPublisher (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloPublisher : Object, Publisher { } public string get_publisher () { - if (resolving || resolved) + if (resolving || has_loaded) return publisher; resolving = true; @@ -36,8 +37,6 @@ public class Games.GriloPublisher : Object, Publisher { publisher = grl_media.get_string (metadata_key); - resolved = true; - - changed (); + has_loaded = true; } } -- GitLab From 6eec14eea8b9c522da046cc435320add8502a791 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 18:56:38 +0500 Subject: [PATCH 14/23] rating: Add 'has-loaded' property and remove changed() --- src/core/rating.vala | 2 +- src/dummy/dummy-rating.vala | 2 ++ src/generic/generic-rating.vala | 6 ++++++ src/grilo/grilo-rating.vala | 9 ++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/core/rating.vala b/src/core/rating.vala index 88313378..b2bc2f23 100644 --- a/src/core/rating.vala +++ b/src/core/rating.vala @@ -1,7 +1,7 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.Rating : Object { - public signal void changed (); + public abstract bool has_loaded { get; protected set; } public abstract float get_rating (); } diff --git a/src/dummy/dummy-rating.vala b/src/dummy/dummy-rating.vala index 216bd42c..9d53c77f 100644 --- a/src/dummy/dummy-rating.vala +++ b/src/dummy/dummy-rating.vala @@ -1,6 +1,8 @@ // This file is part of GNOME Games. License: GPL-3.0+. public class Games.DummyRating : Object, Rating { + public bool has_loaded { get; protected set; } + public float get_rating () { return 0; } diff --git a/src/generic/generic-rating.vala b/src/generic/generic-rating.vala index 315240c8..62d8d0aa 100644 --- a/src/generic/generic-rating.vala +++ b/src/generic/generic-rating.vala @@ -3,6 +3,12 @@ public class Games.GenericRating : Object, Rating { private float rating; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericRating (float rating) { this.rating = rating; } diff --git a/src/grilo/grilo-rating.vala b/src/grilo/grilo-rating.vala index 508d7dc1..4a3a6741 100644 --- a/src/grilo/grilo-rating.vala +++ b/src/grilo/grilo-rating.vala @@ -4,7 +4,8 @@ public class Games.GriloRating : Object, Rating { private GriloMedia media; private float rating; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloRating (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloRating : Object, Rating { } public float get_rating () { - if (resolving || resolved) + if (resolving || has_loaded) return rating; resolving = true; @@ -33,8 +34,6 @@ public class Games.GriloRating : Object, Rating { rating = grl_media.get_rating (); - resolved = true; - - changed (); + has_loaded = true; } } -- GitLab From fa61b8b4f519f5f1cd7d07f63d6e035c808a398a Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 18:56:50 +0500 Subject: [PATCH 15/23] release-date: Add 'has-loaded' property and remove changed() --- src/core/release-date.vala | 2 +- src/dummy/dummy-release-date.vala | 2 ++ src/generic/generic-release-date.vala | 6 ++++++ src/grilo/grilo-release-date.vala | 9 ++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/core/release-date.vala b/src/core/release-date.vala index 6461f2e6..ba00f60e 100644 --- a/src/core/release-date.vala +++ b/src/core/release-date.vala @@ -1,7 +1,7 @@ // This file is part of GNOME Games. License: GPL-3.0+. public interface Games.ReleaseDate : Object { - public signal void changed (); + public abstract bool has_loaded { get; protected set; } public abstract DateTime get_release_date (); } diff --git a/src/dummy/dummy-release-date.vala b/src/dummy/dummy-release-date.vala index 2762e39b..7c9b742b 100644 --- a/src/dummy/dummy-release-date.vala +++ b/src/dummy/dummy-release-date.vala @@ -1,6 +1,8 @@ // This file is part of GNOME Games. License: GPL-3.0+. public class Games.DummyReleaseDate : Object, ReleaseDate { + public bool has_loaded { get; protected set; } + public DateTime get_release_date () { return null; } diff --git a/src/generic/generic-release-date.vala b/src/generic/generic-release-date.vala index ddf2e89c..81209198 100644 --- a/src/generic/generic-release-date.vala +++ b/src/generic/generic-release-date.vala @@ -3,6 +3,12 @@ public class Games.GenericReleaseDate : Object, ReleaseDate { private DateTime release_date; + public bool has_loaded { get; protected set; } + + construct { + has_loaded = true; + } + public GenericReleaseDate (DateTime release_date) { this.release_date = release_date; } diff --git a/src/grilo/grilo-release-date.vala b/src/grilo/grilo-release-date.vala index d4febe9a..1be39328 100644 --- a/src/grilo/grilo-release-date.vala +++ b/src/grilo/grilo-release-date.vala @@ -4,7 +4,8 @@ public class Games.GriloReleaseDate : Object, ReleaseDate { private GriloMedia media; private DateTime release_date; private bool resolving; - private bool resolved; + + public bool has_loaded { get; protected set; } public GriloReleaseDate (GriloMedia media) { this.media = media; @@ -13,7 +14,7 @@ public class Games.GriloReleaseDate : Object, ReleaseDate { } public DateTime get_release_date () { - if (resolving || resolved) + if (resolving || has_loaded) return release_date; resolving = true; @@ -33,8 +34,6 @@ public class Games.GriloReleaseDate : Object, ReleaseDate { release_date = grl_media.get_publication_date (); - resolved = true; - - changed (); + has_loaded = true; } } -- GitLab From 15ebfee3f3a8cfdd6bb04445f421a36f269622d9 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 12:32:22 +0500 Subject: [PATCH 16/23] database: Cache Cooperative --- src/database/database-cooperative.vala | 26 ++++++++++++ src/database/database-game.vala | 4 +- src/database/database-metadata.vala | 56 ++++++++++++++++++++++++-- src/database/database.vala | 9 +++++ src/meson.build | 1 + 5 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/database/database-cooperative.vala diff --git a/src/database/database-cooperative.vala b/src/database/database-cooperative.vala new file mode 100644 index 00000000..b513159e --- /dev/null +++ b/src/database/database-cooperative.vala @@ -0,0 +1,26 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabaseCooperative : Object, Cooperative { + private DatabaseMetadata metadata; + + public bool has_loaded { get; protected set; } + + public DatabaseCooperative (DatabaseMetadata metadata) { + this.metadata = metadata; + + if (metadata.cooperative_loaded) + has_loaded = true; + else { + metadata.notify["cooperative-loaded"].connect (on_cooperative_loaded); + metadata.get_cooperative (); + } + } + + private void on_cooperative_loaded (Object object, ParamSpec param) { + has_loaded = metadata.cooperative_loaded; + } + + public bool get_cooperative () { + return metadata.get_cooperative (); + } +} diff --git a/src/database/database-game.vala b/src/database/database-game.vala index aa86ff62..a98893f1 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -8,6 +8,7 @@ private class Games.DatabaseGame : Object, Game { private Database database; private Game game; + private Cooperative cooperative; private Developer developer; public DatabaseGame (Database database, Game game) { @@ -16,6 +17,7 @@ private class Games.DatabaseGame : Object, Game { var metadata = database.get_metadata (game); + cooperative = new DatabaseCooperative (metadata); developer = new DatabaseDeveloper (metadata); } @@ -36,7 +38,7 @@ private class Games.DatabaseGame : Object, Game { } public Cooperative get_cooperative () { - return game.get_cooperative (); + return cooperative; } public Genre get_genre () { diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala index e7af16c2..5d62a2e2 100644 --- a/src/database/database-metadata.vala +++ b/src/database/database-metadata.vala @@ -2,28 +2,36 @@ private class Games.DatabaseMetadata : Object { private const string LOAD_QUERY = """ - SELECT developer FROM game_metadata WHERE uid=$UID; + SELECT cooperative, developer FROM game_metadata WHERE uid=$UID; """; private const string ADD_GAME_QUERY = """ INSERT OR IGNORE INTO game_metadata (uid) VALUES ($UID); """; + private const string SAVE_COOPERATIVE_QUERY = """ + UPDATE game_metadata SET cooperative=$COOPERATIVE WHERE uid=$UID; + """; + private const string SAVE_DEVELOPER_QUERY = """ UPDATE game_metadata SET developer=$DEVELOPER WHERE uid=$UID; """; private Game game; private Uid uid; + private Cooperative cooperative; private Developer developer; private string uid_value; + private bool cooperative_value; private string developer_value; private Sqlite.Statement add_game_statement; private Sqlite.Statement load_statement; + private Sqlite.Statement save_cooperative_statement; private Sqlite.Statement save_developer_statement; + public bool cooperative_loaded { get; set; } public bool developer_loaded { get; set; } private bool game_added; @@ -32,6 +40,7 @@ private class Games.DatabaseMetadata : Object { this.game = game; uid = game.get_uid (); + cooperative = game.get_cooperative (); developer = game.get_developer (); try { @@ -39,6 +48,7 @@ private class Games.DatabaseMetadata : Object { add_game_statement = Database.prepare (database, ADD_GAME_QUERY); load_statement = Database.prepare (database, LOAD_QUERY); + save_cooperative_statement = Database.prepare (database, SAVE_COOPERATIVE_QUERY); save_developer_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); load_metadata (); @@ -48,6 +58,16 @@ private class Games.DatabaseMetadata : Object { } } + public bool get_cooperative () { + if (!cooperative_loaded) { + on_cooperative_loaded (); + cooperative.notify.connect (on_cooperative_loaded); + return cooperative.get_cooperative (); + } + + return cooperative_value; + } + public string get_developer () { if (!developer_loaded) { on_developer_loaded (); @@ -58,6 +78,17 @@ private class Games.DatabaseMetadata : Object { return developer_value; } + private void on_cooperative_loaded () { + if (!cooperative.has_loaded) + return; + + cooperative_value = cooperative.get_cooperative (); + cooperative_loaded = true; + + add_game (); + save_cooperative (); + } + private void on_developer_loaded () { if (!developer.has_loaded) return; @@ -69,6 +100,20 @@ private class Games.DatabaseMetadata : Object { save_developer (); } + private void save_cooperative () { + try { + save_cooperative_statement.reset (); + Database.bind_text (save_cooperative_statement, "$UID", uid_value); + Database.bind_int (save_cooperative_statement, "$COOPERATIVE", cooperative_value ? 1 : 0); + + if (save_cooperative_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + private void save_developer () { try { save_developer_statement.reset (); @@ -108,10 +153,15 @@ private class Games.DatabaseMetadata : Object { Database.bind_text (load_statement, "$UID", uid_value); if (load_statement.step () == Sqlite.ROW) { - developer_value = load_statement.column_text (0); + if (load_statement.column_type (0) != Sqlite.NULL) { + cooperative_value = load_statement.column_int (0) == 1; + cooperative_loaded = true; + } - if (developer_value != null) + if (load_statement.column_type (1) != Sqlite.NULL) { + developer_value = load_statement.column_text (1); developer_loaded = true; + } } } } diff --git a/src/database/database.vala b/src/database/database.vala index 352b0caa..57c3c8a2 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -21,6 +21,7 @@ private class Games.Database : Object { private const string CREATE_METADATA_TABLE_QUERY = """ CREATE TABLE IF NOT EXISTS game_metadata ( uid TEXT PRIMARY KEY NOT NULL, + cooperative INTEGER, developer TEXT ) WITHOUT ROWID; """; @@ -87,6 +88,14 @@ private class Games.Database : Object { return statement; } + internal static void bind_int (Sqlite.Statement statement, string parameter, int val) throws Error { + var position = statement.bind_parameter_index (parameter); + if (position <= 0) + throw new DatabaseError.BINDING_FAILED ("Couldn't bind int to the parameter ā€œ%sā€, unexpected position: %d.", parameter, position); + + statement.bind_int (position, val); + } + internal static void bind_text (Sqlite.Statement statement, string parameter, string text) throws Error { var position = statement.bind_parameter_index (parameter); if (position <= 0) diff --git a/src/meson.build b/src/meson.build index e77705d9..a2c72691 100644 --- a/src/meson.build +++ b/src/meson.build @@ -46,6 +46,7 @@ vala_sources = [ 'core/uri-source.vala', 'database/database.vala', + 'database/database-cooperative.vala', 'database/database-developer.vala', 'database/database-error.vala', 'database/database-game.vala', -- GitLab From 7668ed6478024fe9fa10a635e6ac1ba1859709b9 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Tue, 2 Oct 2018 19:30:34 +0500 Subject: [PATCH 17/23] database: Cache Description --- src/database/database-description.vala | 26 ++++++++++++ src/database/database-game.vala | 4 +- src/database/database-metadata.vala | 58 +++++++++++++++++++++++++- src/database/database.vala | 1 + src/meson.build | 1 + 5 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 src/database/database-description.vala diff --git a/src/database/database-description.vala b/src/database/database-description.vala new file mode 100644 index 00000000..7c786ff8 --- /dev/null +++ b/src/database/database-description.vala @@ -0,0 +1,26 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabaseDescription : Object, Description { + private DatabaseMetadata metadata; + + public bool has_loaded { get; protected set; } + + public DatabaseDescription (DatabaseMetadata metadata) { + this.metadata = metadata; + + if (metadata.description_loaded) + has_loaded = true; + else { + metadata.notify["description-loaded"].connect (on_description_loaded); + metadata.get_description (); + } + } + + private void on_description_loaded (Object object, ParamSpec param) { + has_loaded = metadata.description_loaded; + } + + public string get_description () { + return metadata.get_description (); + } +} diff --git a/src/database/database-game.vala b/src/database/database-game.vala index a98893f1..fffdb776 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -9,6 +9,7 @@ private class Games.DatabaseGame : Object, Game { private Game game; private Cooperative cooperative; + private Description description; private Developer developer; public DatabaseGame (Database database, Game game) { @@ -18,6 +19,7 @@ private class Games.DatabaseGame : Object, Game { var metadata = database.get_metadata (game); cooperative = new DatabaseCooperative (metadata); + description = new DatabaseDescription (metadata); developer = new DatabaseDeveloper (metadata); } @@ -58,7 +60,7 @@ private class Games.DatabaseGame : Object, Game { } public Description get_description () { - return game.get_description (); + return description; } public Rating get_rating () { diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala index 5d62a2e2..d15ef0e8 100644 --- a/src/database/database-metadata.vala +++ b/src/database/database-metadata.vala @@ -2,7 +2,11 @@ private class Games.DatabaseMetadata : Object { private const string LOAD_QUERY = """ - SELECT cooperative, developer FROM game_metadata WHERE uid=$UID; + SELECT + cooperative, + description, + developer + FROM game_metadata WHERE uid=$UID; """; private const string ADD_GAME_QUERY = """ @@ -13,6 +17,10 @@ private class Games.DatabaseMetadata : Object { UPDATE game_metadata SET cooperative=$COOPERATIVE WHERE uid=$UID; """; + private const string SAVE_DESCRIPTION_QUERY = """ + UPDATE game_metadata SET description=$DESCRIPTION WHERE uid=$UID; + """; + private const string SAVE_DEVELOPER_QUERY = """ UPDATE game_metadata SET developer=$DEVELOPER WHERE uid=$UID; """; @@ -20,18 +28,22 @@ private class Games.DatabaseMetadata : Object { private Game game; private Uid uid; private Cooperative cooperative; + private Description description; private Developer developer; private string uid_value; private bool cooperative_value; + private string description_value; private string developer_value; private Sqlite.Statement add_game_statement; private Sqlite.Statement load_statement; private Sqlite.Statement save_cooperative_statement; + private Sqlite.Statement save_description_statement; private Sqlite.Statement save_developer_statement; public bool cooperative_loaded { get; set; } + public bool description_loaded { get; set; } public bool developer_loaded { get; set; } private bool game_added; @@ -41,6 +53,7 @@ private class Games.DatabaseMetadata : Object { uid = game.get_uid (); cooperative = game.get_cooperative (); + description = game.get_description (); developer = game.get_developer (); try { @@ -49,6 +62,7 @@ private class Games.DatabaseMetadata : Object { add_game_statement = Database.prepare (database, ADD_GAME_QUERY); load_statement = Database.prepare (database, LOAD_QUERY); save_cooperative_statement = Database.prepare (database, SAVE_COOPERATIVE_QUERY); + save_description_statement = Database.prepare (database, SAVE_DESCRIPTION_QUERY); save_developer_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); load_metadata (); @@ -68,6 +82,16 @@ private class Games.DatabaseMetadata : Object { return cooperative_value; } + public string get_description () { + if (!description_loaded) { + on_description_loaded (); + description.notify.connect (on_description_loaded); + return description.get_description (); + } + + return description_value; + } + public string get_developer () { if (!developer_loaded) { on_developer_loaded (); @@ -89,6 +113,17 @@ private class Games.DatabaseMetadata : Object { save_cooperative (); } + private void on_description_loaded () { + if (!description.has_loaded) + return; + + description_value = description.get_description (); + description_loaded = true; + + add_game (); + save_description (); + } + private void on_developer_loaded () { if (!developer.has_loaded) return; @@ -114,6 +149,20 @@ private class Games.DatabaseMetadata : Object { } } + private void save_description () { + try { + save_description_statement.reset (); + Database.bind_text (save_description_statement, "$UID", uid_value); + Database.bind_text (save_description_statement, "$DESCRIPTION", description_value); + + if (save_description_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + private void save_developer () { try { save_developer_statement.reset (); @@ -159,7 +208,12 @@ private class Games.DatabaseMetadata : Object { } if (load_statement.column_type (1) != Sqlite.NULL) { - developer_value = load_statement.column_text (1); + description_value = load_statement.column_text (1); + description_loaded = true; + } + + if (load_statement.column_type (2) != Sqlite.NULL) { + developer_value = load_statement.column_text (2); developer_loaded = true; } } diff --git a/src/database/database.vala b/src/database/database.vala index 57c3c8a2..431f0096 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -22,6 +22,7 @@ private class Games.Database : Object { CREATE TABLE IF NOT EXISTS game_metadata ( uid TEXT PRIMARY KEY NOT NULL, cooperative INTEGER, + description TEXT, developer TEXT ) WITHOUT ROWID; """; diff --git a/src/meson.build b/src/meson.build index a2c72691..cf195219 100644 --- a/src/meson.build +++ b/src/meson.build @@ -47,6 +47,7 @@ vala_sources = [ 'database/database.vala', 'database/database-cooperative.vala', + 'database/database-description.vala', 'database/database-developer.vala', 'database/database-error.vala', 'database/database-game.vala', -- GitLab From 4024c5633aea05900f2f8efacf53f1218ca9ff0c Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sat, 6 Oct 2018 13:25:52 +0500 Subject: [PATCH 18/23] database: Cache Genre Handle serialization and deserialization of genre lists via Variant. --- src/database/database-game.vala | 4 +- src/database/database-genre.vala | 26 +++++++++++++ src/database/database-metadata.vala | 59 ++++++++++++++++++++++++++++- src/database/database.vala | 3 +- src/meson.build | 1 + 5 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/database/database-genre.vala diff --git a/src/database/database-game.vala b/src/database/database-game.vala index fffdb776..1e612e92 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -11,6 +11,7 @@ private class Games.DatabaseGame : Object, Game { private Cooperative cooperative; private Description description; private Developer developer; + private Genre genre; public DatabaseGame (Database database, Game game) { this.database = database; @@ -21,6 +22,7 @@ private class Games.DatabaseGame : Object, Game { cooperative = new DatabaseCooperative (metadata); description = new DatabaseDescription (metadata); developer = new DatabaseDeveloper (metadata); + genre = new DatabaseGenre (metadata); } public Uid get_uid () { @@ -44,7 +46,7 @@ private class Games.DatabaseGame : Object, Game { } public Genre get_genre () { - return game.get_genre (); + return genre; } public Players get_players () { diff --git a/src/database/database-genre.vala b/src/database/database-genre.vala new file mode 100644 index 00000000..4ab21334 --- /dev/null +++ b/src/database/database-genre.vala @@ -0,0 +1,26 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabaseGenre : Object, Genre { + private DatabaseMetadata metadata; + + public bool has_loaded { get; protected set; } + + public DatabaseGenre (DatabaseMetadata metadata) { + this.metadata = metadata; + + if (metadata.genre_loaded) + has_loaded = true; + else { + metadata.notify["genre-loaded"].connect (on_genre_loaded); + metadata.get_genre (); + } + } + + private void on_genre_loaded (Object object, ParamSpec param) { + has_loaded = metadata.genre_loaded; + } + + public unowned string[] get_genre () { + return metadata.get_genre (); + } +} diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala index d15ef0e8..4058bdbc 100644 --- a/src/database/database-metadata.vala +++ b/src/database/database-metadata.vala @@ -5,7 +5,8 @@ private class Games.DatabaseMetadata : Object { SELECT cooperative, description, - developer + developer, + genre FROM game_metadata WHERE uid=$UID; """; @@ -25,26 +26,34 @@ private class Games.DatabaseMetadata : Object { UPDATE game_metadata SET developer=$DEVELOPER WHERE uid=$UID; """; + private const string SAVE_GENRE_QUERY = """ + UPDATE game_metadata SET genre=$GENRE WHERE uid=$UID; + """; + private Game game; private Uid uid; private Cooperative cooperative; private Description description; private Developer developer; + private Genre genre; private string uid_value; private bool cooperative_value; private string description_value; private string developer_value; + private string[] genre_value; private Sqlite.Statement add_game_statement; private Sqlite.Statement load_statement; private Sqlite.Statement save_cooperative_statement; private Sqlite.Statement save_description_statement; private Sqlite.Statement save_developer_statement; + private Sqlite.Statement save_genre_statement; public bool cooperative_loaded { get; set; } public bool description_loaded { get; set; } public bool developer_loaded { get; set; } + public bool genre_loaded { get; set; } private bool game_added; @@ -55,6 +64,7 @@ private class Games.DatabaseMetadata : Object { cooperative = game.get_cooperative (); description = game.get_description (); developer = game.get_developer (); + genre = game.get_genre (); try { uid_value = game.get_uid ().get_uid (); @@ -64,6 +74,7 @@ private class Games.DatabaseMetadata : Object { save_cooperative_statement = Database.prepare (database, SAVE_COOPERATIVE_QUERY); save_description_statement = Database.prepare (database, SAVE_DESCRIPTION_QUERY); save_developer_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); + save_genre_statement = Database.prepare (database, SAVE_GENRE_QUERY); load_metadata (); } @@ -102,6 +113,16 @@ private class Games.DatabaseMetadata : Object { return developer_value; } + public unowned string[] get_genre () { + if (!genre_loaded) { + on_genre_loaded (); + genre.notify.connect (on_genre_loaded); + return genre.get_genre (); + } + + return genre_value; + } + private void on_cooperative_loaded () { if (!cooperative.has_loaded) return; @@ -135,6 +156,17 @@ private class Games.DatabaseMetadata : Object { save_developer (); } + private void on_genre_loaded () { + if (!genre.has_loaded) + return; + + genre_value = genre.get_genre ().copy (); + genre_loaded = true; + + add_game (); + save_genre (); + } + private void save_cooperative () { try { save_cooperative_statement.reset (); @@ -177,6 +209,23 @@ private class Games.DatabaseMetadata : Object { } } + private void save_genre () { + try { + var variant = new Variant.strv (genre_value); + var string_value = variant.print (false); + + save_genre_statement.reset (); + Database.bind_text (save_genre_statement, "$UID", uid_value); + Database.bind_text (save_genre_statement, "$GENRE", string_value); + + if (save_genre_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + private void add_game () { if (game_added) return; @@ -216,6 +265,14 @@ private class Games.DatabaseMetadata : Object { developer_value = load_statement.column_text (2); developer_loaded = true; } + + if (load_statement.column_type (3) != Sqlite.NULL) { + var string_value = load_statement.column_text (3); + var variant = Variant.parse (VariantType.STRING_ARRAY, string_value); + genre_value = variant.get_strv (); + + genre_loaded = true; + } } } } diff --git a/src/database/database.vala b/src/database/database.vala index 431f0096..bf4cb54b 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -23,7 +23,8 @@ private class Games.Database : Object { uid TEXT PRIMARY KEY NOT NULL, cooperative INTEGER, description TEXT, - developer TEXT + developer TEXT, + genre TEXT ) WITHOUT ROWID; """; diff --git a/src/meson.build b/src/meson.build index cf195219..1203d2e5 100644 --- a/src/meson.build +++ b/src/meson.build @@ -51,6 +51,7 @@ vala_sources = [ 'database/database-developer.vala', 'database/database-error.vala', 'database/database-game.vala', + 'database/database-genre.vala', 'database/database-metadata.vala', 'database/database-uri-iterator.vala', 'database/database-uri-source.vala', -- GitLab From 212125c25f96533abfa955b497bd12629eb5127b Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sat, 6 Oct 2018 13:32:04 +0500 Subject: [PATCH 19/23] database: Cache Players --- src/database/database-game.vala | 4 ++- src/database/database-metadata.vala | 53 ++++++++++++++++++++++++++++- src/database/database-players.vala | 26 ++++++++++++++ src/database/database.vala | 3 +- src/meson.build | 1 + 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 src/database/database-players.vala diff --git a/src/database/database-game.vala b/src/database/database-game.vala index 1e612e92..1f0ea147 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -12,6 +12,7 @@ private class Games.DatabaseGame : Object, Game { private Description description; private Developer developer; private Genre genre; + private Players players; public DatabaseGame (Database database, Game game) { this.database = database; @@ -23,6 +24,7 @@ private class Games.DatabaseGame : Object, Game { description = new DatabaseDescription (metadata); developer = new DatabaseDeveloper (metadata); genre = new DatabaseGenre (metadata); + players = new DatabasePlayers (metadata); } public Uid get_uid () { @@ -50,7 +52,7 @@ private class Games.DatabaseGame : Object, Game { } public Players get_players () { - return game.get_players (); + return players; } public Developer get_developer () { diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala index 4058bdbc..3c3fcadb 100644 --- a/src/database/database-metadata.vala +++ b/src/database/database-metadata.vala @@ -6,7 +6,8 @@ private class Games.DatabaseMetadata : Object { cooperative, description, developer, - genre + genre, + players FROM game_metadata WHERE uid=$UID; """; @@ -30,18 +31,24 @@ private class Games.DatabaseMetadata : Object { UPDATE game_metadata SET genre=$GENRE WHERE uid=$UID; """; + private const string SAVE_PLAYERS_QUERY = """ + UPDATE game_metadata SET players=$PLAYERS WHERE uid=$UID; + """; + private Game game; private Uid uid; private Cooperative cooperative; private Description description; private Developer developer; private Genre genre; + private Players players; private string uid_value; private bool cooperative_value; private string description_value; private string developer_value; private string[] genre_value; + private string players_value; private Sqlite.Statement add_game_statement; private Sqlite.Statement load_statement; @@ -49,11 +56,13 @@ private class Games.DatabaseMetadata : Object { private Sqlite.Statement save_description_statement; private Sqlite.Statement save_developer_statement; private Sqlite.Statement save_genre_statement; + private Sqlite.Statement save_players_statement; public bool cooperative_loaded { get; set; } public bool description_loaded { get; set; } public bool developer_loaded { get; set; } public bool genre_loaded { get; set; } + public bool players_loaded { get; set; } private bool game_added; @@ -65,6 +74,7 @@ private class Games.DatabaseMetadata : Object { description = game.get_description (); developer = game.get_developer (); genre = game.get_genre (); + players = game.get_players (); try { uid_value = game.get_uid ().get_uid (); @@ -75,6 +85,7 @@ private class Games.DatabaseMetadata : Object { save_description_statement = Database.prepare (database, SAVE_DESCRIPTION_QUERY); save_developer_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); save_genre_statement = Database.prepare (database, SAVE_GENRE_QUERY); + save_players_statement = Database.prepare (database, SAVE_PLAYERS_QUERY); load_metadata (); } @@ -123,6 +134,16 @@ private class Games.DatabaseMetadata : Object { return genre_value; } + public string get_players () { + if (!players_loaded) { + on_players_loaded (); + players.notify.connect (on_players_loaded); + return players.get_players (); + } + + return players_value; + } + private void on_cooperative_loaded () { if (!cooperative.has_loaded) return; @@ -167,6 +188,17 @@ private class Games.DatabaseMetadata : Object { save_genre (); } + private void on_players_loaded () { + if (!players.has_loaded) + return; + + players_value = players.get_players (); + players_loaded = true; + + add_game (); + save_players (); + } + private void save_cooperative () { try { save_cooperative_statement.reset (); @@ -226,6 +258,20 @@ private class Games.DatabaseMetadata : Object { } } + private void save_players () { + try { + save_players_statement.reset (); + Database.bind_text (save_players_statement, "$UID", uid_value); + Database.bind_text (save_players_statement, "$PLAYERS", players_value); + + if (save_players_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + private void add_game () { if (game_added) return; @@ -273,6 +319,11 @@ private class Games.DatabaseMetadata : Object { genre_loaded = true; } + + if (load_statement.column_type (4) != Sqlite.NULL) { + players_value = load_statement.column_text (4); + players_loaded = true; + } } } } diff --git a/src/database/database-players.vala b/src/database/database-players.vala new file mode 100644 index 00000000..be79af76 --- /dev/null +++ b/src/database/database-players.vala @@ -0,0 +1,26 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabasePlayers : Object, Players { + private DatabaseMetadata metadata; + + public bool has_loaded { get; protected set; } + + public DatabasePlayers (DatabaseMetadata metadata) { + this.metadata = metadata; + + if (metadata.players_loaded) + has_loaded = true; + else { + metadata.notify["players-loaded"].connect (on_players_loaded); + metadata.get_players (); + } + } + + private void on_players_loaded (Object object, ParamSpec param) { + has_loaded = metadata.players_loaded; + } + + public string get_players () { + return metadata.get_players (); + } +} diff --git a/src/database/database.vala b/src/database/database.vala index bf4cb54b..96a7fbae 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -24,7 +24,8 @@ private class Games.Database : Object { cooperative INTEGER, description TEXT, developer TEXT, - genre TEXT + genre TEXT, + players TEXT ) WITHOUT ROWID; """; diff --git a/src/meson.build b/src/meson.build index 1203d2e5..734474d9 100644 --- a/src/meson.build +++ b/src/meson.build @@ -53,6 +53,7 @@ vala_sources = [ 'database/database-game.vala', 'database/database-genre.vala', 'database/database-metadata.vala', + 'database/database-players.vala', 'database/database-uri-iterator.vala', 'database/database-uri-source.vala', -- GitLab From ccde82ce94ab7db95b0b8c4b05857389f7193964 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sat, 6 Oct 2018 13:39:02 +0500 Subject: [PATCH 20/23] database: Cache Publisher --- src/database/database-game.vala | 4 ++- src/database/database-metadata.vala | 53 +++++++++++++++++++++++++++- src/database/database-publisher.vala | 26 ++++++++++++++ src/database/database.vala | 3 +- src/meson.build | 1 + 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 src/database/database-publisher.vala diff --git a/src/database/database-game.vala b/src/database/database-game.vala index 1f0ea147..e238c31f 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -13,6 +13,7 @@ private class Games.DatabaseGame : Object, Game { private Developer developer; private Genre genre; private Players players; + private Publisher publisher; public DatabaseGame (Database database, Game game) { this.database = database; @@ -25,6 +26,7 @@ private class Games.DatabaseGame : Object, Game { developer = new DatabaseDeveloper (metadata); genre = new DatabaseGenre (metadata); players = new DatabasePlayers (metadata); + publisher = new DatabasePublisher (metadata); } public Uid get_uid () { @@ -60,7 +62,7 @@ private class Games.DatabaseGame : Object, Game { } public Publisher get_publisher () { - return game.get_publisher (); + return publisher; } public Description get_description () { diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala index 3c3fcadb..180ae570 100644 --- a/src/database/database-metadata.vala +++ b/src/database/database-metadata.vala @@ -7,7 +7,8 @@ private class Games.DatabaseMetadata : Object { description, developer, genre, - players + players, + publisher FROM game_metadata WHERE uid=$UID; """; @@ -35,6 +36,10 @@ private class Games.DatabaseMetadata : Object { UPDATE game_metadata SET players=$PLAYERS WHERE uid=$UID; """; + private const string SAVE_PUBLISHER_QUERY = """ + UPDATE game_metadata SET publisher=$PUBLISHER WHERE uid=$UID; + """; + private Game game; private Uid uid; private Cooperative cooperative; @@ -42,6 +47,7 @@ private class Games.DatabaseMetadata : Object { private Developer developer; private Genre genre; private Players players; + private Publisher publisher; private string uid_value; private bool cooperative_value; @@ -49,6 +55,7 @@ private class Games.DatabaseMetadata : Object { private string developer_value; private string[] genre_value; private string players_value; + private string publisher_value; private Sqlite.Statement add_game_statement; private Sqlite.Statement load_statement; @@ -57,12 +64,14 @@ private class Games.DatabaseMetadata : Object { private Sqlite.Statement save_developer_statement; private Sqlite.Statement save_genre_statement; private Sqlite.Statement save_players_statement; + private Sqlite.Statement save_publisher_statement; public bool cooperative_loaded { get; set; } public bool description_loaded { get; set; } public bool developer_loaded { get; set; } public bool genre_loaded { get; set; } public bool players_loaded { get; set; } + public bool publisher_loaded { get; set; } private bool game_added; @@ -75,6 +84,7 @@ private class Games.DatabaseMetadata : Object { developer = game.get_developer (); genre = game.get_genre (); players = game.get_players (); + publisher = game.get_publisher (); try { uid_value = game.get_uid ().get_uid (); @@ -86,6 +96,7 @@ private class Games.DatabaseMetadata : Object { save_developer_statement = Database.prepare (database, SAVE_DEVELOPER_QUERY); save_genre_statement = Database.prepare (database, SAVE_GENRE_QUERY); save_players_statement = Database.prepare (database, SAVE_PLAYERS_QUERY); + save_publisher_statement = Database.prepare (database, SAVE_PUBLISHER_QUERY); load_metadata (); } @@ -144,6 +155,16 @@ private class Games.DatabaseMetadata : Object { return players_value; } + public string get_publisher () { + if (!publisher_loaded) { + on_publisher_loaded (); + publisher.notify.connect (on_publisher_loaded); + return publisher.get_publisher (); + } + + return publisher_value; + } + private void on_cooperative_loaded () { if (!cooperative.has_loaded) return; @@ -199,6 +220,17 @@ private class Games.DatabaseMetadata : Object { save_players (); } + private void on_publisher_loaded () { + if (!publisher.has_loaded) + return; + + publisher_value = publisher.get_publisher (); + publisher_loaded = true; + + add_game (); + save_publisher (); + } + private void save_cooperative () { try { save_cooperative_statement.reset (); @@ -272,6 +304,20 @@ private class Games.DatabaseMetadata : Object { } } + private void save_publisher () { + try { + save_publisher_statement.reset (); + Database.bind_text (save_publisher_statement, "$UID", uid_value); + Database.bind_text (save_publisher_statement, "$PUBLISHER", publisher_value); + + if (save_publisher_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + private void add_game () { if (game_added) return; @@ -324,6 +370,11 @@ private class Games.DatabaseMetadata : Object { players_value = load_statement.column_text (4); players_loaded = true; } + + if (load_statement.column_type (5) != Sqlite.NULL) { + publisher_value = load_statement.column_text (5); + publisher_loaded = true; + } } } } diff --git a/src/database/database-publisher.vala b/src/database/database-publisher.vala new file mode 100644 index 00000000..c19bc48a --- /dev/null +++ b/src/database/database-publisher.vala @@ -0,0 +1,26 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabasePublisher : Object, Publisher { + private DatabaseMetadata metadata; + + public bool has_loaded { get; protected set; } + + public DatabasePublisher (DatabaseMetadata metadata) { + this.metadata = metadata; + + if (metadata.publisher_loaded) + has_loaded = true; + else { + metadata.notify["publisher-loaded"].connect (on_publisher_loaded); + metadata.get_publisher (); + } + } + + private void on_publisher_loaded (Object object, ParamSpec param) { + has_loaded = metadata.publisher_loaded; + } + + public string get_publisher () { + return metadata.get_publisher (); + } +} diff --git a/src/database/database.vala b/src/database/database.vala index 96a7fbae..94ddfee5 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -25,7 +25,8 @@ private class Games.Database : Object { description TEXT, developer TEXT, genre TEXT, - players TEXT + players TEXT, + publisher TEXT ) WITHOUT ROWID; """; diff --git a/src/meson.build b/src/meson.build index 734474d9..e3c2c38e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -54,6 +54,7 @@ vala_sources = [ 'database/database-genre.vala', 'database/database-metadata.vala', 'database/database-players.vala', + 'database/database-publisher.vala', 'database/database-uri-iterator.vala', 'database/database-uri-source.vala', -- GitLab From 75b781be97719cf3793f86828df3494a7b7056e3 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sat, 6 Oct 2018 13:59:45 +0500 Subject: [PATCH 21/23] database: Cache Rating --- src/database/database-game.vala | 4 ++- src/database/database-metadata.vala | 53 ++++++++++++++++++++++++++++- src/database/database-rating.vala | 26 ++++++++++++++ src/database/database.vala | 11 +++++- src/meson.build | 1 + 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 src/database/database-rating.vala diff --git a/src/database/database-game.vala b/src/database/database-game.vala index e238c31f..816f70df 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -14,6 +14,7 @@ private class Games.DatabaseGame : Object, Game { private Genre genre; private Players players; private Publisher publisher; + private Rating rating; public DatabaseGame (Database database, Game game) { this.database = database; @@ -27,6 +28,7 @@ private class Games.DatabaseGame : Object, Game { genre = new DatabaseGenre (metadata); players = new DatabasePlayers (metadata); publisher = new DatabasePublisher (metadata); + rating = new DatabaseRating (metadata); } public Uid get_uid () { @@ -70,7 +72,7 @@ private class Games.DatabaseGame : Object, Game { } public Rating get_rating () { - return game.get_rating (); + return rating; } public Platform get_platform () { diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala index 180ae570..13d7d423 100644 --- a/src/database/database-metadata.vala +++ b/src/database/database-metadata.vala @@ -8,7 +8,8 @@ private class Games.DatabaseMetadata : Object { developer, genre, players, - publisher + publisher, + rating FROM game_metadata WHERE uid=$UID; """; @@ -40,6 +41,10 @@ private class Games.DatabaseMetadata : Object { UPDATE game_metadata SET publisher=$PUBLISHER WHERE uid=$UID; """; + private const string SAVE_RATING_QUERY = """ + UPDATE game_metadata SET rating=$RATING WHERE uid=$UID; + """; + private Game game; private Uid uid; private Cooperative cooperative; @@ -48,6 +53,7 @@ private class Games.DatabaseMetadata : Object { private Genre genre; private Players players; private Publisher publisher; + private Rating rating; private string uid_value; private bool cooperative_value; @@ -56,6 +62,7 @@ private class Games.DatabaseMetadata : Object { private string[] genre_value; private string players_value; private string publisher_value; + private float rating_value; private Sqlite.Statement add_game_statement; private Sqlite.Statement load_statement; @@ -65,6 +72,7 @@ private class Games.DatabaseMetadata : Object { private Sqlite.Statement save_genre_statement; private Sqlite.Statement save_players_statement; private Sqlite.Statement save_publisher_statement; + private Sqlite.Statement save_rating_statement; public bool cooperative_loaded { get; set; } public bool description_loaded { get; set; } @@ -72,6 +80,7 @@ private class Games.DatabaseMetadata : Object { public bool genre_loaded { get; set; } public bool players_loaded { get; set; } public bool publisher_loaded { get; set; } + public bool rating_loaded { get; set; } private bool game_added; @@ -85,6 +94,7 @@ private class Games.DatabaseMetadata : Object { genre = game.get_genre (); players = game.get_players (); publisher = game.get_publisher (); + rating = game.get_rating (); try { uid_value = game.get_uid ().get_uid (); @@ -97,6 +107,7 @@ private class Games.DatabaseMetadata : Object { save_genre_statement = Database.prepare (database, SAVE_GENRE_QUERY); save_players_statement = Database.prepare (database, SAVE_PLAYERS_QUERY); save_publisher_statement = Database.prepare (database, SAVE_PUBLISHER_QUERY); + save_rating_statement = Database.prepare (database, SAVE_RATING_QUERY); load_metadata (); } @@ -165,6 +176,16 @@ private class Games.DatabaseMetadata : Object { return publisher_value; } + public float get_rating () { + if (!rating_loaded) { + on_rating_loaded (); + rating.notify.connect (on_rating_loaded); + return rating.get_rating (); + } + + return rating_value; + } + private void on_cooperative_loaded () { if (!cooperative.has_loaded) return; @@ -231,6 +252,17 @@ private class Games.DatabaseMetadata : Object { save_publisher (); } + private void on_rating_loaded () { + if (!rating.has_loaded) + return; + + rating_value = rating.get_rating (); + rating_loaded = true; + + add_game (); + save_rating (); + } + private void save_cooperative () { try { save_cooperative_statement.reset (); @@ -318,6 +350,20 @@ private class Games.DatabaseMetadata : Object { } } + private void save_rating () { + try { + save_rating_statement.reset (); + Database.bind_text (save_rating_statement, "$UID", uid_value); + Database.bind_double (save_rating_statement, "$RATING", rating_value); + + if (save_rating_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + private void add_game () { if (game_added) return; @@ -375,6 +421,11 @@ private class Games.DatabaseMetadata : Object { publisher_value = load_statement.column_text (5); publisher_loaded = true; } + + if (load_statement.column_type (6) != Sqlite.NULL) { + rating_value = (float) load_statement.column_double (6); + rating_loaded = true; + } } } } diff --git a/src/database/database-rating.vala b/src/database/database-rating.vala new file mode 100644 index 00000000..a4e9e9c0 --- /dev/null +++ b/src/database/database-rating.vala @@ -0,0 +1,26 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabaseRating : Object, Rating { + private DatabaseMetadata metadata; + + public bool has_loaded { get; protected set; } + + public DatabaseRating (DatabaseMetadata metadata) { + this.metadata = metadata; + + if (metadata.rating_loaded) + has_loaded = true; + else { + metadata.notify["rating-loaded"].connect (on_rating_loaded); + metadata.get_rating (); + } + } + + private void on_rating_loaded (Object object, ParamSpec param) { + has_loaded = metadata.rating_loaded; + } + + public float get_rating () { + return metadata.get_rating (); + } +} diff --git a/src/database/database.vala b/src/database/database.vala index 94ddfee5..8256aed1 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -26,7 +26,8 @@ private class Games.Database : Object { developer TEXT, genre TEXT, players TEXT, - publisher TEXT + publisher TEXT, + rating REAL ) WITHOUT ROWID; """; @@ -92,6 +93,14 @@ private class Games.Database : Object { return statement; } + internal static void bind_double (Sqlite.Statement statement, string parameter, double val) throws Error { + var position = statement.bind_parameter_index (parameter); + if (position <= 0) + throw new DatabaseError.BINDING_FAILED ("Couldn't bind double to the parameter ā€œ%sā€, unexpected position: %d.", parameter, position); + + statement.bind_double (position, val); + } + internal static void bind_int (Sqlite.Statement statement, string parameter, int val) throws Error { var position = statement.bind_parameter_index (parameter); if (position <= 0) diff --git a/src/meson.build b/src/meson.build index e3c2c38e..47752e2b 100644 --- a/src/meson.build +++ b/src/meson.build @@ -55,6 +55,7 @@ vala_sources = [ 'database/database-metadata.vala', 'database/database-players.vala', 'database/database-publisher.vala', + 'database/database-rating.vala', 'database/database-uri-iterator.vala', 'database/database-uri-source.vala', -- GitLab From bc24933ddd6324b285a41127ba5d234111d7f6a6 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sat, 6 Oct 2018 14:21:07 +0500 Subject: [PATCH 22/23] database: Cache ReleaseDate Represent DateTime as ISO 8601 strings. --- src/database/database-game.vala | 4 +- src/database/database-metadata.vala | 64 ++++++++++++++++++++++++- src/database/database-release-date.vala | 26 ++++++++++ src/database/database.vala | 3 +- src/meson.build | 1 + 5 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 src/database/database-release-date.vala diff --git a/src/database/database-game.vala b/src/database/database-game.vala index 816f70df..af2526e2 100644 --- a/src/database/database-game.vala +++ b/src/database/database-game.vala @@ -15,6 +15,7 @@ private class Games.DatabaseGame : Object, Game { private Players players; private Publisher publisher; private Rating rating; + private ReleaseDate release_date; public DatabaseGame (Database database, Game game) { this.database = database; @@ -29,6 +30,7 @@ private class Games.DatabaseGame : Object, Game { players = new DatabasePlayers (metadata); publisher = new DatabasePublisher (metadata); rating = new DatabaseRating (metadata); + release_date = new DatabaseReleaseDate (metadata); } public Uid get_uid () { @@ -44,7 +46,7 @@ private class Games.DatabaseGame : Object, Game { } public ReleaseDate get_release_date () { - return game.get_release_date (); + return release_date; } public Cooperative get_cooperative () { diff --git a/src/database/database-metadata.vala b/src/database/database-metadata.vala index 13d7d423..8ef24d4d 100644 --- a/src/database/database-metadata.vala +++ b/src/database/database-metadata.vala @@ -9,7 +9,8 @@ private class Games.DatabaseMetadata : Object { genre, players, publisher, - rating + rating, + release_date FROM game_metadata WHERE uid=$UID; """; @@ -45,6 +46,10 @@ private class Games.DatabaseMetadata : Object { UPDATE game_metadata SET rating=$RATING WHERE uid=$UID; """; + private const string SAVE_RELEASE_DATE_QUERY = """ + UPDATE game_metadata SET release_date=$RELEASE_DATE WHERE uid=$UID; + """; + private Game game; private Uid uid; private Cooperative cooperative; @@ -54,6 +59,7 @@ private class Games.DatabaseMetadata : Object { private Players players; private Publisher publisher; private Rating rating; + private ReleaseDate release_date; private string uid_value; private bool cooperative_value; @@ -63,6 +69,7 @@ private class Games.DatabaseMetadata : Object { private string players_value; private string publisher_value; private float rating_value; + private DateTime release_date_value; private Sqlite.Statement add_game_statement; private Sqlite.Statement load_statement; @@ -73,6 +80,7 @@ private class Games.DatabaseMetadata : Object { private Sqlite.Statement save_players_statement; private Sqlite.Statement save_publisher_statement; private Sqlite.Statement save_rating_statement; + private Sqlite.Statement save_release_date_statement; public bool cooperative_loaded { get; set; } public bool description_loaded { get; set; } @@ -81,6 +89,7 @@ private class Games.DatabaseMetadata : Object { public bool players_loaded { get; set; } public bool publisher_loaded { get; set; } public bool rating_loaded { get; set; } + public bool release_date_loaded { get; set; } private bool game_added; @@ -95,6 +104,7 @@ private class Games.DatabaseMetadata : Object { players = game.get_players (); publisher = game.get_publisher (); rating = game.get_rating (); + release_date = game.get_release_date (); try { uid_value = game.get_uid ().get_uid (); @@ -108,6 +118,7 @@ private class Games.DatabaseMetadata : Object { save_players_statement = Database.prepare (database, SAVE_PLAYERS_QUERY); save_publisher_statement = Database.prepare (database, SAVE_PUBLISHER_QUERY); save_rating_statement = Database.prepare (database, SAVE_RATING_QUERY); + save_release_date_statement = Database.prepare (database, SAVE_RELEASE_DATE_QUERY); load_metadata (); } @@ -186,6 +197,16 @@ private class Games.DatabaseMetadata : Object { return rating_value; } + public DateTime get_release_date () { + if (!release_date_loaded) { + on_release_date_loaded (); + release_date.notify.connect (on_release_date_loaded); + return release_date.get_release_date (); + } + + return release_date_value; + } + private void on_cooperative_loaded () { if (!cooperative.has_loaded) return; @@ -263,6 +284,17 @@ private class Games.DatabaseMetadata : Object { save_rating (); } + private void on_release_date_loaded () { + if (!release_date.has_loaded) + return; + + release_date_value = release_date.get_release_date (); + release_date_loaded = true; + + add_game (); + save_release_date (); + } + private void save_cooperative () { try { save_cooperative_statement.reset (); @@ -364,6 +396,24 @@ private class Games.DatabaseMetadata : Object { } } + private void save_release_date () { + try { + var string_value = ""; + if (release_date_value != null) + string_value = release_date_value.format ("%F"); + + save_release_date_statement.reset (); + Database.bind_text (save_release_date_statement, "$UID", uid_value); + Database.bind_text (save_release_date_statement, "$RELEASE_DATE", string_value); + + if (save_release_date_statement.step () != Sqlite.DONE) + warning ("Execution failed."); + } + catch (Error e) { + warning (e.message); + } + } + private void add_game () { if (game_added) return; @@ -426,6 +476,18 @@ private class Games.DatabaseMetadata : Object { rating_value = (float) load_statement.column_double (6); rating_loaded = true; } + + if (load_statement.column_type (7) != Sqlite.NULL) { + var string_value = load_statement.column_text (7); + + if (string_value != "") { + var timezone = new TimeZone.utc (); + + release_date_value = new DateTime.from_iso8601 (string_value, timezone); + } + + release_date_loaded = true; + } } } } diff --git a/src/database/database-release-date.vala b/src/database/database-release-date.vala new file mode 100644 index 00000000..97ce9ed6 --- /dev/null +++ b/src/database/database-release-date.vala @@ -0,0 +1,26 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +private class Games.DatabaseReleaseDate : Object, ReleaseDate { + private DatabaseMetadata metadata; + + public bool has_loaded { get; protected set; } + + public DatabaseReleaseDate (DatabaseMetadata metadata) { + this.metadata = metadata; + + if (metadata.release_date_loaded) + has_loaded = true; + else { + metadata.notify["release-date-loaded"].connect (on_release_date_loaded); + metadata.get_release_date (); + } + } + + private void on_release_date_loaded (Object object, ParamSpec param) { + has_loaded = metadata.release_date_loaded; + } + + public DateTime get_release_date () { + return metadata.get_release_date (); + } +} diff --git a/src/database/database.vala b/src/database/database.vala index 8256aed1..5ce1545a 100644 --- a/src/database/database.vala +++ b/src/database/database.vala @@ -27,7 +27,8 @@ private class Games.Database : Object { genre TEXT, players TEXT, publisher TEXT, - rating REAL + rating REAL, + release_date TEXT ) WITHOUT ROWID; """; diff --git a/src/meson.build b/src/meson.build index 47752e2b..2bb73e11 100644 --- a/src/meson.build +++ b/src/meson.build @@ -56,6 +56,7 @@ vala_sources = [ 'database/database-players.vala', 'database/database-publisher.vala', 'database/database-rating.vala', + 'database/database-release-date.vala', 'database/database-uri-iterator.vala', 'database/database-uri-source.vala', -- GitLab From d6c2b661a15996b4f45503fb0655525702234079 Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Sat, 6 Oct 2018 20:00:58 +0500 Subject: [PATCH 23/23] grilo: Queue loading Put all GriloMedia requests into a global queue and process them one by one. This allows to avoid UI stalling while loading metadata for many games at once at a cost of it taking longer time. --- src/grilo/grilo-cooperative.vala | 2 +- src/grilo/grilo-cover.vala | 2 +- src/grilo/grilo-description.vala | 2 +- src/grilo/grilo-developer.vala | 2 +- src/grilo/grilo-genre.vala | 2 +- src/grilo/grilo-media-queue.vala | 36 +++++++++++++++++++++++++++++++ src/grilo/grilo-media.vala | 10 +++++++++ src/grilo/grilo-players.vala | 2 +- src/grilo/grilo-publisher.vala | 2 +- src/grilo/grilo-rating.vala | 2 +- src/grilo/grilo-release-date.vala | 2 +- src/meson.build | 1 + 12 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 src/grilo/grilo-media-queue.vala diff --git a/src/grilo/grilo-cooperative.vala b/src/grilo/grilo-cooperative.vala index 07393b10..6439b1f3 100644 --- a/src/grilo/grilo-cooperative.vala +++ b/src/grilo/grilo-cooperative.vala @@ -18,7 +18,7 @@ public class Games.GriloCooperative : Object, Cooperative { return cooperative; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return cooperative; } diff --git a/src/grilo/grilo-cover.vala b/src/grilo/grilo-cover.vala index 5736237e..db53bc09 100644 --- a/src/grilo/grilo-cover.vala +++ b/src/grilo/grilo-cover.vala @@ -35,7 +35,7 @@ public class Games.GriloCover : Object, Cover { resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return icon; } diff --git a/src/grilo/grilo-description.vala b/src/grilo/grilo-description.vala index 5b97f02b..eb3bbf14 100644 --- a/src/grilo/grilo-description.vala +++ b/src/grilo/grilo-description.vala @@ -18,7 +18,7 @@ public class Games.GriloDescription : Object, Description { return description; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return description; } diff --git a/src/grilo/grilo-developer.vala b/src/grilo/grilo-developer.vala index 5b1ae94a..5e56fdab 100644 --- a/src/grilo/grilo-developer.vala +++ b/src/grilo/grilo-developer.vala @@ -18,7 +18,7 @@ public class Games.GriloDeveloper : Object, Developer { return developer; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return developer; } diff --git a/src/grilo/grilo-genre.vala b/src/grilo/grilo-genre.vala index 2aa3e24b..28ecbb0b 100644 --- a/src/grilo/grilo-genre.vala +++ b/src/grilo/grilo-genre.vala @@ -18,7 +18,7 @@ public class Games.GriloGenre : Object, Genre { return genre; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return genre; } diff --git a/src/grilo/grilo-media-queue.vala b/src/grilo/grilo-media-queue.vala new file mode 100644 index 00000000..5c9ec814 --- /dev/null +++ b/src/grilo/grilo-media-queue.vala @@ -0,0 +1,36 @@ +// This file is part of GNOME Games. License: GPL-3.0+. + +public class Games.GriloMediaQueue : Object { + private Queue queue; + private GriloMedia current_media; + + private static Once instance; + + construct { + queue = new Queue (); + } + + private static GriloMediaQueue create_instance () { + return new GriloMediaQueue (); + } + + public static unowned GriloMediaQueue get_instance () { + return instance.once (create_instance); + } + + public void append (GriloMedia media) { + queue.push_tail (media); + + if (current_media == null) + load_next_media (); + } + + private void load_next_media () { + if (queue.is_empty ()) + return; + + current_media = queue.pop_head (); + current_media.resolved.connect (load_next_media); + current_media.try_resolve_media (); + } +} diff --git a/src/grilo/grilo-media.vala b/src/grilo/grilo-media.vala index 738cb710..9cec6da9 100644 --- a/src/grilo/grilo-media.vala +++ b/src/grilo/grilo-media.vala @@ -14,6 +14,8 @@ public class Games.GriloMedia : Object { private Grl.Media? media; + private bool queued; + public GriloMedia (Title title, string mime_type) { this.title = title; this.mime_type = mime_type; @@ -51,6 +53,14 @@ public class Games.GriloMedia : Object { } } + public void try_resolve_media_queued () { + if (queued) + return; + + GriloMediaQueue.get_instance ().append (this); + queued = true; + } + internal Grl.Media? get_media () { return media; } diff --git a/src/grilo/grilo-players.vala b/src/grilo/grilo-players.vala index 0cb69d6e..94f3744d 100644 --- a/src/grilo/grilo-players.vala +++ b/src/grilo/grilo-players.vala @@ -18,7 +18,7 @@ public class Games.GriloPlayers : Object, Players { return players; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return players; } diff --git a/src/grilo/grilo-publisher.vala b/src/grilo/grilo-publisher.vala index 035ce95c..3c842469 100644 --- a/src/grilo/grilo-publisher.vala +++ b/src/grilo/grilo-publisher.vala @@ -18,7 +18,7 @@ public class Games.GriloPublisher : Object, Publisher { return publisher; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return publisher; } diff --git a/src/grilo/grilo-rating.vala b/src/grilo/grilo-rating.vala index 4a3a6741..3d1adbfb 100644 --- a/src/grilo/grilo-rating.vala +++ b/src/grilo/grilo-rating.vala @@ -18,7 +18,7 @@ public class Games.GriloRating : Object, Rating { return rating; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return rating; } diff --git a/src/grilo/grilo-release-date.vala b/src/grilo/grilo-release-date.vala index 1be39328..7e309b49 100644 --- a/src/grilo/grilo-release-date.vala +++ b/src/grilo/grilo-release-date.vala @@ -18,7 +18,7 @@ public class Games.GriloReleaseDate : Object, ReleaseDate { return release_date; resolving = true; - media.try_resolve_media (); + media.try_resolve_media_queued (); return release_date; } diff --git a/src/meson.build b/src/meson.build index 2bb73e11..8e9882f0 100644 --- a/src/meson.build +++ b/src/meson.build @@ -106,6 +106,7 @@ vala_sources = [ 'grilo/grilo-developer.vala', 'grilo/grilo-genre.vala', 'grilo/grilo-media.vala', + 'grilo/grilo-media-queue.vala', 'grilo/grilo-players.vala', 'grilo/grilo-publisher.vala', 'grilo/grilo-rating.vala', -- GitLab