| 
									
										
										
										
											2024-11-04 18:44:43 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2024, stelar7 <dudedbz@gmail.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 19:01:35 +01:00
										 |  |  | #include <LibWeb/IndexedDB/Internal/ConnectionQueueHandler.h>
 | 
					
						
							| 
									
										
										
										
											2024-11-04 18:44:43 +01:00
										 |  |  | #include <LibWeb/IndexedDB/Internal/Database.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::IndexedDB { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 19:01:35 +01:00
										 |  |  | using IDBDatabaseMapping = HashMap<StorageAPI::StorageKey, HashMap<String, JS::Handle<Database>>>; | 
					
						
							|  |  |  | static IDBDatabaseMapping m_databases; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 18:44:43 +01:00
										 |  |  | JS_DEFINE_ALLOCATOR(Database); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Database::~Database() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JS::NonnullGCPtr<Database> Database::create(JS::Realm& realm, String const& name) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2024-11-14 05:50:17 +13:00
										 |  |  |     return realm.create<Database>(realm, name); | 
					
						
							| 
									
										
										
										
											2024-11-04 18:44:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Database::visit_edges(Visitor& visitor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Base::visit_edges(visitor); | 
					
						
							|  |  |  |     visitor.visit(m_associated_connections); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 19:01:35 +01:00
										 |  |  | ConnectionQueue& ConnectionQueueHandler::for_key_and_name(StorageAPI::StorageKey& key, String& name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ConnectionQueueHandler::the().m_open_requests.ensure(key, [] { | 
					
						
							|  |  |  |                                                             return HashMap<String, ConnectionQueue>(); | 
					
						
							|  |  |  |                                                         }) | 
					
						
							|  |  |  |         .ensure(name, [] { | 
					
						
							|  |  |  |             return ConnectionQueue(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Optional<JS::Handle<Database>> Database::for_key_and_name(StorageAPI::StorageKey& key, String& name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_databases.ensure(key, [] { | 
					
						
							|  |  |  |                           return HashMap<String, JS::Handle<Database>>(); | 
					
						
							|  |  |  |                       }) | 
					
						
							|  |  |  |         .get(name); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ErrorOr<JS::Handle<Database>> Database::create_for_key_and_name(JS::Realm& realm, StorageAPI::StorageKey& key, String& name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto database_mapping = TRY(m_databases.try_ensure(key, [] { | 
					
						
							|  |  |  |         return HashMap<String, JS::Handle<Database>>(); | 
					
						
							|  |  |  |     })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return database_mapping.try_ensure(name, [&] { | 
					
						
							|  |  |  |         return Database::create(realm, name); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ErrorOr<void> Database::delete_for_key_and_name(StorageAPI::StorageKey& key, String& name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // FIXME: Is a missing entry a failure?
 | 
					
						
							|  |  |  |     auto maybe_database_mapping = m_databases.get(key); | 
					
						
							|  |  |  |     if (!maybe_database_mapping.has_value()) | 
					
						
							|  |  |  |         return {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto& database_mapping = maybe_database_mapping.value(); | 
					
						
							|  |  |  |     auto maybe_database = database_mapping.get(name); | 
					
						
							|  |  |  |     if (!maybe_database.has_value()) | 
					
						
							|  |  |  |         return {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto did_remove = database_mapping.remove(name); | 
					
						
							|  |  |  |     if (!did_remove) | 
					
						
							|  |  |  |         return {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return {}; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-11-04 18:44:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |