void IDBFactoryBackendImpl::open(const String& name, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> securityOrigin, Frame*, const String& dataDir, int64_t maximumSize) { String fileIdentifier = securityOrigin->databaseIdentifier(); String uniqueIdentifier = fileIdentifier + "@" + name; IDBDatabaseBackendMap::iterator it = m_databaseBackendMap.find(uniqueIdentifier); if (it != m_databaseBackendMap.end()) { callbacks->onSuccess(it->second); return; } // FIXME: Everything from now on should be done on another thread. RefPtr<IDBSQLiteDatabase> sqliteDatabase; SQLiteDatabaseMap::iterator it2 = m_sqliteDatabaseMap.find(fileIdentifier); if (it2 != m_sqliteDatabaseMap.end()) sqliteDatabase = it2->second; else { sqliteDatabase = openSQLiteDatabase(securityOrigin.get(), dataDir, maximumSize, fileIdentifier, this); if (!sqliteDatabase || !createTables(sqliteDatabase->db()) || !migrateDatabase(sqliteDatabase->db())) { callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Internal error.")); m_sqliteDatabaseMap.set(fileIdentifier, 0); return; } m_sqliteDatabaseMap.set(fileIdentifier, sqliteDatabase.get()); } RefPtr<IDBDatabaseBackendImpl> databaseBackend = IDBDatabaseBackendImpl::create(name, sqliteDatabase.get(), m_transactionCoordinator.get(), this, uniqueIdentifier); callbacks->onSuccess(databaseBackend.get()); m_databaseBackendMap.set(uniqueIdentifier, databaseBackend.get()); }
void IDBFactoryBackendImpl::open(const String& name, const String& description, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> securityOrigin, Frame*, const String& dataDir, int64_t maximumSize) { IDBDatabaseBackendMap::iterator it = m_databaseBackendMap.find(name); if (it != m_databaseBackendMap.end()) { if (!description.isNull()) it->second->setDescription(description); // The description may have changed. callbacks->onSuccess(it->second.get()); return; } // FIXME: Everything from now on should be done on another thread. OwnPtr<SQLiteDatabase> sqliteDatabase = openSQLiteDatabase(securityOrigin.get(), name, dataDir, maximumSize); if (!sqliteDatabase || !createTables(sqliteDatabase.get())) { callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Internal error.")); return; } RefPtr<IDBDatabaseBackendImpl> databaseBackend = IDBDatabaseBackendImpl::create(name, description, sqliteDatabase.release(), m_transactionCoordinator.get()); callbacks->onSuccess(databaseBackend.get()); m_databaseBackendMap.set(name, databaseBackend.release()); }