//----------------------------------------------------------------------------- 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(); }
//----------------------------------------------------------------------------- void QGCCacheWorker::_getTileSets(QGCMapTask* mtask) { if(!_valid) { mtask->setError("No Cache Database"); return; } QGCFetchTileSetTask* task = static_cast<QGCFetchTileSetTask*>(mtask); QSqlQuery query(*_db); QString s = QString("SELECT * FROM TileSets ORDER BY defaultSet DESC, name ASC"); if(query.exec(s)) { while(query.next()) { QString name = query.value("name").toString(); QString desc = query.value("description").toString(); QGCCachedTileSet* set = new QGCCachedTileSet(name, desc); set->setId(query.value("setID").toULongLong()); set->setMapTypeStr(query.value("typeStr").toString()); set->setTopleftLat(query.value("topleftLat").toDouble()); set->setTopleftLon(query.value("topleftLon").toDouble()); set->setBottomRightLat(query.value("bottomRightLat").toDouble()); set->setBottomRightLon(query.value("bottomRightLon").toDouble()); set->setMinZoom(query.value("minZoom").toInt()); set->setMaxZoom(query.value("maxZoom").toInt()); set->setType((UrlFactory::MapType)query.value("type").toInt()); set->setNumTiles(query.value("numTiles").toUInt()); set->setTilesSize(query.value("tilesSize").toULongLong()); set->setDefaultSet(query.value("defaultSet").toInt() != 0); set->setCreationDate(QDateTime::fromTime_t(query.value("date").toUInt())); //-- Load thumbnail (if not default set) if(!set->defaultSet()) { int w = query.value("thumbW").toInt(); int h = query.value("thumbH").toInt(); if(w && h) { QByteArray ba = query.value("thumbNail").toByteArray(); set->setThumbNail(QImage((uchar*)(void*)ba.data(), w, h, QImage::Format_RGB32)); } } _updateSetTotals(set); //-- Object created here must be moved to app thread to be used there set->moveToThread(QApplication::instance()->thread()); task->tileSetFetched(set); } } else { task->setError("No tile set in database"); } }
//----------------------------------------------------------------------------- void QGCCacheWorker::_getTileSets(QGCMapTask* mtask) { if(!_testTask(mtask)) { return; } QGCFetchTileSetTask* task = static_cast<QGCFetchTileSetTask*>(mtask); QSqlQuery query(*_db); QString s = QString("SELECT * FROM TileSets ORDER BY defaultSet DESC, name ASC"); qCDebug(QGCTileCacheLog) << "_getTileSets(): " << s; if(query.exec(s)) { while(query.next()) { QString name = query.value("name").toString(); QGCCachedTileSet* set = new QGCCachedTileSet(name); set->setId(query.value("setID").toULongLong()); set->setMapTypeStr(query.value("typeStr").toString()); set->setTopleftLat(query.value("topleftLat").toDouble()); set->setTopleftLon(query.value("topleftLon").toDouble()); set->setBottomRightLat(query.value("bottomRightLat").toDouble()); set->setBottomRightLon(query.value("bottomRightLon").toDouble()); set->setMinZoom(query.value("minZoom").toInt()); set->setMaxZoom(query.value("maxZoom").toInt()); set->setType((UrlFactory::MapType)query.value("type").toInt()); set->setTotalTileCount(query.value("numTiles").toUInt()); set->setDefaultSet(query.value("defaultSet").toInt() != 0); set->setCreationDate(QDateTime::fromTime_t(query.value("date").toUInt())); _updateSetTotals(set); //-- Object created here must be moved to app thread to be used there set->moveToThread(QApplication::instance()->thread()); task->tileSetFetched(set); } } else { task->setError("No tile set in database"); } }