Esempio n. 1
0
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());
}
Esempio n. 2
0
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;
}