File indexing completed on 2025-01-26 04:25:02
0001 #include "citiesdb.h" 0002 0003 #include "city.h" 0004 #include <QDebug> 0005 0006 #include <QFile> 0007 #include <QDir> 0008 0009 #include <QStandardPaths> 0010 #include <QUuid> 0011 0012 #include <QSqlDriver> 0013 #include <QSqlError> 0014 #include <QSqlQuery> 0015 0016 0017 static QString resolveDBFile() 0018 { 0019 #if defined(Q_OS_ANDROID) 0020 0021 QFile file(QStandardPaths::locate(QStandardPaths::GenericDataLocation, "/org/mauikit/imagetools/cities.db")); 0022 if(!file.exists()) 0023 { 0024 if(QFile::copy(":/android_rcc_bundle/qml/org/mauikit/imagetools/cities.db", QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+"/cities.db")) 0025 { 0026 qDebug() << "Cities DB File was copied to"; 0027 }else 0028 { 0029 qDebug() << "Cities DB File was NOT copied to"; 0030 0031 } 0032 } 0033 return QStandardPaths::locate(QStandardPaths::GenericDataLocation, "cities.db"); 0034 #else 0035 return QStandardPaths::locate(QStandardPaths::GenericDataLocation, "/org/mauikit/imagetools/cities.db"); 0036 #endif 0037 } 0038 0039 0040 CitiesDB::CitiesDB(QObject *) 0041 { 0042 QString DBFile = resolveDBFile(); 0043 0044 if(QSqlDatabase::isDriverAvailable(QStringLiteral("QSQLITE"))) 0045 { 0046 qDebug() << "opening Cities DB"; 0047 m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), QUuid::createUuid().toString()); 0048 0049 m_db.setDatabaseName(DBFile); 0050 qDebug() << "Cities DB NAME" << m_db.connectionName(); 0051 qDebug() << DBFile; 0052 0053 if(!m_db.open()) 0054 { 0055 qWarning() << "Cities::DatabaseConnect - ERROR: " << m_db.lastError().text(); 0056 m_error = true; 0057 }else 0058 { 0059 m_error = false; 0060 } 0061 } 0062 else 0063 { 0064 qWarning() << "Cities::DatabaseConnect - ERROR: no driver " << QStringLiteral("QSQLITE") << " available"; 0065 m_error = true; 0066 } 0067 } 0068 0069 City* CitiesDB::findCity(double latitude, double longitude) 0070 { 0071 if(m_error) 0072 { 0073 return nullptr; 0074 } 0075 0076 QSqlQuery query(m_db); 0077 query.prepare("SELECT * FROM CITIES where lat = ? and lon = ?"); 0078 query.addBindValue(latitude); 0079 query.addBindValue(longitude); 0080 0081 if(!query.exec()) 0082 { 0083 qWarning() << "Cities::FindCity - ERROR: " << query.lastError().text(); 0084 } 0085 0086 if(query.first()) 0087 { 0088 return new City(query.value("id").toString(), query.value("name").toString(), query.value("tz").toString(), query.value("country").toString(),query.value("lat").toDouble(),query.value("lon").toDouble()); 0089 } 0090 0091 qWarning() << "City not found"; 0092 0093 return nullptr; 0094 } 0095 0096 City *CitiesDB::city(const QString &cityId) 0097 { 0098 if(m_error) 0099 { 0100 return nullptr; 0101 } 0102 0103 QSqlQuery query(m_db); 0104 query.prepare("SELECT c.id, c.name, co.name as country, c.lat, c.lon, c.tz FROM CITIES c inner join COUNTRIES co on c.country = co.id where c.id = ?"); 0105 query.addBindValue(cityId); 0106 0107 if(!query.exec()) 0108 { 0109 qWarning() << "Cities::city - ERROR: " << query.lastError().text(); 0110 } 0111 0112 if(query.first()) 0113 { 0114 return new City(query.value("id").toString(), query.value("name").toString(), query.value("tz").toString(), query.value("country").toString(),query.value("lat").toDouble(),query.value("lon").toDouble(), this); 0115 } 0116 0117 return nullptr; 0118 } 0119 0120 std::vector< point_t > CitiesDB::cities() 0121 { 0122 std::vector< point_t > res; 0123 QSqlQuery query(m_db); 0124 query.prepare("SELECT lat, lon FROM CITIES"); 0125 0126 if(!query.exec()) 0127 { 0128 qWarning() << "Cities::ParsingCities - ERROR: " << query.lastError().text(); 0129 m_error = true; 0130 } 0131 0132 while(query.next()) 0133 { 0134 double lat = query.value("lat").toDouble(); 0135 double lon = query.value("lon").toDouble(); 0136 res.push_back({lat, lon}); 0137 } 0138 0139 m_error = false; 0140 return res; 0141 } 0142 0143 0144 bool CitiesDB::error() const 0145 { 0146 return m_error; 0147 } 0148