bool DatabaseTracker::addDatabase(SecurityOrigin* origin, const String& name, const String& path) { ASSERT(!m_databaseGuard.tryLock()); openTrackerDatabase(CreateIfDoesNotExist); if (!m_database.isOpen()) return false; // New database should never be added until the origin has been established ASSERT(hasEntryForOriginNoLock(origin)); SQLiteStatement statement(m_database, "INSERT INTO Databases (origin, name, path) VALUES (?, ?, ?);"); if (statement.prepare() != SQLResultOk) return false; statement.bindText(1, origin->databaseIdentifier()); statement.bindText(2, name); statement.bindText(3, path); if (!statement.executeCommand()) { LOG_ERROR("Failed to add database %s to origin %s: %s\n", name.ascii().data(), origin->databaseIdentifier().ascii().data(), m_database.lastErrorMsg()); return false; } if (m_client) m_client->dispatchDidModifyOrigin(origin); return true; }
void DatabaseTracker::setQuota(SecurityOrigin* origin, unsigned long long quota) { LockHolder lockDatabase(m_databaseGuard); if (quotaForOriginNoLock(origin) == quota) return; openTrackerDatabase(CreateIfDoesNotExist); if (!m_database.isOpen()) return; #if PLATFORM(IOS) bool insertedNewOrigin = false; #endif bool originEntryExists = hasEntryForOriginNoLock(origin); if (!originEntryExists) { SQLiteStatement statement(m_database, "INSERT INTO Origins VALUES (?, ?)"); if (statement.prepare() != SQLITE_OK) { LOG_ERROR("Unable to establish origin %s in the tracker", origin->databaseIdentifier().ascii().data()); } else { statement.bindText(1, origin->databaseIdentifier()); statement.bindInt64(2, quota); if (statement.step() != SQLITE_DONE) LOG_ERROR("Unable to establish origin %s in the tracker", origin->databaseIdentifier().ascii().data()); #if PLATFORM(IOS) else insertedNewOrigin = true; #endif } } else { SQLiteStatement statement(m_database, "UPDATE Origins SET quota=? WHERE origin=?"); bool error = statement.prepare() != SQLITE_OK; if (!error) { statement.bindInt64(1, quota); statement.bindText(2, origin->databaseIdentifier()); error = !statement.executeCommand(); } if (error) LOG_ERROR("Failed to set quota %llu in tracker database for origin %s", quota, origin->databaseIdentifier().ascii().data()); } if (m_client) { #if PLATFORM(IOS) if (insertedNewOrigin) m_client->dispatchDidAddNewOrigin(origin); #endif m_client->dispatchDidModifyOrigin(origin); } }
void DatabaseTracker::setQuota(SecurityOrigin* origin, unsigned long long quota) { MutexLocker lockDatabase(m_databaseGuard); if (quotaForOriginNoLock(origin) == quota) return; openTrackerDatabase(CreateIfDoesNotExist); if (!m_database.isOpen()) return; bool originEntryExists = hasEntryForOriginNoLock(origin); if (!originEntryExists) { SQLiteStatement statement(m_database, "INSERT INTO Origins VALUES (?, ?)"); if (statement.prepare() != SQLResultOk) { LOG_ERROR("Unable to establish origin %s in the tracker", origin->databaseIdentifier().ascii().data()); } else { statement.bindText(1, origin->databaseIdentifier()); statement.bindInt64(2, quota); if (statement.step() != SQLResultDone) LOG_ERROR("Unable to establish origin %s in the tracker", origin->databaseIdentifier().ascii().data()); } } else { SQLiteStatement statement(m_database, "UPDATE Origins SET quota=? WHERE origin=?"); bool error = statement.prepare() != SQLResultOk; if (!error) { statement.bindInt64(1, quota); statement.bindText(2, origin->databaseIdentifier()); error = !statement.executeCommand(); } if (error) #if OS(WINDOWS) LOG_ERROR("Failed to set quota %I64u in tracker database for origin %s", quota, origin->databaseIdentifier().ascii().data()); #else LOG_ERROR("Failed to set quota %llu in tracker database for origin %s", quota, origin->databaseIdentifier().ascii().data()); #endif } if (m_client) m_client->dispatchDidModifyOrigin(origin); }
bool DatabaseTracker::hasEntryForOrigin(SecurityOrigin* origin) { MutexLocker lockDatabase(m_databaseGuard); return hasEntryForOriginNoLock(origin); }