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()); }
bool Hourglass::setupDatabase() { bool ok = true; QSettings settings; QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); if (settings.contains("databasePath")) { database.setDatabaseName(settings.value("databasePath").toString()); } else { #ifdef Q_OS_LINUX QDir path(QDir::home().path()); if ((path.exists(".hourglass") || path.mkdir(".hourglass")) && path.cd(".hourglass")) { QString databasePath = path.absoluteFilePath("hourglass.db"); database.setDatabaseName(databasePath); settings.setValue("databasePath", databasePath); } #else // Non-Linux database.setDatabaseName("hourglass.db"); #endif } if (database.databaseName().isEmpty() || !database.open()) { // Try to use in-memory database database.setDatabaseName(":memory:"); if (database.open()) { QMessageBox::warning(NULL, "In memory database", "Couldn't create a local database; using an in-memory database instead. Your activities will not be saved."); } else { QMessageBox::critical(NULL, "Database", "Couldn't create a local database or use an in-memory database. Closing..."); ok = false; } } if (ok) { migrateDatabase(database); } return ok; }