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. { ProposedDatabase proposedDb(*this, context->securityOrigin(), name, displayName, estimatedSize); databaseContext->databaseExceededQuota(name, proposedDb.details()); } 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(); }
Database* DatabaseManager::openDatabaseInternal(ExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage) { ASSERT(error == DatabaseError::None); DatabaseContext* backendContext = databaseContextFor(context)->backend(); if (DatabaseTracker::tracker().canEstablishDatabase(backendContext, name, displayName, estimatedSize, error)) { Database* backend = new Database(backendContext, name, expectedVersion, displayName, estimatedSize); if (backend->openAndVerifyVersion(setVersionInNewDatabase, error, errorMessage)) return backend; } ASSERT(error != DatabaseError::None); switch (error) { case DatabaseError::GenericSecurityError: logOpenDatabaseError(context, name); return nullptr; case DatabaseError::InvalidDatabaseState: logErrorMessage(context, errorMessage); return nullptr; default: ASSERT_NOT_REACHED(); } return nullptr; }
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: case DatabaseError::DatabaseSizeExceededQuota: logOpenDatabaseError(context, name); return 0; case DatabaseError::InvalidDatabaseState: logErrorMessage(context, errorMessage); return 0; default: ASSERT_NOT_REACHED(); } } return backend.release(); }
ExceptionOr<Ref<Database>> DatabaseManager::openDatabaseBackend(ScriptExecutionContext& context, const String& name, const String& expectedVersion, const String& displayName, unsigned estimatedSize, bool setVersionInNewDatabase) { auto databaseContext = this->databaseContext(context); auto backend = tryToOpenDatabaseBackend(databaseContext, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, FirstTryToOpenDatabase); if (backend.hasException()) { if (backend.exception().code() == QUOTA_EXCEEDED_ERR) { // 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. { // FIXME: What guarantees context.securityOrigin() is non-null? ProposedDatabase proposedDatabase { *this, *context.securityOrigin(), name, displayName, estimatedSize }; databaseContext->databaseExceededQuota(name, proposedDatabase.details()); } backend = tryToOpenDatabaseBackend(databaseContext, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, RetryOpenDatabase); } } if (backend.hasException()) { if (backend.exception().code() == INVALID_STATE_ERR) logErrorMessage(context, backend.exception().message()); else logOpenDatabaseError(context, name); } return backend; }