diff --git a/Userland/Services/SQLServer/DatabaseConnection.cpp b/Userland/Services/SQLServer/DatabaseConnection.cpp index 0373962cc0..581b740fb9 100644 --- a/Userland/Services/SQLServer/DatabaseConnection.cpp +++ b/Userland/Services/SQLServer/DatabaseConnection.cpp @@ -13,6 +13,17 @@ namespace SQLServer { static HashMap> s_connections; static SQL::ConnectionID s_next_connection_id = 0; +static ErrorOr> find_or_create_database(StringView database_path, StringView database_name) +{ + for (auto const& connection : s_connections) { + if (connection.value->database_name() == database_name) + return connection.value->database(); + } + + auto database_file = DeprecatedString::formatted("{}/{}.db", database_path, database_name); + return SQL::Database::try_create(move(database_file)); +} + RefPtr DatabaseConnection::connection_for(SQL::ConnectionID connection_id) { if (s_connections.contains(connection_id)) @@ -26,8 +37,7 @@ ErrorOr> DatabaseConnection::create(StringView if (LexicalPath path(database_name); (path.title() != database_name) || (path.dirname() != ".")) return Error::from_string_view("Invalid database name"sv); - auto database_file = DeprecatedString::formatted("{}/{}.db", database_path, database_name); - auto database = SQL::Database::construct(move(database_file)); + auto database = TRY(find_or_create_database(database_path, database_name)); if (auto result = database->open(); result.is_error()) { warnln("Could not open database: {}", result.error().error_string()); diff --git a/Userland/Services/SQLServer/DatabaseConnection.h b/Userland/Services/SQLServer/DatabaseConnection.h index bab3ff87f3..d43e449b2c 100644 --- a/Userland/Services/SQLServer/DatabaseConnection.h +++ b/Userland/Services/SQLServer/DatabaseConnection.h @@ -26,6 +26,7 @@ public: SQL::ConnectionID connection_id() const { return m_connection_id; } int client_id() const { return m_client_id; } NonnullRefPtr database() { return m_database; } + StringView database_name() const { return m_database_name; } void disconnect(); SQL::ResultOr prepare_statement(StringView sql);