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