DatabaseDetails DatabaseTracker::detailsForNameAndOrigin(const String& name, SecurityOrigin* origin) { String originIdentifier = origin->databaseIdentifier(); String displayName; int64_t expectedUsage; { MutexLocker lockDatabase(m_databaseGuard); openTrackerDatabase(DontCreateIfDoesNotExist); if (!m_database.isOpen()) return DatabaseDetails(); SQLiteStatement statement(m_database, "SELECT displayName, estimatedSize FROM Databases WHERE origin=? AND name=?"); if (statement.prepare() != SQLResultOk) return DatabaseDetails(); statement.bindText(1, originIdentifier); statement.bindText(2, name); int result = statement.step(); if (result == SQLResultDone) return DatabaseDetails(); if (result != SQLResultRow) { LOG_ERROR("Error retrieving details for database %s in origin %s from tracker database", name.ascii().data(), originIdentifier.ascii().data()); return DatabaseDetails(); } displayName = statement.getColumnText(0); expectedUsage = statement.getColumnInt64(1); } return DatabaseDetails(name, displayName, expectedUsage, usageForDatabase(name, origin)); }
PassRefPtr<DatabaseBackendBase> DatabaseManager::openDatabaseBackend(ScriptExecutionContext* context, DatabaseType type, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage) { ASSERT(error == DatabaseError::None); RefPtr<DatabaseContext> databaseContext = databaseContextFor(context); RefPtr<DatabaseBackendContext> backendContext = databaseContext->backend(); RefPtr<DatabaseBackendBase> backend = m_server->openDatabase(backendContext, type, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage); if (!backend) { ASSERT(error != DatabaseError::None); switch (error) { case DatabaseError::DatabaseIsBeingDeleted: case DatabaseError::DatabaseSizeOverflowed: case DatabaseError::GenericSecurityError: logOpenDatabaseError(context, name); return 0; case DatabaseError::InvalidDatabaseState: logErrorMessage(context, errorMessage); return 0; case DatabaseError::DatabaseSizeExceededQuota: // Notify the client that we've exceeded the database quota. // The client may want to increase the quota, and we'll give it // one more try after if that is the case. databaseContext->databaseExceededQuota(name, DatabaseDetails(name.isolatedCopy(), displayName.isolatedCopy(), estimatedSize, 0)); error = DatabaseError::None; backend = m_server->openDatabase(backendContext, type, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage, AbstractDatabaseServer::RetryOpenDatabase); break; default: ASSERT_NOT_REACHED(); } if (!backend) { ASSERT(error != DatabaseError::None); if (error == DatabaseError::InvalidDatabaseState) { logErrorMessage(context, errorMessage); return 0; } logOpenDatabaseError(context, name); return 0; } } return backend.release(); }
bool ArgumentCoder<DatabaseDetails>::decode(ArgumentDecoder& decoder, DatabaseDetails& details) { String name; if (!decoder.decode(name)) return false; String displayName; if (!decoder.decode(displayName)) return false; uint64_t expectedUsage; if (!decoder.decode(expectedUsage)) return false; uint64_t currentUsage; if (!decoder.decode(currentUsage)) return false; details = DatabaseDetails(name, displayName, expectedUsage, currentUsage); return true; }
DatabaseDetails DatabaseTracker::detailsForNameAndOrigin(const String& name, SecurityOrigin* origin) { String originIdentifier = origin->databaseIdentifier(); String displayName; int64_t expectedUsage; { LockHolder lockDatabase(m_databaseGuard); openTrackerDatabase(DontCreateIfDoesNotExist); if (!m_database.isOpen()) return DatabaseDetails(); SQLiteStatement statement(m_database, "SELECT displayName, estimatedSize FROM Databases WHERE origin=? AND name=?"); if (statement.prepare() != SQLITE_OK) return DatabaseDetails(); statement.bindText(1, originIdentifier); statement.bindText(2, name); int result = statement.step(); if (result == SQLITE_DONE) return DatabaseDetails(); if (result != SQLITE_ROW) { LOG_ERROR("Error retrieving details for database %s in origin %s from tracker database", name.ascii().data(), originIdentifier.ascii().data()); return DatabaseDetails(); } displayName = statement.getColumnText(0); expectedUsage = statement.getColumnInt64(1); } String path = fullPathForDatabase(origin, name, false); if (path.isEmpty()) return DatabaseDetails(name, displayName, expectedUsage, 0, 0, 0); return DatabaseDetails(name, displayName, expectedUsage, SQLiteFileSystem::getDatabaseFileSize(path), SQLiteFileSystem::databaseCreationTime(path), SQLiteFileSystem::databaseModificationTime(path)); }
DatabaseDetails DatabaseBackendBase::details() const { // This code path is only used for database quota delegate calls, so file dates are irrelevant and left uninitialized. return DatabaseDetails(stringIdentifier(), displayName(), estimatedSize(), 0, 0, 0); }
DatabaseDetails DatabaseBackendBase::details() const { return DatabaseDetails(stringIdentifier(), displayName(), estimatedSize(), 0); }