String LocalStorageDatabaseTracker::pathForDatabaseWithOriginIdentifier(const String& originIdentifier) { if (!m_database.isOpen()) return String(); SQLiteStatement pathStatement(m_database, "SELECT path FROM Origins WHERE origin=?"); if (pathStatement.prepare() != SQLITE_OK) { LOG_ERROR("Unable to prepare selection of path for origin '%s'", originIdentifier.utf8().data()); return String(); } pathStatement.bindText(1, originIdentifier); int result = pathStatement.step(); if (result != SQLITE_ROW) return String(); return pathStatement.getColumnText(0); }
String StorageTracker::databasePathForOrigin(const String& originIdentifier) { ASSERT(!m_databaseMutex.tryLock()); ASSERT(m_isActive); if (!m_database.isOpen()) return String(); SQLiteStatement pathStatement(m_database, "SELECT path FROM Origins WHERE origin=?"); if (pathStatement.prepare() != SQLResultOk) { LOG_ERROR("Unable to prepare selection of path for origin '%s'", originIdentifier.ascii().data()); return String(); } pathStatement.bindText(1, originIdentifier); int result = pathStatement.step(); if (result != SQLResultRow) return String(); return pathStatement.getColumnText(0); }
void StorageTracker::syncDeleteOrigin(const String& originIdentifier) { ASSERT(!isMainThread()); MutexLocker lockDatabase(m_databaseGuard); 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; // Get origin's db file path, delete entry in tracker's db, then delete db file. SQLiteStatement pathStatement(m_database, "SELECT path FROM Origins WHERE origin=?"); if (pathStatement.prepare() != SQLResultOk) { LOG_ERROR("Unable to prepare selection of path for origin '%s'", originIdentifier.ascii().data()); return; } pathStatement.bindText(1, originIdentifier); int result = pathStatement.step(); if (result != SQLResultRow) { LOG_ERROR("Unable to find origin '%s' in Origins table", originIdentifier.ascii().data()); return; } String path = pathStatement.getColumnText(0); ASSERT(!path.isEmpty()); 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 originLock(m_originSetGuard); m_originSet.remove(originIdentifier); shouldDeleteTrackerFiles = m_originSet.isEmpty(); } if (shouldDeleteTrackerFiles) { m_database.close(); SQLiteFileSystem::deleteDatabaseFile(trackerDatabasePath()); SQLiteFileSystem::deleteEmptyDatabaseDirectory(m_storageDirectoryPath); } { MutexLocker lockClient(m_clientGuard); if (m_client) m_client->dispatchDidModifyOrigin(originIdentifier); } }