void StorageTracker::syncDeleteOrigin(const String& originIdentifier) { ASSERT(!isMainThread()); MutexLocker locker(m_databaseMutex); if (!canDeleteOrigin(originIdentifier)) { LOG_ERROR("Attempted to delete origin '%s' while it was being created\n", originIdentifier.ascii().data()); return; } openTrackerDatabase(false); if (!m_database.isOpen()) return; String path = databasePathForOrigin(originIdentifier); if (path.isEmpty()) { // It is possible to get a request from the API to delete the storage for an origin that // has no such storage. return; } SQLiteStatement deleteStatement(m_database, "DELETE FROM Origins where origin=?"); if (deleteStatement.prepare() != SQLResultOk) { LOG_ERROR("Unable to prepare deletion of origin '%s'", originIdentifier.ascii().data()); return; } deleteStatement.bindText(1, originIdentifier); if (!deleteStatement.executeCommand()) { LOG_ERROR("Unable to execute deletion of origin '%s'", originIdentifier.ascii().data()); return; } SQLiteFileSystem::deleteDatabaseFile(path); bool shouldDeleteTrackerFiles = false; { MutexLocker locker(m_originSetMutex); m_originSet.remove(originIdentifier); shouldDeleteTrackerFiles = m_originSet.isEmpty(); } if (shouldDeleteTrackerFiles) { m_database.close(); SQLiteFileSystem::deleteDatabaseFile(trackerDatabasePath()); SQLiteFileSystem::deleteEmptyDatabaseDirectory(m_storageDirectoryPath); } { MutexLocker locker(m_clientMutex); if (m_client) m_client->dispatchDidModifyOrigin(originIdentifier); } }
long long StorageTracker::diskUsageForOrigin(SecurityOrigin* origin) { if (!m_isActive) return 0; MutexLocker locker(m_databaseMutex); String path = databasePathForOrigin(origin->databaseIdentifier()); if (path.isEmpty()) return 0; return SQLiteFileSystem::getDatabaseFileSize(path); }
long long StorageTracker::diskUsageForOrigin(SecurityOrigin* origin) { if (!m_isActive) return 0; MutexLocker locker(m_databaseMutex); String path = databasePathForOrigin(origin->databaseIdentifier()); if (path.isEmpty()) return 0; long long size; return getFileSize(path, size) ? size : 0; }