From 07b608ab6b2daa5f4cb366716e3aa6ece8a74f39 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 17 Jan 2025 02:07:01 +0100 Subject: Only read screen certificates when we need them. --- src/lib/cinema_list.cc | 36 +++++++++++++++++++----------------- src/lib/cinema_list.h | 8 ++++++-- src/wx/screens_panel.cc | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/lib/cinema_list.cc b/src/lib/cinema_list.cc index ffa11a36c..e4095f1c4 100644 --- a/src/lib/cinema_list.cc +++ b/src/lib/cinema_list.cc @@ -330,25 +330,27 @@ CinemaList::add_screen(CinemaID cinema_id, dcpomatic::Screen const& screen) dcpomatic::Screen -CinemaList::screen_from_result(SQLiteStatement& statement, ScreenID screen_id) const +CinemaList::screen_from_result(SQLiteStatement& statement, ScreenID screen_id, bool with_trusted_devices) const { auto certificate_string = statement.column_text(4); optional certificate = certificate_string.empty() ? optional() : certificate_string; auto recipient_file_string = statement.column_text(5); optional recipient_file = recipient_file_string.empty() ? optional() : recipient_file_string; - SQLiteStatement trusted_devices_statement(_db, _trusted_devices.select("WHERE screen=?")); - trusted_devices_statement.bind_int64(1, screen_id.get()); vector trusted_devices; - trusted_devices_statement.execute([&trusted_devices](SQLiteStatement& statement) { - DCPOMATIC_ASSERT(statement.data_count() == 1); - auto description = statement.column_text(1); - if (boost::algorithm::starts_with(description, "-----BEGIN CERTIFICATE")) { - trusted_devices.push_back(TrustedDevice(dcp::Certificate(description))); - } else { - trusted_devices.push_back(TrustedDevice(description)); - } - }); + if (with_trusted_devices) { + SQLiteStatement trusted_devices_statement(_db, _trusted_devices.select("WHERE screen=?")); + trusted_devices_statement.bind_int64(1, screen_id.get()); + trusted_devices_statement.execute([&trusted_devices](SQLiteStatement& statement) { + DCPOMATIC_ASSERT(statement.data_count() == 3); + auto description = statement.column_text(2); + if (boost::algorithm::starts_with(description, "-----BEGIN CERTIFICATE")) { + trusted_devices.push_back(TrustedDevice(dcp::Certificate(description))); + } else { + trusted_devices.push_back(TrustedDevice(description)); + } + }); + } return dcpomatic::Screen(statement.column_text(2), statement.column_text(3), certificate, recipient_file, trusted_devices); } @@ -364,7 +366,7 @@ CinemaList::screen(ScreenID screen_id) const statement.execute([this, &output, screen_id](SQLiteStatement& statement) { DCPOMATIC_ASSERT(statement.data_count() == 6); - output = screen_from_result(statement, screen_id); + output = screen_from_result(statement, screen_id, true); }); return output; @@ -380,7 +382,7 @@ CinemaList::screens_from_result(SQLiteStatement& statement) const statement.execute([this, &output](SQLiteStatement& statement) { DCPOMATIC_ASSERT(statement.data_count() == 6); ScreenID const screen_id = statement.column_int64(0); - output.push_back({screen_id, screen_from_result(statement, screen_id)}); + output.push_back({screen_id, screen_from_result(statement, screen_id, true)}); }); return output; @@ -483,12 +485,12 @@ CinemaList::unique_utc_offset(std::set const& cinemas_to_check) void -CinemaList::screens(function callback) const +CinemaList::screens(function callback, bool with_trusted_devices) const { SQLiteStatement statement(_db, _screens.select("")); - statement.execute([this, &callback](SQLiteStatement& statement) { + statement.execute([this, &callback, with_trusted_devices](SQLiteStatement& statement) { auto const screen_id = statement.column_int64(0); - callback(statement.column_int64(1), screen_id, screen_from_result(statement, screen_id)); + callback(statement.column_int64(1), screen_id, screen_from_result(statement, screen_id, with_trusted_devices)); }); } diff --git a/src/lib/cinema_list.h b/src/lib/cinema_list.h index 6c1e65017..1e0144f73 100644 --- a/src/lib/cinema_list.h +++ b/src/lib/cinema_list.h @@ -105,12 +105,16 @@ public: std::vector> screens(CinemaID cinema_id) const; std::vector> screens_by_cinema_and_name(CinemaID id, std::string const& name) const; - void screens(std::function callback) const; + /** Call a callback with every screen. + * @param with_trusted_devices true to read screen's trusted devices into the Screen, false to not bother. + */ + void screens(std::function callback, bool with_trusted_devices) const; boost::optional unique_utc_offset(std::set const& cinemas); private: - dcpomatic::Screen screen_from_result(SQLiteStatement& statement, ScreenID screen_id) const; + /** @param with_trusted_devices true to read screen's trusted devices into the Screen, false to not bother */ + dcpomatic::Screen screen_from_result(SQLiteStatement& statement, ScreenID screen_id, bool with_trusted_devices) const; std::vector> screens_from_result(SQLiteStatement& statement) const; void setup_tables(); void setup(boost::filesystem::path db_file); diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index 6de1d86f0..d1b9280d7 100644 --- a/src/wx/screens_panel.cc +++ b/src/wx/screens_panel.cc @@ -534,7 +534,7 @@ ScreensPanel::add_cinemas () _cinema_list.screens([this](CinemaID cinema_id, ScreenID screen_id, Screen const& screen) { add_screen(cinema_id, screen_id, screen); - }); + }, false); } -- cgit v1.2.3