void DatabaseTracker::recordDeletingDatabase(SecurityOrigin *origin, const String& name) { ASSERT(!m_databaseGuard.tryLock()); ASSERT(canDeleteDatabase(origin, name)); NameSet* nameSet = m_beingDeleted.get(origin); if (!nameSet) { nameSet = new NameSet(); m_beingDeleted.set(origin->isolatedCopy(), nameSet); } ASSERT(!nameSet->contains(name)); nameSet->add(name.isolatedCopy()); }
bool DatabaseTracker::deleteDatabase(SecurityOrigin* origin, const String& name) { { LockHolder lockDatabase(m_databaseGuard); openTrackerDatabase(DontCreateIfDoesNotExist); if (!m_database.isOpen()) return false; if (!canDeleteDatabase(origin, name)) { ASSERT_NOT_REACHED(); return false; } recordDeletingDatabase(origin, name); } // We drop the lock here because holding locks during a call to deleteDatabaseFile will deadlock. if (!deleteDatabaseFile(origin, name, DeletionMode::Default)) { LOG_ERROR("Unable to delete file for database %s in origin %s", name.ascii().data(), origin->databaseIdentifier().ascii().data()); LockHolder lockDatabase(m_databaseGuard); doneDeletingDatabase(origin, name); return false; } LockHolder lockDatabase(m_databaseGuard); SQLiteStatement statement(m_database, "DELETE FROM Databases WHERE origin=? AND name=?"); if (statement.prepare() != SQLITE_OK) { LOG_ERROR("Unable to prepare deletion of database %s from origin %s from tracker", name.ascii().data(), origin->databaseIdentifier().ascii().data()); doneDeletingDatabase(origin, name); return false; } statement.bindText(1, origin->databaseIdentifier()); statement.bindText(2, name); if (!statement.executeCommand()) { LOG_ERROR("Unable to execute deletion of database %s from origin %s from tracker", name.ascii().data(), origin->databaseIdentifier().ascii().data()); doneDeletingDatabase(origin, name); return false; } if (m_client) { m_client->dispatchDidModifyOrigin(origin); m_client->dispatchDidModifyDatabase(origin, name); #if PLATFORM(IOS) m_client->dispatchDidDeleteDatabase(); #endif } doneDeletingDatabase(origin, name); return true; }