//----------------------------------------------------------------------------- bool QGCCacheWorker::_init() { _failed = false; if(!_databasePath.isEmpty()) { qCDebug(QGCTileCacheLog) << "Mapping cache directory:" << _databasePath; //-- Initialize Database _db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", kSession)); _db->setDatabaseName(_databasePath); _db->setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); if (_db->open()) { _createDB(); } else { qCritical() << "Map Cache SQL error (init() open db):" << _db->lastError(); _failed = true; } delete _db; _db = NULL; QSqlDatabase::removeDatabase(kSession); } else { qCritical() << "Could not find suitable cache directory."; _failed = true; } return _failed; }
//----------------------------------------------------------------------------- void QGCCacheWorker::_resetCacheDatabase(QGCMapTask* mtask) { if(!_testTask(mtask)) { return; } QGCResetTask* task = static_cast<QGCResetTask*>(mtask); QSqlQuery query(*_db); QString s; s = QString("DROP TABLE Tiles"); query.exec(s); s = QString("DROP TABLE TileSets"); query.exec(s); s = QString("DROP TABLE SetTiles"); query.exec(s); s = QString("DROP TABLE TilesDownload"); query.exec(s); _valid = _createDB(_db); task->setResetCompleted(); }
bool DataBase::open() { if (_connName.isEmpty()) { qCritical() << "Connection name is empty"; return false; } if (_dbPath.isEmpty()) { qCritical() << "DB path is empty"; return false; } if (QSqlDatabase::contains(_connName)) { _db = QSqlDatabase::database(_connName); return true; } _db = QSqlDatabase::addDatabase("QSQLITE", _connName); if (!_db.isValid()) qFatal("Could not create a Sqlite database!\n"); QFile file(_dbPath); qDebug() << "Database path:" << _dbPath << "\n"; _db.setDatabaseName(_dbPath); bool mustCreate = !file.exists(); if (!_db.open()) qFatal("Could not open the database\n"); if (mustCreate) { qDebug() << "Database does not exists. Creating\n"; _createDB(); } QSqlQuery query(_db); query.prepare("PRAGMA foreign_keys = ON"); if (!query.exec()) qCritical() << "Could not turn foriegn keys on"; return true; }
//----------------------------------------------------------------------------- void QGCCacheWorker::_exportSets(QGCMapTask* mtask) { if(!_testTask(mtask)) { return; } QGCExportTileTask* task = static_cast<QGCExportTileTask*>(mtask); //-- Delete target if it exists QFile file(task->path()); file.remove(); //-- Create exported database QSqlDatabase *dbExport = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", kExportSession)); dbExport->setDatabaseName(task->path()); dbExport->setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); if (dbExport->open()) { if(_createDB(dbExport, false)) { //-- Prepare progress report quint64 tileCount = 0; quint64 currentCount = 0; for(int i = 0; i < task->sets().count(); i++) { QGCCachedTileSet* set = task->sets()[i]; //-- Default set has no unique tiles if(set->defaultSet()) { tileCount += set->totalTileCount(); } else { tileCount += set->uniqueTileCount(); } } if(!tileCount) { tileCount = 1; } //-- Iterate sets to save for(int i = 0; i < task->sets().count(); i++) { QGCCachedTileSet* set = task->sets()[i]; //-- Create Tile Exported Set QSqlQuery exportQuery(*dbExport); exportQuery.prepare("INSERT INTO TileSets(" "name, typeStr, topleftLat, topleftLon, bottomRightLat, bottomRightLon, minZoom, maxZoom, type, numTiles, defaultSet, date" ") VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); exportQuery.addBindValue(set->name()); exportQuery.addBindValue(set->mapTypeStr()); exportQuery.addBindValue(set->topleftLat()); exportQuery.addBindValue(set->topleftLon()); exportQuery.addBindValue(set->bottomRightLat()); exportQuery.addBindValue(set->bottomRightLon()); exportQuery.addBindValue(set->minZoom()); exportQuery.addBindValue(set->maxZoom()); exportQuery.addBindValue(set->type()); exportQuery.addBindValue(set->totalTileCount()); exportQuery.addBindValue(set->defaultSet()); exportQuery.addBindValue(QDateTime::currentDateTime().toTime_t()); if(!exportQuery.exec()) { task->setError("Error adding tile set to exported database"); break; } else { //-- Get just created (auto-incremented) setID quint64 exportSetID = exportQuery.lastInsertId().toULongLong(); //-- Find set tiles QString s = QString("SELECT * FROM SetTiles WHERE setID = %1").arg(set->id()); QSqlQuery query(*_db); if(query.exec(s)) { dbExport->transaction(); while(query.next()) { quint64 tileID = query.value("tileID").toULongLong(); //-- Get tile QString s = QString("SELECT * FROM Tiles WHERE tileID = \"%1\"").arg(tileID); QSqlQuery subQuery(*_db); if(subQuery.exec(s)) { if(subQuery.next()) { QString hash = subQuery.value("hash").toString(); QString format = subQuery.value("format").toString(); QByteArray img = subQuery.value("tile").toByteArray(); int type = subQuery.value("type").toInt(); //-- Save tile exportQuery.prepare("INSERT INTO Tiles(hash, format, tile, size, type, date) VALUES(?, ?, ?, ?, ?, ?)"); exportQuery.addBindValue(hash); exportQuery.addBindValue(format); exportQuery.addBindValue(img); exportQuery.addBindValue(img.size()); exportQuery.addBindValue(type); exportQuery.addBindValue(QDateTime::currentDateTime().toTime_t()); if(exportQuery.exec()) { quint64 exportTileID = exportQuery.lastInsertId().toULongLong(); QString s = QString("INSERT INTO SetTiles(tileID, setID) VALUES(%1, %2)").arg(exportTileID).arg(exportSetID); exportQuery.prepare(s); exportQuery.exec(); currentCount++; task->setProgress((int)((double)currentCount / (double)tileCount * 100.0)); } } } } } dbExport->commit(); } } } else { task->setError("Error creating export database"); } } else { qCritical() << "Map Cache SQL error (create export database):" << dbExport->lastError(); task->setError("Error opening export database"); } delete dbExport; QSqlDatabase::removeDatabase(kExportSession); task->setExportCompleted(); }