void LocalStorageDatabase::updateDatabase() { if (m_isClosed) return; ASSERT(m_didScheduleDatabaseUpdate); m_didScheduleDatabaseUpdate = false; HashMap<String, String> changedItems; if (m_changedItems.size() <= maximumItemsToUpdate) { // There are few enough changed items that we can just always write all of them. m_changedItems.swap(changedItems); updateDatabaseWithChangedItems(changedItems); m_disableSuddenTerminationWhileWritingToLocalStorage = nullptr; } else { for (int i = 0; i < maximumItemsToUpdate; ++i) { auto it = m_changedItems.begin(); changedItems.add(it->key, it->value); m_changedItems.remove(it); } ASSERT(changedItems.size() <= maximumItemsToUpdate); // Reschedule the update for the remaining items. scheduleDatabaseUpdate(); updateDatabaseWithChangedItems(changedItems); } }
void LocalStorageDatabase::close() { ASSERT(!m_isClosed); m_isClosed = true; if (m_didScheduleDatabaseUpdate) { updateDatabaseWithChangedItems(m_changedItems); m_changedItems.clear(); } bool isEmpty = databaseIsEmpty(); if (m_database.isOpen()) m_database.close(); if (isEmpty) m_tracker->deleteDatabaseWithOrigin(m_securityOrigin.get()); }