bool DatabaseTracker::hasAdequateQuotaForOrigin(SecurityOrigin* origin, unsigned long estimatedSize, DatabaseError& err) { ASSERT(!m_databaseGuard.tryLock()); unsigned long long usage = usageForOrigin(origin); // If the database will fit, allow its creation. unsigned long long requirement = usage + std::max<unsigned long long>(1, estimatedSize); if (requirement < usage) { // The estimated size is so big it causes an overflow; don't allow creation. err = DatabaseError::DatabaseSizeOverflowed; return false; } if (requirement <= quotaForOriginNoLock(origin)) return true; err = DatabaseError::DatabaseSizeExceededQuota; return false; }
unsigned long long DatabaseTracker::getMaxSizeForDatabase(const DatabaseBackendBase* database) { // The maximum size for a database is the full quota for its origin, minus the current usage within the origin, // plus the current usage of the given database MutexLocker lockDatabase(m_databaseGuard); SecurityOrigin* origin = database->securityOrigin(); unsigned long long quota = quotaForOriginNoLock(origin); unsigned long long diskUsage = usageForOrigin(origin); unsigned long long databaseFileSize = SQLiteFileSystem::getDatabaseFileSize(database->fileName()); ASSERT(databaseFileSize <= diskUsage); if (diskUsage > quota) return databaseFileSize; // A previous error may have allowed the origin to exceed its quota, or may // have allowed this database to exceed our cached estimate of the origin // disk usage. Don't multiply that error through integer underflow, or the // effective quota will permanently become 2^64. unsigned long long maxSize = quota - diskUsage + databaseFileSize; if (maxSize > quota) maxSize = databaseFileSize; return maxSize; }