From d3624c328f78b7360eb2932d1970aa2826142f2e Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sat, 14 Feb 2026 10:50:11 +0100 Subject: [PATCH] LibDatabase: Allow creating a memory backed database --- Libraries/LibDatabase/Database.cpp | 20 +++++++++++++++----- Libraries/LibDatabase/Database.h | 8 +++++--- Libraries/LibHTTP/Cache/CacheIndex.cpp | 4 +++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Libraries/LibDatabase/Database.cpp b/Libraries/LibDatabase/Database.cpp index 567f3d4150..b6023e0a69 100644 --- a/Libraries/LibDatabase/Database.cpp +++ b/Libraries/LibDatabase/Database.cpp @@ -54,15 +54,25 @@ static constexpr StringView sql_error(int error_code) __ENUMERATE_TYPE(unsigned long long) \ __ENUMERATE_TYPE(bool) +ErrorOr> Database::create_memory_backed() +{ + sqlite3* sql_database { nullptr }; + SQL_TRY(sqlite3_open(":memory:", &sql_database)); + return create(sql_database); +} + ErrorOr> Database::create(ByteString const& directory, StringView name) { TRY(Core::Directory::create(directory, Core::Directory::CreateDirectories::Yes)); LexicalPath database_path { ByteString::formatted("{}/{}.db", directory, name) }; + sqlite3* sql_database { nullptr }; + SQL_TRY(sqlite3_open(database_path.string().characters(), &sql_database)); + return create(sql_database, database_path); +} - sqlite3* m_database { nullptr }; - SQL_TRY(sqlite3_open(database_path.string().characters(), &m_database)); - - auto database = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Database(move(database_path), m_database))); +ErrorOr> Database::create(sqlite3* sql_database, Optional database_path) +{ + auto database = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Database(sql_database, move(database_path)))); // Enable the WAL and set the synchronous pragma to normal by default for performance. TRY(database->set_journal_mode_pragma(JournalMode::WriteAheadLog)); @@ -71,7 +81,7 @@ ErrorOr> Database::create(ByteString const& directory, S return database; } -Database::Database(LexicalPath database_path, sqlite3* database) +Database::Database(sqlite3* database, Optional database_path) : m_database_path(move(database_path)) , m_database(database) { diff --git a/Libraries/LibDatabase/Database.h b/Libraries/LibDatabase/Database.h index dd543f8ee0..00163bb843 100644 --- a/Libraries/LibDatabase/Database.h +++ b/Libraries/LibDatabase/Database.h @@ -23,12 +23,13 @@ namespace Database { class DATABASE_API Database : public RefCounted { public: + static ErrorOr> create_memory_backed(); static ErrorOr> create(ByteString const& directory, StringView name); ~Database(); using OnResult = Function; - LexicalPath const& database_path() const { return m_database_path; } + Optional const& database_path() const { return m_database_path; } ErrorOr prepare_statement(StringView statement); @@ -72,7 +73,8 @@ public: ErrorOr set_synchronous_pragma(Synchronous); private: - Database(LexicalPath, sqlite3*); + static ErrorOr> create(sqlite3*, Optional database_path = {}); + Database(sqlite3*, Optional database_path); void execute_statement_internal(StatementID, OnResult); @@ -87,7 +89,7 @@ private: return m_prepared_statements[statement_id]; } - LexicalPath m_database_path; + Optional m_database_path; sqlite3* m_database { nullptr }; Vector m_prepared_statements; }; diff --git a/Libraries/LibHTTP/Cache/CacheIndex.cpp b/Libraries/LibHTTP/Cache/CacheIndex.cpp index 6fcf54e89b..37d3edf621 100644 --- a/Libraries/LibHTTP/Cache/CacheIndex.cpp +++ b/Libraries/LibHTTP/Cache/CacheIndex.cpp @@ -129,7 +129,9 @@ ErrorOr CacheIndex::create(Database::Database& database) WHERE last_access_time >= ?; )#"sv)); - auto disk_space = TRY(FileSystem::compute_disk_space(database.database_path().parent())); + auto database_path = database.database_path(); + VERIFY(database_path.has_value()); // We assume a disk backed database for CacheIndex. + auto disk_space = TRY(FileSystem::compute_disk_space(database.database_path().value().parent())); auto maximum_disk_cache_size = compute_maximum_disk_cache_size(disk_space.free_bytes); Limits limits {