LocalyticsDatabase::LocalyticsDatabase(QObject *parent) : QObject(parent) { // Attempt to open database. It will be created if it does not exist, already. _databaseConnection = QSqlDatabase::addDatabase( QLatin1String("QSQLITE") ); _databaseConnection.setDatabaseName(pathToDatabaseFile()); bool success = _databaseConnection.open(); if (!success) { qDebug() << _databaseConnection.lastError(); qFatal( "Failed to connect." ); } qDebug( "Connected!" ); // // If we were unable to open the database, it is likely corrupted. Clobber it and move on. // if (code != SQLITE_OK) { // [[NSFileManager defaultManager] removeItemAtPath:dbPath error:nil]; // code = sqlite3_open([dbPath UTF8String], &_databaseConnection); // } // Enable foreign key constraints. if (success) { QSqlQuery q(_databaseConnection); success = q.exec(QLatin1String("PRAGMA foreign_keys = ON;")); } if (schemaVersion() < 7) { createSchema(); } }
bool ThumbnailSchemaUpdater::makeUpdates() { if (m_currentVersion < schemaVersion()) { if (m_currentVersion == 1) { updateV1ToV2(); } } return true; }
bool ThumbnailSchemaUpdater::createDatabase() { if ( createTables() && createIndices() && createTriggers()) { m_currentVersion = schemaVersion(); m_currentRequiredVersion = 1; return true; } else { return false; } }
/*! * \brief Database::Database * \param databaseDir directory to load/store the database * \param schemaDirectory directory of the SQL schema for the database * \param parent */ Database::Database(const QString &databaseDir, const QString &schemaDirectory, QObject* parent) : QObject(parent), m_databaseDirectory(databaseDir), m_sqlSchemaDirectory(schemaDirectory), m_db(new QSqlDatabase()) { if (!QFile::exists(m_databaseDirectory)) { QDir dir; bool createOk = dir.mkpath(m_databaseDirectory); if (!createOk) qWarning() << "Unable to create DB directory" << m_databaseDirectory; } m_albumTable = new AlbumTable(this, this); m_mediaTable = new MediaTable(this, this); // Open the database. if (!openDB()) restoreFromBackup(); // Attempt a query to make sure the DB is valid. QSqlQuery test_query(*m_db); if (!test_query.exec("SELECT * FROM SQLITE_MASTER LIMIT 1")) { logSqlError(test_query); restoreFromBackup(); } QSqlQuery query(*m_db); // Turn synchronous off. if (!query.exec("PRAGMA synchronous = OFF")) { logSqlError(query); return; } // Enable foreign keys. if (!query.exec("PRAGMA foreign_keys = ON")) { logSqlError(query); return; } // Update if needed. upgradeSchema(schemaVersion()); }
void StocksPortfolio::serialize(Serializer& ser) { serialize(ser, schemaVersion()); }
bool ThumbnailSchemaUpdater::startUpdates() { // First step: do we have an empty database? QStringList tables = m_access->backend()->tables(); if (tables.contains("Thumbnails")) { // Find out schema version of db file QString version = m_access->db()->getSetting("DBThumbnailsVersion"); QString versionRequired = m_access->db()->getSetting("DBThumbnailsVersionRequired"); kDebug(50003) << "Have a database structure version " << version; // mini schema update if (version.isEmpty() && m_access->parameters().isSQLite()) { version = m_access->db()->getSetting("DBVersion"); } // We absolutely require the DBThumbnailsVersion setting if (version.isEmpty()) { // Something is damaged. Give up. kError(50003) << "DBThumbnailsVersion not available! Giving up schema upgrading."; QString errorMsg = i18n( "The database is not valid: " "the \"DBThumbnailsVersion\" setting does not exist. " "The current database schema version cannot be verified. " "Try to start with an empty database. " ); m_access->setLastError(errorMsg); if (m_observer) { m_observer->error(errorMsg); m_observer->finishedSchemaUpdate(InitializationObserver::UpdateErrorMustAbort); } return false; } // current version describes the current state of the schema in the db, // schemaVersion is the version required by the program. m_currentVersion = version.toInt(); if (m_currentVersion > schemaVersion()) { // trying to open a database with a more advanced than this ThumbnailSchemaUpdater supports if (!versionRequired.isEmpty() && versionRequired.toInt() <= schemaVersion()) { // version required may be less than current version return true; } else { QString errorMsg = i18n( "The database has been used with a more recent version of digiKam " "and has been updated to a database schema which cannot be used with this version. " "(This means this digiKam version is too old, or the database format is to recent) " "Please use the more recent version of digikam that you used before. " ); m_access->setLastError(errorMsg); if (m_observer) { m_observer->error(errorMsg); m_observer->finishedSchemaUpdate(InitializationObserver::UpdateErrorMustAbort); } return false; } } else { return makeUpdates(); } } else { //kDebug(50003) << "No database file available"; DatabaseParameters parameters = m_access->parameters(); // No legacy handling: start with a fresh db if (!createDatabase()) { QString errorMsg = i18n("Failed to create tables in database.\n ") + m_access->backend()->lastError(); m_access->setLastError(errorMsg); if (m_observer) { m_observer->error(errorMsg); m_observer->finishedSchemaUpdate(InitializationObserver::UpdateErrorMustAbort); } return false; } return true; } }