1 /***************************************************************************
2                           database.cpp  -  description
3                              -------------------
4     begin                : sept 2011
5     copyright            : (C) 2011 by Jaime Robles
6     email                : jaime@robles.es
7  ***************************************************************************/
8 
9 /*****************************************************************************
10  * This file is part of KLog.                                                *
11  *                                                                           *
12  *    KLog is free software: you can redistribute it and/or modify           *
13  *    it under the terms of the GNU General Public License as published by   *
14  *    the Free Software Foundation, either version 3 of the License, or      *
15  *    (at your option) any later version.                                    *
16  *                                                                           *
17  *    KLog is distributed in the hope that it will be useful,                *
18  *    but WITHOUT ANY WARRANTY; without even the implied warranty of         *
19  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
20  *    GNU General Public License for more details.                           *
21  *                                                                           *
22  *    You should have received a copy of the GNU General Public License      *
23  *    along with KLog.  If not, see <https://www.gnu.org/licenses/>.         *
24  *                                                                           *
25  *****************************************************************************/
26 
27 #include "database.h"
28 //#include <qDebug>
29 
DataBase(const QString & _parentClass,const QString & _DBName)30 DataBase::DataBase(const QString &_parentClass, const QString &_DBName)
31 {
32        //qDebug() << "DataBase::DataBase: PLAIN: " << _parentClass << " / Name = " << _DBName << QT_ENDL;
33     constrid = 1;
34     created = false;
35 
36     util = new Utilities();
37     softVersion = util->getVersion();
38     dbName = _DBName;
39     //connect(this, SIGNAL(debugLog(QString, QString, int)), this, SLOT(slotPrintErrors(QString, QString, int)) );
40     //qDebug() << "DataBase::DataBase1: dbName: " << dbName << QT_ENDL;
41 
42     //db = QSqlDatabase::database();
43 
44     dbVersion = DBVersionf;
45     createConnection(QString(Q_FUNC_INFO)+"1");
46        //qDebug() << "DataBase::DataBase: PLAIN - connection Name: " << dbConnectionName << QT_ENDL;
47        //qDebug() << "DataBase::DataBase: PLAIN - DB Name: " << db.databaseName() << QT_ENDL;
48     insertPreparedQueries.clear();
49     insertQueryFields.clear();
50        //qDebug() << "DataBase::DataBase: PLAIN: - END" << QT_ENDL;
51 }
52 
DataBase(const QString & _parentClass,const QString & _softVersion,const QString & _DBName)53 DataBase::DataBase(const QString &_parentClass, const QString &_softVersion, const QString &_DBName)
54 {
55     //qDebug() << "DataBase::DataBase2: " << _parentClass << "/" << _softVersion << " / Name = " << _DBName << QT_ENDL;
56     //TODO: Sometimes the DB is created without the proper calling (without passing softVersion)
57     constrid = 2;
58     created = false;
59     dbVersion = DBVersionf;
60     softVersion = _softVersion;
61     //inMemoryOnly = inmemoryonly;
62     latestReaded = 0.0f;
63     util = new Utilities();
64     util->setVersion(softVersion);
65 
66     dbName = _DBName;
67     //connect(this, SIGNAL(debugLog(QString, QString, int)), this, SLOT(slotPrintErrors(QString, QString, int)) );
68 
69        //qDebug() << "DataBase::DataBase2: dbName: " << dbName << QT_ENDL;
70     //dbDir = dbName;
71        //qDebug() << "DataBase::DataBase: DB(string): " << dbName << QT_ENDL;
72 
73     //db = QSqlDatabase::database();
74 
75 
76     //db = QSqlDatabase::removeDatabase("QSQLITE");
77     if (util->getVersionDouble()>0)
78     {
79         createConnection(QString(Q_FUNC_INFO)+"2");
80     }
81        //qDebug() << "DataBase::DataBase: - connection Name: " << dbConnectionName << QT_ENDL;
82        //qDebug() << "DataBase::DataBase: - DB Name: " << db.databaseName() << QT_ENDL;
83     insertPreparedQueries.clear();
84     insertQueryFields.clear();
85        //qDebug() << "DataBase::DataBase2: END"  << QT_ENDL;
86 }
87 
88 
~DataBase()89 DataBase::~DataBase()
90 {
91          //qDebug() << "DataBase::~DataBase"  << QT_ENDL;
92 }
93 
94 //void DataBase::slotPrintErrors(QString _func, QString _msg, int _level)
95 //{
96     //qDebug() << "DataBase::slotPrintErrors: FUNC: " << _func << QT_ENDL;
97     //qDebug() << "DataBase::slotPrintErrors: MSG: " << _msg << QT_ENDL;
98     //qDebug() << "DataBase::slotPrintErrors: LEVEL: " << QString::number(_level) << QT_ENDL;
99 //}
100 
getSoftVersion()101 QString DataBase::getSoftVersion()
102 {
103     QSqlQuery query;
104 
105     QString stringQuery ("SELECT MAX (softversion) FROM softwarecontrol");
106     bool sqlOK = query.exec(stringQuery);
107 
108     if (sqlOK)
109     {
110         query.next();
111         if (query.isValid())
112         {
113             return (query.value(0)).toString();
114         }
115         else
116         {
117             query.finish();
118             return QString();
119         }
120     }
121     else
122     { //ERROR in Query execution
123         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
124         query.finish();
125         return QString();
126     }
127 }
128 
getDBVersion()129 QString DataBase::getDBVersion()
130 {
131     QSqlQuery query;
132 
133     QString stringQuery ("SELECT MAX (dbversion) FROM softwarecontrol");
134     bool sqlOK = query.exec(stringQuery);
135 
136     if (sqlOK)
137     {
138         query.next();
139         if (query.isValid())
140         {
141             return QString::number((query.value(0)).toDouble(), 'f', 3);
142         }
143         else
144         {
145              query.finish();
146             return QString();
147         }
148     }
149     else
150     { //ERROR in Query execution
151         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
152         query.finish();
153         return QString();
154     }
155 }
156 
157 /*
158  bool DataBase::setDir(const QString &_dir)
159 {
160     dbDir = _dir;
161     return true;
162 }
163 */
164 
getDBName()165 QString DataBase::getDBName()
166 {
167     return db.databaseName();
168 }
169 
getColumnNamesFromTable(const QString & _tableName)170 QStringList DataBase::getColumnNamesFromTable(const QString &_tableName)
171 {
172       //qDebug() << "DataBase::getColumnNamesFromTable: " << _tableName << QT_ENDL;
173    QSqlQuery query;
174 
175    QString queryString = QString("PRAGMA table_info('%1')").arg(_tableName);
176 
177    bool sqlOK = query.exec(queryString);
178    QStringList list;
179    list.clear();
180     QString aux;
181    if (sqlOK)
182    {
183           //qDebug() << "DataBase::getColumnNamesFromTable: OK" << QT_ENDL;
184        while(query.next())
185        {
186            if (query.isValid())
187            {
188                 aux = (query.value(1)).toString();
189                if (( aux.toUpper() != "ID" ) && (aux.length()>0))
190                {
191                    list << aux;
192                       //qDebug() << "DataBase::getColumnNamesFromTable: " << (query.value(1)).toString() << QT_ENDL;
193                }
194            }
195        }
196        query.finish();
197     }
198     else
199     {
200        queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
201     }
202     query.finish();
203        //qDebug() << "DataBase::getColumnNamesFromTable: " << QString::number(list.size()) << QT_ENDL;
204     return list;
205 }
206 
compress()207 void DataBase::compress()
208 {
209     //qDebug() << "DataBase::compress " << QT_ENDL;
210     //QSqlDatabase db = QSqlDatabase::database();
211     if (!db.open()) { /* Flawfinder: ignore */
212         QMessageBox::warning(nullptr, QObject::tr("Database Error"),
213                              db.lastError().text());
214     }
215    else
216     {
217         db.exec("VACUUM;");
218     }
219 }
220 
reConnect(const QString & _DBName)221 bool DataBase::reConnect(const QString &_DBName)
222 {
223        //qDebug() << "DataBase::reConnect:"  << QT_ENDL;
224     db.close();
225     dbName = _DBName;
226         //qDebug() << "DataBase::reConnect: DB closed"  << QT_ENDL;
227         //qDebug() << "DataBase::reConnect: DB: " << dbDir  << QT_ENDL;
228     bool sqlOK =  createConnection(Q_FUNC_INFO);
229     if (!sqlOK)
230     {
231    //// emit debugLog(Q_FUNC_INFO, "1", 7);
232     }
233     return sqlOK;
234         //qDebug() << "DataBase::reConnect: END"  << QT_ENDL;
235 }
236 
createConnection(const QString & function,bool newDB)237 bool DataBase::createConnection(const QString &function, bool newDB)
238 {
239    //qDebug() << "DataBase::createConnection: " << function << "-" << QString::number(dbVersion) << "/" << softVersion << QT_ENDL;
240     QString stringQuery;
241     QSqlQuery query;
242 
243     if (!db.isOpen())
244     {
245        //qDebug() << "DataBase::createConnection: DB NOT Opened" << QT_ENDL;
246         if (db.isValid())
247         {
248             //qDebug() << "DataBase::createConnection: DB is Valid"  << QT_ENDL;
249         }
250         else
251         {
252            //qDebug() << "DataBase::createConnection: DB is not valid, let's call addDataBase"  << QT_ENDL;
253             if (db.isOpen())
254             {
255              //qDebug() << "DataBase::createConnection: DB is already open"  << QT_ENDL;
256             }
257             else
258             {
259                //qDebug() << "DataBase::createConnection: DB is NOT open, let's open: connection name" << db.connectionName()<< QT_ENDL;
260                 QSqlDatabase::removeDatabase("qt_sql_default_connection");
261                 db = QSqlDatabase::addDatabase("QSQLITE");
262             }
263 
264            //qDebug() << "DataBase::createConnection: Now we call setDatabaseName"  << QT_ENDL;
265             db.setDatabaseName(dbName);
266            //qDebug() << "DataBase::createConnection: end of not valid"  << QT_ENDL;
267         }
268        //qDebug() << "DataBase::createConnection: end of valid check, let's try if it is open"  << QT_ENDL;
269         if (!db.open()) /* Flawfinder: ignore */
270         {
271         //qDebug() << "DataBase::createConnection:Not open "  << QT_ENDL;
272             QMessageBox::warning(nullptr, QObject::tr("Database Error"), db.lastError().text());
273               //qDebug() << "DataBase::createConnection: DB creation ERROR"  << QT_ENDL;
274            //// emit debugLog(Q_FUNC_INFO, "1", 7);
275             return false;
276         }
277         else
278         {
279            //qDebug() << "DataBase::createConnection: created and opened after the creation" << QT_ENDL;
280             if (isTheDBCreated())
281             {
282            //qDebug() << "DataBase::createConnection: DB Exists"  << QT_ENDL;
283             }
284             else
285             {
286            //qDebug() << "DataBase::createConnection: DB does not exist"  << QT_ENDL;
287                 createDataBase();
288            //qDebug() << "DataBase::createConnection: After creation"  << QT_ENDL;
289                 stringQuery ="PRAGMA main.page_size = 4096;";
290                 query.exec(stringQuery);
291                 stringQuery ="PRAGMA main.cache_size=10000;";
292                 query.exec(stringQuery);
293                 stringQuery ="PRAGMA main.locking_mode=EXCLUSIVE;";
294                 query.exec(stringQuery);
295                 stringQuery ="PRAGMA main.synchronous=NORMAL;";
296                 query.exec(stringQuery);
297                 stringQuery ="PRAGMA main.journal_mode=WAL;";
298                 query.exec(stringQuery);
299                 stringQuery ="PRAGMA main.cache_size=5000;";
300                 query.exec(stringQuery);
301                 stringQuery ="PRAGMA synchronous=OFF;";
302                 query.exec(stringQuery);
303                 stringQuery ="PRAGMA main.temp_store = MEMORY;";
304                 query.exec(stringQuery);
305                 //stringQuery="PRAGMA auto_vacuum = FULL;";
306                 //query.exec(stringQuery);
307                 stringQuery ="PRAGMA case_sensitive_like=OFF;";
308                 query.exec(stringQuery);
309             }
310         }
311     }
312     else
313     {
314       //qDebug() << "DataBase::createConnection: No Error, DB is open" << QT_ENDL;
315     }
316      //qDebug() << "DataBase::createConnection: Going to run - createBandModeMaps " << QT_ENDL;
317 
318     if (createBandModeMaps())
319     {
320          //qDebug() << "DataBase::createConnection: createBandModeMaps true" << QT_ENDL;
321     }
322     else
323     {
324           //qDebug() << "DataBase::createConnection: createBandModeMaps false Stop" << QT_ENDL;
325     }
326     //created = true;
327    //qDebug() << "DataBase::createConnection -------------------------------------------- END" << QT_ENDL;
328 
329     return unMarkAllQSO();
330 }
331 
isTheDBCreated()332 bool DataBase::isTheDBCreated()
333 {
334     //qDebug() << "DataBase::isTheDBCreated: Called from: " << QString::number(constrid)  << QT_ENDL;
335     QSqlQuery query;
336     int _num = 0;
337 
338     QString stringQuery ("SELECT count(id) FROM softwarecontrol");
339     bool sqlOK = query.exec(stringQuery);
340 
341     if (sqlOK)
342     {
343            //qDebug() << "DataBase::isTheDBCreated - SQL OK"  << QT_ENDL;
344         query.next();
345         if (query.isValid())
346         {
347                 //qDebug() << "DataBase::isTheDBCreated - valid"  << QT_ENDL;
348             _num = (query.value(0)).toInt();
349             if (_num > 0)
350             {
351                 //qDebug() << "DataBase::isTheDBCreated - DB Exists"  << QT_ENDL;
352                 //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END TRUE" << QT_ENDL;
353                  query.finish();
354                 return true;
355             }
356             else
357             {
358                     //qDebug() << "DataBase::isTheDBCreated - DB does not Exist"  << QT_ENDL;
359                     //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-1" << QT_ENDL;
360                  query.finish();
361                 //// emit debugLog(Q_FUNC_INFO, "1", 7);
362                 return false;
363             }
364         }
365         else
366         {
367                 //qDebug() << "DataBase::isTheDBCreated - not valid"  << QT_ENDL;
368                 //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-2" << QT_ENDL;
369              query.finish();
370             //// emit debugLog(Q_FUNC_INFO, "2", 7);
371             return false;
372         }
373     }
374     else
375     { //ERROR in Query execution
376            //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------ ERROR IN QUERY EXECUTION" << QT_ENDL;
377         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
378         query.finish();
379        //// emit debugLog(Q_FUNC_INFO, "3", 7);
380         return false;
381     }
382     //query.finish();
383        //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-X" << QT_ENDL;
384     //return false;
385 }
386 
recreateTableLog()387 bool DataBase::recreateTableLog()
388 {
389     //qDebug() << "DataBase::recreateTableLog" << QT_ENDL;
390 
391     if (!createTableLog(false))         // Create modetemp
392     {
393         //qDebug() << "DataBase::recreateTableLog: CreateTableLog returned false" << QT_ENDL;
394        //// emit debugLog(Q_FUNC_INFO, "1", 7);
395         return false;
396     }
397 
398     QString queryString;
399     queryString.clear();
400     QStringList columns;
401     columns.clear();
402     columns << getColumnNamesFromTable("log");
403 
404     queryString =  columns.first();
405 
406     for (int i=1;i<columns.size()-1;i++)
407     {
408         if ( !(columns.at(i) == "time_on") && !(columns.at(i) == "time_off")  )
409         {
410             queryString = queryString + ", " + columns.at(i);
411         }
412     }
413 
414     queryString = "INSERT INTO logtemp (" + queryString + ", " + columns.last() + ") SELECT " + queryString + ", " + columns.last() + " FROM log";
415 
416     if (execQuery(Q_FUNC_INFO, queryString))
417     {
418         if (execQuery(Q_FUNC_INFO, "DROP table log"))
419         {
420             if (execQuery(Q_FUNC_INFO, "ALTER TABLE logtemp RENAME TO log"))
421             {
422                 return true;
423             }
424             else
425             {
426                 //qDebug() << "recreateTableLog ERROR - logTemp not renamed" << QT_ENDL;
427                //// emit debugLog(Q_FUNC_INFO, "2", 7);
428                 return false;
429             }
430         }
431         else
432         {
433             //qDebug() << "recreateTableLog ERROR - log table not dropped" << QT_ENDL;
434         }
435     }
436     else
437     {
438         //qDebug() << "recreateTableLog ERROR - Data not moved" << QT_ENDL;
439        //// emit debugLog(Q_FUNC_INFO, "3", 7);
440         return false;
441     }
442        //qDebug() << "recreateTableLog END" << QT_ENDL;
443     return true;
444 }
445 
createTableLog(bool temp)446 bool DataBase::createTableLog(bool temp)
447 { //Creates a temporal table or the normal one.
448     QString stringQuery = QString();
449     if (temp)
450     {
451         stringQuery = "CREATE TABLE log" ;
452             //qDebug() << "DataBase::createTableLog: log"  << QT_ENDL;
453     }
454     else
455     {
456         stringQuery = "CREATE TABLE logtemp" ;
457             //qDebug() << "DataBase::createTableLog: logtemp"  << QT_ENDL;
458     }
459              stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, "
460              "qso_date DATETIME NOT NULL, " // 2020-01-01 10:12:01
461              "call VARCHAR(40) NOT NULL, "
462              "rst_sent VARCHAR, "
463              "rst_rcvd VARCHAR, "
464              "bandid INTEGER NOT NULL, "
465              "modeid INTEGER NOT NULL, "
466              "cqz INTEGER, "
467              "ituz INTEGER, "
468              "dxcc INTEGER, "
469              "address VARCHAR, "
470              "age INTEGER, "
471              "cnty VARCHAR, "
472              "comment VARCHAR, "
473              "a_index INTEGER, "
474              "ant_az INTEGER, "
475              "ant_el INTEGER, "
476              "ant_path INTEGER, "
477              "arrl_sect INTEGER, "
478              "award_submitted VARCHAR, "
479              "award_granted VARCHAR, "
480              "band_rx INTEGER, "
481              "checkcontest VARCHAR, "
482              "class VARCHAR, "
483              "clublog_qso_upload_date DATETIME, "
484              "clublog_qso_upload_status VARCHAR(1), "
485              "cont VARCHAR(2), "
486              "contacted_op VARCHAR(40), "
487              "contest_id VARCHAR, "
488              "country VARCHAR, "
489              "credit_submitted VARCHAR, "
490              "credit_granted VARCHAR, "
491              "darc_dok VARCHAR,"
492              "distance INTEGER, "
493              "email VARCHAR, "
494              "eq_call VARCHAR, "
495              "eqsl_qslrdate DATETIME, "
496              "eqsl_qslsdate DATETIME, "
497              "eqsl_qsl_rcvd VARCHAR(1), "
498              "eqsl_qsl_sent VARCHAR(1), "
499              "fists INTEGER, "
500              "fists_cc INTEGER, "
501              "force_init INTEGER, "
502              "freq VARCHAR, "
503              "freq_rx VARCHAR, "
504              "gridsquare VARCHAR, "
505              "guest_op VARCHAR,"
506              "hrdlog_qso_upload_date DATETIME, "
507              "hrdlog_qso_upload_status  VARCHAR(1), "
508              "iota VARCHAR(6), "
509              "iota_island_id VARCHAR, "
510              "k_index INTEGER, "
511              "lat VARCHAR(11), "
512              "lon VARCHAR(11), "
513              "lotw_qslrdate DATETIME, "
514              "lotw_qslsdate DATETIME, "
515              "lotw_qsl_rcvd VARCHAR(1), "
516              "lotw_qsl_sent VARCHAR(1), "
517              "max_bursts INTEGER, "
518              "multiplier INTEGER,"
519              "ms_shower VARCHAR, "
520              "my_antenna VARCHAR,"
521              "my_city VARCHAR, "
522              "my_cnty VARCHAR, "
523              "my_country INTEGER, "
524              "my_cq_zone INTEGER, "
525              "my_dxcc INTEGER, "
526              "my_fists INTEGER, "
527              "my_gridsquare VARCHAR, "
528              "my_iota VARCHAR(6), "
529              "my_iota_island_id VARCHAR, "
530              "my_itu_zone INTEGER ,"
531              "my_lat VARCHAR(11), "
532              "my_lon VARCHAR(11), "
533              "my_name VARCHAR, "
534              "my_postal_code VARCHAR ,"
535              "my_rig VARCHAR, "
536              "my_sig VARCHAR, "
537              "my_sig_info VARCHAR, "
538              "my_sota_ref VARCHAR, "
539              "my_state VARCHAR, "
540              "my_street VARCHAR, "
541              "my_usaca_counties VARCHAR, "
542              "my_vucc_grids VARCHAR, "
543              "name VARCHAR, "
544              "notes VARCHAR, "
545              "nr_bursts INTEGER, "
546              "nr_pings INTEGER, "
547              "operator VARCHAR, "
548              "owner_callsign VARCHAR, "
549              "pfx VARCHAR, "
550              "points INTEGER,"
551              "precedence VARCHAR, "
552              "prop_mode VARCHAR, "
553              "public_key VARCHAR, "
554              "qrzcom_qso_upload_date DATETIME, "
555              "qrzcom_qso_upload_status VARCHAR(1), "
556              "qslmsg VARCHAR, "
557              "qslrdate DATETIME, "
558              "qslsdate DATETIME, "
559              "qsl_rcvd VARCHAR(1), "
560              "qsl_sent VARCHAR(1), "
561              "qsl_rcvd_via VARCHAR(1), "
562              "qsl_sent_via VARCHAR(1), "
563              "qsl_via VARCHAR, "
564              "qso_complete VARCHAR(1), "
565              "qso_random INTEGER, "
566              "qth VARCHAR, "
567              "region VARCHAR, "
568              "rig VARCHAR, "
569              "rx_pwr REAL, "
570              "sat_mode VARCHAR, "
571              "sat_name VARCHAR, "
572              "sfi INTEGER, "
573              "sig VARCHAR, "
574              "sig_info VARCHAR, "
575              "silent_key VARCHAR(1), "
576              "skcc VARCHAR, "
577              "sota_ref VARCHAR, "
578              "srx_string VARCHAR, "
579              "srx VARCHAR(10), "
580              "stx_string VARCHAR, "
581              "stx VARCHAR(10), "
582              "state VARCHAR, "
583              "station_callsign VARCHAR, "
584              "submode VARCHAR,"
585              "swl INTEGER, "
586              "uksmg INTEGER, "
587              "usaca_counties VARCHAR, "
588              "ve_prov VARCHAR, "
589              "vucc_grids VARCHAR, "
590              "ten_ten INTEGER, "
591              "tx_pwr REAL, "
592              "web VARCHAR, "
593              "qso_date_off DATETIME, " //2020-01-01
594              "transmiterid VARCHAR, "
595              "marked VARCHAR(1), "
596              "lognumber INTEGER NOT NULL, "
597 
598              "UNIQUE (call, qso_date, bandid, modeid, lognumber), "
599              "FOREIGN KEY (qso_complete) REFERENCES qso_complete_enumeration, "
600              "FOREIGN KEY (qsl_rcvd_via) REFERENCES qsl_via_enumeration, "
601              "FOREIGN KEY (qsl_sent_via) REFERENCES qsl_via_enumeration, "
602              "FOREIGN KEY (qsl_rcvd) REFERENCES qsl_rec_status, "
603              "FOREIGN KEY (qsl_sent) REFERENCES qsl_sent_status, "
604              "FOREIGN KEY (prop_mode) REFERENCES prop_mode_enumeration, "
605              "FOREIGN KEY (my_country) REFERENCES entity, "
606              "FOREIGN KEY (lotw_qsl_rcvd) REFERENCES qsl_rec_status, "
607              "FOREIGN KEY (lotw_qsl_sent) REFERENCES qsl_sent_status, "
608              "FOREIGN KEY (eqsl_qsl_rcvd) REFERENCES qsl_rec_status, "
609              "FOREIGN KEY (eqsl_qsl_sent) REFERENCES qsl_sent_status, "
610              "FOREIGN KEY (credit_submitted) REFERENCES award_enumeration, "
611              "FOREIGN KEY (credit_granted) REFERENCES award_enumeration, "
612              "FOREIGN KEY (country) REFERENCES entity, "
613              "FOREIGN KEY (ant_path) REFERENCES ant_path_enumeration, "
614              "FOREIGN KEY (arrl_sect) REFERENCES arrl_sect_enumeration, "
615              "FOREIGN KEY (band_rx) REFERENCES band, "
616              "FOREIGN KEY (modeid) REFERENCES mode, "
617              "FOREIGN KEY (submode) REFERENCES mode, "
618              "FOREIGN KEY (dxcc) REFERENCES entity, "
619              "FOREIGN KEY (bandid) REFERENCES band)");
620 
621          //qDebug() << "DataBase::createTableLog: " << stringQuery  << QT_ENDL;
622 
623     if (execQuery(Q_FUNC_INFO, stringQuery))
624     {
625         return true;
626     }
627     else
628     {
629        //// emit debugLog(Q_FUNC_INFO, "1", 7);
630         return false;
631     }
632 /*
633     bool sqlOK = query.exec(stringQuery);
634 
635     while (query.isActive())
636     {query.finish();}
637     if (sqlOK)
638     {
639         return true;
640     }
641     else
642     {
643         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
644         return false;
645     }
646 */
647 }
648 
createDataBase()649 bool DataBase::createDataBase()
650 {
651     //qDebug() << "DataBase::createDataBase ------------------------------------- START" << QString::number(constrid)  << QT_ENDL;
652     //QSqlQuery query;
653     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists log");
654     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists band");
655     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists mode");
656     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists prefixesofentity");
657     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists continent");
658     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists entity");
659     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists softwarecontrol");
660 
661     QString stringQuery = QString ("CREATE TABLE softwarecontrol ("
662                 "id INTEGER PRIMARY KEY AUTOINCREMENT, "
663                 "dateupgrade VARCHAR(10) NOT NULL, "
664                 "softversion REAL NOT NULL, "
665                 "dbversion REAL NOT NULL)");
666 
667     execQuery(Q_FUNC_INFO, stringQuery);
668 
669     updateDBVersion(softVersion, QString::number(DBVersionf));
670 
671     createTableBand(true);
672     populateTableBand(true);
673 
674     createTableMode(true);
675     populateTableMode(true);
676 
677     createTableSatellites(true);
678     populateTableSatellites(true);
679 
680     createTableLog(true);
681 
682     createTableEntity(true);
683     createTableSubdivision(true);
684 
685       //http://www.sqlite.org/lang_datefunc.html
686       /*
687        "confirmed INTEGER NOT NULL, "
688       confirmed means:
689       confirmed = 0     Set as Worked
690       confirmed = 1     Set as Confirmed
691       */
692 
693       stringQuery = QString("CREATE TABLE continent ("
694                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
695                  "shortname VARCHAR(2) NOT NULL, "
696                  "name VARCHAR(15) NOT NULL)");
697     execQuery(Q_FUNC_INFO, stringQuery);
698       stringQuery = QString("CREATE TABLE ant_path_enumeration ("
699                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
700                  "shortname VARCHAR(1) NOT NULL, "
701                  "name VARCHAR(15) NOT NULL)");
702     execQuery(Q_FUNC_INFO, stringQuery);
703       stringQuery = QString("CREATE TABLE arrl_sect_enumeration ("
704                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
705                  "shortname VARCHAR(2) NOT NULL, "
706                  "name VARCHAR(30) NOT NULL)");
707 
708     execQuery(Q_FUNC_INFO, stringQuery);
709       stringQuery = QString("CREATE TABLE qso_complete_enumeration ("
710                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
711                  "shortname VARCHAR(3) NOT NULL, "
712                  "name VARCHAR(10) NOT NULL)");
713     execQuery(Q_FUNC_INFO, stringQuery);
714 
715       createTableContest();
716 
717       stringQuery = QString("CREATE TABLE contestcategory ("
718                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
719                  "shortname VARCHAR(20) NOT NULL, "
720                  "name VARCHAR(40) NOT NULL)");
721     execQuery(Q_FUNC_INFO, stringQuery);
722 
723       stringQuery = QString("CREATE TABLE award_enumeration ("
724                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
725                  "name VARCHAR(15) NOT NULL)");
726 
727     execQuery(Q_FUNC_INFO, stringQuery);
728       stringQuery = QString("CREATE TABLE prefixesofentity ("
729                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
730                  "prefix VARCHAR(15) NOT NULL,"
731                  "dxcc INTEGER NOT NULL,"
732                  "cqz INTEGER NOT NULL,"
733                  "ituz INTEGER NOT NULL,"
734                  "UNIQUE (prefix, dxcc), "
735                  "FOREIGN KEY (dxcc) REFERENCES entity)");
736     execQuery(Q_FUNC_INFO, stringQuery);
737 
738     createTableAwardDXCC();
739     createTableAwardWAZ();
740 
741       stringQuery = QString("CREATE TABLE qsl_rec_status ("
742                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
743                  "shortname VARCHAR(1) NOT NULL, "
744                  "name VARCHAR(15) NOT NULL)");
745       execQuery(Q_FUNC_INFO, stringQuery);
746 
747       stringQuery = QString("CREATE TABLE qsl_sent_status ("
748                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
749                  "shortname VARCHAR(1) NOT NULL, "
750                  "name VARCHAR(15) NOT NULL)");
751       execQuery(Q_FUNC_INFO, stringQuery);
752 
753     createTableQSL_Via_enumeration();
754     populateTableQSL_Via_enumeration();
755 
756 
757       createTablePropModes();
758       createTableLogs(true);
759       createTableClubLogStatus();
760       populateTableClubLogStatus();
761 
762     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('Y', 'Yes')");
763     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('N', 'No')");
764     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('R', 'Requested')");
765     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('Q', 'Queued')");
766     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_sent_status (shortname, name) VALUES ('I', 'Ignore/Invalid')");
767 
768 
769     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('Y', 'Yes')");
770     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('N', 'No')");
771     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('R', 'Requested')");
772     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('I', 'Ignore/Invalid')");
773     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_rec_status (shortname, name) VALUES ('V', 'Validated')");
774 
775 
776       execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('AF', 'Africa')");
777       execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('AS', 'Asia')");
778       execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('EU', 'Europe')");
779       execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('NA', 'North America')");
780       execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('OC', 'Oceania')");
781       execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('SA', 'South America')");
782       execQuery(Q_FUNC_INFO, "INSERT INTO continent (shortname, name) VALUES ('AN', 'Antartica')");
783 
784       populateContestData();
785       populatePropagationModes();
786 
787     execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('G', 'GrayLine')");
788     execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('O', 'Other')");
789     execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('S', 'ShortPath')");
790     execQuery(Q_FUNC_INFO, "INSERT INTO ant_path_enumeration (shortname, name) VALUES ('L', 'LongPath')");
791 
792     execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AL', 'Alabama')");
793 /*
794     execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AK', 'Alaska')");
795     execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AB', 'Alberta')");
796     execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AR', 'Arkansas')");
797     execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('AZ', 'Arizona')");
798     execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('BC', 'British Columbia')");
799     execQuery(Q_FUNC_INFO, "INSERT INTO arrl_sect_enumeration (shortname, name) VALUES ('CO', 'Colorado')");
800 */
801 
802     //TODO: Awards are deprecated
803     execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('AJA')");
804     execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('CQDX')");
805     execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('CQDXFIELD')");
806     execQuery(Q_FUNC_INFO, "INSERT INTO award_enumeration (name) VALUES ('DXCC')");
807 
808     execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('Y', 'Yes')");
809     execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('N', 'No')");
810     execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('NIL', 'Not heard')");
811     execQuery(Q_FUNC_INFO, "INSERT INTO qso_complete_enumeration (shortname, name) VALUES ('?', 'Uncertain')");
812 
813    //qDebug() << "DataBase::createDataBase ------------------------------------- END"  << QT_ENDL;
814     return true;
815 }
816 
recreateTableDXCC()817 bool DataBase::recreateTableDXCC()
818 {
819     //QSqlQuery query;
820     if (execQuery(Q_FUNC_INFO, "DROP TABLE awarddxcc"))
821     {
822         return createTableAwardDXCC();
823     }
824     return true;
825 }
826 
createTableAwardDXCC()827 bool DataBase::createTableAwardDXCC()
828 {
829       return execQuery(Q_FUNC_INFO, "CREATE TABLE awarddxcc ("
830                              "id INTEGER PRIMARY KEY AUTOINCREMENT, "
831                              "dxcc INTEGER NOT NULL,"
832                              "band INTEGER NOT NULL, "
833                              "mode INTEGER NOT NULL, "
834                              "confirmed INTEGER, "
835                              "qsoid INTEGER NOT NULL, "
836                              "lognumber INTEGER, "
837                              "UNIQUE (dxcc, band, mode, lognumber), "
838                              "FOREIGN KEY (dxcc) REFERENCES entity, "
839                              "FOREIGN KEY (band) REFERENCES band, "
840                              "FOREIGN KEY (mode) REFERENCES mode, "
841                              "FOREIGN KEY (qsoid) REFERENCES log)");
842 
843     /*
844     In awarddxcc confirmed means:
845     confirmed = 0     Set as Worked
846     confirmed = 1     Set as Confirmed
847     */
848 }
849 
recreateTableWAZ()850 bool DataBase::recreateTableWAZ()
851 {
852     //QSqlQuery query;
853 
854     if (execQuery(Q_FUNC_INFO, "DROP TABLE awardwaz"))
855     {
856         return createTableAwardWAZ();
857     }
858     return true;
859 }
860 
createTableAwardWAZ()861 bool DataBase::createTableAwardWAZ()
862 {
863     return execQuery(Q_FUNC_INFO, "CREATE TABLE awardwaz ("
864                            "id INTEGER PRIMARY KEY AUTOINCREMENT, "
865                            "cqz INTEGER NOT NULL,"
866                            "band INTEGER NOT NULL, "
867                            "mode INTEGER NOT NULL, "
868                            "confirmed INTEGER, "
869                            "qsoid INTEGER NOT NULL, "
870                            "lognumber INTEGER, "
871                            "UNIQUE (cqz, band, mode, lognumber), "
872                            "FOREIGN KEY (band) REFERENCES band, "
873                            "FOREIGN KEY (mode) REFERENCES mode, "
874                            "FOREIGN KEY (qsoid) REFERENCES log)");
875     /*
876     In awardwaz confirmed means:
877     confirmed = 0     Set as Worked
878     confirmed = 1     Set as Confirmed
879     */
880 }
881 
882 
883 
createTableSubdivision(const bool NoTmp)884 bool DataBase::createTableSubdivision(const bool NoTmp)
885 {
886     //qDebug() << "DataBase::createTableSubdivisions" << QT_ENDL;
887     // NoTmp = false => TMP data table to operate and be deleted afterwards
888     //qDebug() << "DataBase::createTableSubdivisions" << QT_ENDL;
889 
890     QString stringQuery = QString();
891     QString table = QString();
892     if (NoTmp)
893     {
894         table = "primary_subdivisions" ;
895     }
896     else
897     {
898         table = "primary_subdivisionstemp" ;
899     }
900 
901     stringQuery = "CREATE TABLE "+ table;
902 
903     stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, "
904         "dxcc INTEGER NOT NULL, "
905         "name VARCHAR NOT NULL, "
906         "shortname VARCHAR NOT NULL, "
907         "prefix VARCHAR, "
908         "cqz INTEGER NOT NULL, "
909         "ituz INTEGER NOT NULL, "
910         "regionalgroup VARCHAR, "
911         "regionalid INTEGER, "
912         "start_date DATETIME, "
913         "end_date DATETIME, "
914         "deleted VARCHAR, "
915         "UNIQUE (id, shortname, name), "
916         "FOREIGN KEY (cqz) REFERENCES entity, "
917         "FOREIGN KEY (ituz) REFERENCES entity, "
918         "FOREIGN KEY (dxcc) REFERENCES entity)");
919 
920     QString delS = QString();
921     delS = "DROP TABLE IF exists " + table;
922     execQuery(Q_FUNC_INFO, delS);
923     //qDebug() << "DataBase::createTableSubdivision - END" << QT_ENDL;
924     return execQuery(Q_FUNC_INFO, stringQuery);
925 
926     //qDebug() << "DataBase::createTableSubdivision - END" << QT_ENDL;
927 }
928 
929 
getBandIdFromName(const QString & b)930 int DataBase::getBandIdFromName(const QString &b)
931 {
932     //qDebug() << "DataBase::getBandIdFromName: " << b << QT_ENDL;
933     QString band = b.toUpper();
934     QSqlQuery query;
935     if (isValidBand(band))
936     {
937         QString queryString = QString("SELECT id FROM band WHERE name='%1'").arg(band);
938 
939         bool sqlOK = query.exec(queryString);
940 
941         if (sqlOK)
942         {
943             query.next();
944             if ( query.isValid() )
945             {
946                 //qDebug() << "DataBase::getBandIdFromName: OK" << QString::number((query.value(0)).toInt()) << QT_ENDL;
947                 int v = (query.value(0)).toInt();
948                 query.finish();
949                 return v;
950             }
951             else
952             {
953                 //qDebug() << "DataBase::getBandIdFromName: NOK 1" << QT_ENDL;
954                 query.finish();
955                 return -1;
956             }
957         }
958         else
959         {
960             queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
961             query.finish();
962             return -2;
963         }
964         //qDebug() << "DataBase::getBandIdFromName: NOK 3" << QT_ENDL;
965     }
966     else
967     {
968            //qDebug() << "DataBase::getBandIdFromName: BAND NOT VALID: " << band << QT_ENDL;
969     }
970     //qDebug() << "DataBase::getBandIdFromName: Will return -3 from: " << band << QT_ENDL;
971     query.finish();
972     return -3;
973 }
974 
getModeIdFromName(const QString & b)975 int DataBase::getModeIdFromName(const QString &b)
976 {
977        //qDebug() << "DataBase::getModeIdFromName: " << b << QT_ENDL;
978     QSqlQuery query;
979     if (isValidMode(b, false))
980     {
981         QString queryString = QString("SELECT id FROM mode WHERE name='%1'").arg(b);
982             //qDebug() << "DataBase::getModeIdFromName: queryString: " << queryString << QT_ENDL;
983         bool sqlOK = query.exec(queryString);
984 
985         if (sqlOK)
986         {
987             query.next();
988             if ( query.isValid() )
989             {
990                     //qDebug() << "DataBase::getModeIdFromName: OK" << QString::number((query.value(0)).toInt()) << QT_ENDL;
991                 return (query.value(0)).toInt();
992             }
993             else
994             {
995                     //qDebug() << "DataBase::getModeIdFromName: NOK 1" << QT_ENDL;
996                 query.finish();
997                 return -1;
998             }
999         }
1000         else
1001         {
1002             queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1003             query.finish();
1004         }
1005     }
1006         //qDebug() << "DataBase::getModeIdFromName: NOK 3" << QT_ENDL;
1007     query.finish();
1008     return -1;
1009 }
1010 
1011 
getModeIdFromSubMode(const QString & b)1012 int DataBase::getModeIdFromSubMode(const QString &b)
1013 {
1014      //qDebug() << "DataBase::getModeIdFromSubMode: " << b << QT_ENDL;
1015      QSqlQuery query;
1016      QString queryString = QString("SELECT id FROM mode WHERE submode='%1'").arg(b);
1017 /*
1018      if (_tmp)
1019      {
1020          queryString = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(b);
1021      }
1022      else
1023      {
1024          queryString = QString("SELECT id FROM mode WHERE submode='%1'").arg(b);
1025      }
1026 */
1027      bool sqlOK = query.exec(queryString);
1028 
1029      if (sqlOK)
1030      {
1031          query.next();
1032          if (query.isValid())
1033          {
1034                   //qDebug() << "DataBase::getModeIdFromName: OK - Mode: " << b << " - " << (query.value(0)).toString() << QT_ENDL;
1035              return (query.value(0)).toInt();
1036          }
1037          else
1038          {
1039                   //qDebug() << "DataBase::getModeIdFromName: NOK 1" << "-------- END"<< QT_ENDL;
1040              query.finish();
1041              return -1;
1042          }
1043      }
1044      else
1045      {
1046               //qDebug() << "DataBase::getModeIdFromName: NOK 2" << "-------- END"<< QT_ENDL;
1047          queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1048          query.finish();
1049          return -1;
1050      }
1051          //qDebug() << "DataBase::getModeIdFromName: NOK 3" << "-------- END"<< QT_ENDL;
1052      //query.finish();
1053      //return -1;
1054 }
1055 
getBandNameFromNumber(const int _n)1056 QString DataBase::getBandNameFromNumber(const int _n)
1057 {
1058     //qDebug() << "DataBase::getBandNameFromNumber: " << QString::number(_n) << QT_ENDL;
1059     QSqlQuery query;
1060     QString queryString = QString("SELECT name FROM band WHERE id='%1'").arg(_n);
1061 
1062     bool sqlOK = query.exec(queryString);
1063 
1064     if (sqlOK)
1065     {
1066         query.next();
1067         if ( query.isValid() )
1068         {
1069             if ( isValidBand((query.value(0)).toString())  )
1070             {
1071                     //qDebug() << "DataBase::getBandNameFromNumber: " << (query.value(0)).toString() << "-------- END" << QT_ENDL;
1072                 return (query.value(0)).toString();
1073             }
1074             else
1075             {
1076                    //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-1" << QT_ENDL;
1077                 query.finish();
1078                 return QString();
1079             }
1080         }
1081         else
1082         {
1083             //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-2" << QT_ENDL;
1084             query.finish();
1085             return QString();
1086         }
1087     }
1088     else
1089     {
1090         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1091     }
1092     query.finish();
1093     return QString();
1094 }
1095 
1096 
1097 
getModeNameFromNumber(const int _n,bool _tmp)1098 QString DataBase::getModeNameFromNumber(const int _n, bool _tmp)
1099 {
1100     //TODO May fail to identify the sumbode(mode/modetemp... (Review STEP-2 o 3)
1101         //qDebug() << "DataBase::getModeNameFromNumber: " << QString::number(_n) << QT_ENDL;
1102     QSqlQuery query;
1103     QString queryString;
1104     if (_tmp)
1105     {
1106         queryString = QString("SELECT name FROM modetemp WHERE id='%1'").arg(_n);
1107     }
1108     else
1109     {
1110         queryString = QString("SELECT name FROM mode WHERE id='%1'").arg(_n);
1111     }
1112 
1113     bool sqlOK = query.exec(queryString);
1114 
1115 
1116     if (!sqlOK)
1117     {
1118         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1119         query.finish();
1120     }
1121     query.next();
1122          //qDebug() << "DataBase::getModeNameFromNumber: " << QString::number(_n) <<" - " <<  isValidMode((query.value(0)).toString(), _tmp) << QT_ENDL;
1123     if ( query.isValid() )
1124     {
1125             //qDebug() << "DataBase::getModeNameFromNumber: ------ END-1" << QT_ENDL;
1126         return (query.value(0)).toString();
1127         /* In a version when I change the mode table to include submode, this comparison may need to be checked in both versions
1128          * at once, failing the query as old version was not having the column submode
1129          *
1130         if ( isValidMode((query.value(0)).toString(), _tmp))
1131         {
1132                  //qDebug() << "DataBase::getModeNameFromNumber - Found: " << (query.value(0)).toString() << QT_ENDL;
1133             return (query.value(0)).toString();
1134         }
1135         else
1136         {
1137                  //qDebug() << "DataBase::getModeNameFromNumber - Not Valid Mode: " << (query.value(0)).toString()  << QT_ENDL;
1138             return QString();
1139         }
1140         */
1141     }
1142     else
1143     {
1144              //qDebug() << "DataBase::getModeNameFromNumber - Not Valid record"  << QT_ENDL;
1145             //qDebug() << "DataBase::getModeNameFromNumber: ------ END-2" << QT_ENDL;
1146         query.finish();
1147         return QString();
1148     }
1149 }
1150 
getSubModeNameFromNumber(const int _n,bool _tmp)1151 QString DataBase::getSubModeNameFromNumber(const int _n, bool _tmp)
1152 {
1153        //qDebug() << "DataBase::getSubModeNameFromNumber: " << QString::number(_n) << QT_ENDL;
1154     QSqlQuery query;
1155     QString queryString;
1156     if (_tmp)
1157     {
1158         queryString = QString("SELECT submode FROM modetemp WHERE id='%1'").arg(_n);
1159     }
1160     else
1161     {
1162         queryString = QString("SELECT submode FROM mode WHERE id='%1'").arg(_n);
1163     }
1164 
1165     bool sqlOk = query.exec(queryString);
1166 
1167    //qDebug() << "DataBase::getSubModeNameFromNumber - query: " << query.lastQuery() << QT_ENDL;
1168 
1169     if (sqlOk)
1170     {
1171         if (query.next())
1172         {
1173             if ( query.isValid() )
1174             {
1175                 if ( isValidMode((query.value(0)).toString(), _tmp)  )
1176                 {
1177                         //qDebug() << "DataBase::getSubModeNameFromNumber: RETURN: " << (query.value(0)).toString() << QT_ENDL;
1178                     return (query.value(0)).toString();
1179                 }
1180                 else
1181                 {
1182                         //qDebug() << "DataBase::getSubModeNameFromNumber: NO valid mode - END" << QT_ENDL;
1183                     query.finish();
1184                     return QString();
1185                 }
1186             }
1187             else
1188             {
1189                     //qDebug() << "DataBase::getSubModeNameFromNumber: query not valid - END" << QT_ENDL;
1190                 query.finish();
1191                 return QString();
1192             }
1193         }
1194         else
1195         {
1196                 //qDebug() << "DataBase::getSubModeNameFromNumber: query not next - END" << QT_ENDL;
1197             query.finish();
1198             return QString();
1199         }
1200     }
1201     else
1202     {
1203         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1204             //qDebug() << "DataBase::getSubModeNameFromNumber: SQL FALSE - END" << QT_ENDL;
1205         query.finish();
1206         return QString();
1207     }
1208     //qDebug() << "DataBase::getSubModeNameFromNumber: - END-X" << QT_ENDL;
1209     //query.finish();
1210     //return QString();
1211 }
1212 
isValidBand(const QString & b)1213 bool DataBase::isValidBand (const QString &b)
1214 {
1215     //qDebug() << "DataBase::isValidBand: " << b << QT_ENDL;
1216     if (b.length()<1)
1217     {
1218        //// emit debugLog(Q_FUNC_INFO, "1", 7);
1219         return false;
1220     }
1221     QString _band = b.toUpper();
1222 
1223     QSqlQuery query;
1224     QString stringQuery = QString("SELECT id FROM band WHERE name='%1'").arg(_band);
1225     bool sqlOK = query.exec(stringQuery);
1226     if (sqlOK)
1227     {
1228         query.next();
1229         if (query.isValid())
1230         {
1231             query.finish();
1232             return true;
1233         }
1234         else
1235         {
1236             query.finish();
1237            //// emit debugLog(Q_FUNC_INFO, "2", 7);
1238             return false;
1239         }
1240     }
1241     else
1242     {
1243         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1244         query.finish();
1245     }
1246    //emit debugLog(Q_FUNC_INFO, "3", 7);
1247     return false;
1248 }
1249 
isValidMode(const QString & b,const bool _tmp)1250 bool DataBase::isValidMode (const QString &b, const bool _tmp)
1251 {
1252         //qDebug() << "DataBase::isValidMode: " << b << QT_ENDL;
1253     QString stringQuery;
1254     if (b.length()<2)
1255     {
1256        //qDebug() << "DataBase::isValidMode: (length<2) FALSE"  << QT_ENDL;
1257        //emit debugLog(Q_FUNC_INFO, "1", 7);
1258         return false;
1259     }
1260 
1261     if (_tmp)
1262     {
1263         stringQuery = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(b);
1264     }
1265     else
1266     {
1267         stringQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(b);
1268     }
1269 
1270     //stringQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(b);
1271     QSqlQuery query;
1272     bool sqlOK = query.exec(stringQuery);
1273 
1274     if (!sqlOK)
1275     {
1276         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1277         query.finish();
1278     }
1279     query.next();
1280     return query.isValid();
1281 }
1282 
isValidBandNumber(const int b)1283 bool DataBase::isValidBandNumber (const int b)
1284 {
1285         //qDebug() << "DataBase::isValidBandNumber: " << QString::number(b)<< QT_ENDL;
1286     return isValidBand(getBandNameFromNumber(b));
1287 }
1288 
isValidModeNumber(const int b)1289 bool DataBase::isValidModeNumber (const int b)
1290 {
1291         //qDebug() << "DataBase::isValidModeNumber: " << QString::number(b)<< QT_ENDL;
1292     return isValidMode(getModeNameFromNumber(b, false), false);
1293 }
1294 
getBandIdFromFreq(const QString & fr)1295 int DataBase::getBandIdFromFreq(const QString &fr)
1296 {
1297         //qDebug() << "DataBase::getBandIdFromFreq: " << fr << QT_ENDL;
1298     //Freq should be in MHz
1299 
1300     QString queryString = QString("SELECT id FROM band WHERE lower <= '%1' and upper >= '%2'").arg(fr, fr);
1301     QSqlQuery query;
1302 
1303     bool sqlOK = query.exec(queryString);
1304 
1305         //qDebug() << "DataBase::getBandIdFromFreq: Query: " << query.lastQuery() << QT_ENDL;
1306     if (sqlOK)
1307     {
1308            //qDebug() << "DataBase::getBandIdFromFreq: Query OK" << QT_ENDL;
1309         query.next();
1310 
1311 
1312         if (query.isValid())
1313         {
1314                 //qDebug() << "DataBase::getBandIdFromFreq: Query OK - END" << QT_ENDL;
1315             return (query.value(0)).toInt();
1316         }
1317         else
1318         {
1319                 //qDebug() << "DataBase::getBandIdFromFreq: Valid NOK - END" << QT_ENDL;
1320             query.finish();
1321             return -1;
1322         }
1323     }
1324     else
1325     {
1326            //qDebug() << "DataBase::getBandIdFromFreq: Query NOK" << QT_ENDL;
1327            //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().text() << QT_ENDL;
1328            //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().nativeErrorCode() << QT_ENDL;
1329         if (query.lastError().isValid())
1330         {
1331                //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error VALID" << QT_ENDL;
1332         }
1333         else
1334         {
1335                //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error NOT-VALID" << QT_ENDL;
1336         }
1337         //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1338         queryErrorManagement(Q_FUNC_INFO, query.lastError().text(), query.lastError().nativeErrorCode(), query.lastQuery());
1339         query.finish();
1340        return -2;
1341     }
1342     //qDebug() << "DataBase::getBandIdFromFreq: END-X" << QT_ENDL;
1343     //query.finish();
1344     //return -3;
1345 }
1346 
1347 
isThisFreqInBand(const QString & b,const QString & fr)1348 bool DataBase::isThisFreqInBand(const QString &b, const QString &fr)
1349 {//Freq should be in MHz
1350     //qDebug() << "DataBase::isThisFreqInBand: " << b << "/" << fr << QT_ENDL;
1351     if (b.length()<2)
1352     {
1353         //qDebug() << "DataBase::isThisFreqInBand returning false" << QT_ENDL;
1354         return false;
1355     }
1356     int bandNf = getBandIdFromFreq(fr);
1357     int bandN = getBandIDFromName2(b);
1358        //qDebug() << "DataBase::isThisFreqInBand: (b/f)" << QString::number(bandN) << "/" << QString::number(bandNf) << QT_ENDL;
1359     if (bandNf == bandN)
1360     {
1361            //qDebug() << "DataBase::isThisFreqInBand: OK " << b << "/" << fr << QT_ENDL;
1362         return true;
1363     }
1364     else
1365     {
1366            //qDebug() << "DataBase::isThisFreqInBand: NOK " << b << "/" << fr << QT_ENDL;
1367        //// emit debugLog(Q_FUNC_INFO, "1", 7);
1368         return false;
1369     }
1370         //qDebug() << "DataBase::isThisFreqInBand: END" << QT_ENDL;
1371     //return false;
1372 }
1373 
1374 
unMarkAllQSO()1375 bool DataBase::unMarkAllQSO()
1376 {
1377        //qDebug() << "DataBase::unMarkAllQSO" << QT_ENDL;
1378     QString stringQuery = QString("UPDATE log SET marked = 'N' WHERE 1");
1379     return execQuery(Q_FUNC_INFO, stringQuery);
1380 }
1381 
1382 
updateIfNeeded()1383 bool DataBase::updateIfNeeded()
1384 {
1385      //qDebug() << "DataBase::updateIfNeeded - Version: " << QString::number(dbVersion) << QT_ENDL;
1386 
1387 
1388     /**************************************************************************************
1389      * This function should call to bool updateToXXX () being XXX dbVersion and
1390      *
1391      */
1392 
1393     //float aux = 0.0;
1394 
1395     //int nameCol = -1;
1396     //int errorCode = -1;
1397     //bool toBeUpdated = false;
1398     //bool sqlOK;
1399 
1400     QSqlQuery query;
1401     QString stringQuery = QString("SELECT MAX (dbversion) FROM softwarecontrol");
1402     bool sqlOK = query.exec(stringQuery);
1403 
1404     if (sqlOK)
1405     {
1406         query.next();
1407         latestReaded = (query.value(0)).toFloat();
1408     }
1409     else
1410     {
1411         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1412         query.finish();
1413        //// emit debugLog(Q_FUNC_INFO, "1", 7);
1414         return false;
1415     }
1416 
1417     //QSqlQuery query("SELECT dbversion FROM softwarecontrol");
1418     //QSqlRecord rec = query.record();
1419     //query.next();
1420     //latestReaded = (query.value(0)).toFloat();
1421     query.finish();
1422       //qDebug() << "DataBase::updateIfNeeded - LatestReaded: " << QString::number(latestReaded) << QT_ENDL;
1423 
1424     if (latestReaded >= dbVersion)
1425     { // DB is updated, no update is needed
1426           //qDebug() << "DataBase::updateIfNeeded - DB updated (no need to update anything!) " << QT_ENDL;
1427 
1428         //toBeUpdated = false;
1429           //qDebug() << "DataBase::updateIfNeeded - TRUE - END "  << QT_ENDL;
1430         return true;
1431     }
1432     else
1433     { // DB is outdated. We need to update!!
1434           //qDebug() << "DataBase::updateIfNeeded - DB outdated... upgrade starts now! " << QT_ENDL;
1435         QMessageBox msgBox;
1436         msgBox.setWindowTitle("KLog");
1437         msgBox.setText( QObject::tr("KLog DB needs to be upgraded."));
1438         msgBox.setInformativeText( QObject::tr("Do you want to upgrade it now?") + "\n"+ QObject::tr("If DB is not upgraded KLog may not work properly."));
1439         msgBox.setStandardButtons(QMessageBox::Apply | QMessageBox::Discard);
1440         msgBox.setDefaultButton(QMessageBox::Apply);
1441         msgBox.setIcon(QMessageBox::Warning);
1442         msgBox.raise();
1443         //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
1444         msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup);
1445 
1446         int ret = msgBox.exec();
1447 
1448         switch (ret)
1449         {
1450             case QMessageBox::Apply:
1451             // Save was clicked
1452                 backupB4Update();
1453             break;
1454             case QMessageBox::Discard:
1455             // Discard was clicked
1456             break;
1457             default:
1458             // should never be reached
1459                //qDebug() << "DataBase::updateIfNeeded - FALSE - CHECK IF SEEN, shoud not be here! - END "  << QT_ENDL;
1460            //// emit debugLog(Q_FUNC_INFO, "2", 7);
1461                 return false;
1462             //break;
1463         }
1464     }
1465     // If the DB needs to be updated... we update it! :-)
1466      //qDebug() << "DataBase::updateIfNeeded - END!" << QT_ENDL;
1467     return true;
1468 }
1469 
backupB4Update()1470 void DataBase::backupB4Update()
1471 {
1472     //qDebug() << "DataBase::backupB4Update - Start" << QT_ENDL;
1473     QMessageBox msgBox;
1474     msgBox.setWindowTitle("KLog backup");
1475     msgBox.setText( QObject::tr("Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea."));
1476     msgBox.setInformativeText( QObject::tr("Do you want to backup your DB now?") );
1477     msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
1478     msgBox.setDefaultButton(QMessageBox::Yes);
1479     msgBox.setIcon(QMessageBox::Warning);
1480     msgBox.raise();
1481     //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
1482     msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup);
1483 
1484     int ret = msgBox.exec();
1485 
1486     switch (ret)
1487     {
1488         case QMessageBox::Yes:
1489         // Save was clicked
1490             logBackup();
1491         break;
1492         case QMessageBox::No:
1493         // NO backup was selected
1494             updateToLatest();
1495         break;
1496     }
1497     //qDebug() << "DataBase::backupB4Update - END" << QT_ENDL;
1498 }
1499 
logBackup()1500 void DataBase::logBackup()
1501 {
1502     //qDebug() << "DataBase::logBackup - Start" << QT_ENDL;
1503 
1504     QFile DBFile(util->getKLogDBFile());
1505     QString newFile = util->getKLogDBBackupFile();
1506     bool copied = DBFile.copy(newFile);
1507     //qDebug() << "DataBase::logBackup copy: " << newFile << QT_ENDL;
1508     QMessageBox msgBox;
1509     msgBox.setWindowTitle("KLog DB backup");
1510     msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup);
1511     msgBox.setStandardButtons(QMessageBox::Ok);
1512     msgBox.setDefaultButton(QMessageBox::Ok);
1513 
1514     if (copied)
1515     {
1516         //qDebug() << "DataBase::logBackup - DB backup was OK"  << QT_ENDL;
1517         msgBox.setText( QObject::tr("The backup finished successfully."));
1518         msgBox.setInformativeText( QObject::tr("You can find the backup in this file: %1").arg(newFile) );
1519         msgBox.setIcon(QMessageBox::Information);
1520         msgBox.raise();
1521         msgBox.exec();
1522         updateToLatest();
1523     }
1524     else
1525     {
1526         //qDebug() << "DataBase::logBackup - DB backup was NOK"  << QT_ENDL;
1527         msgBox.setText( QObject::tr("The backup was not properly done."));
1528         msgBox.setInformativeText( QObject::tr("You will be sent back to the starting point."));
1529         msgBox.setIcon(QMessageBox::Warning);
1530         msgBox.raise();
1531         msgBox.exec();
1532         updateIfNeeded();
1533     }
1534     /*
1535     QMessageBox msgBox;
1536     msgBox.setWindowTitle("KLog DB backup");
1537     msgBox.setText( QObject::tr("KLog is backing up the DB to a file..."));
1538     msgBox.setInformativeText( QObject::tr("Did the DB backup worked well?") );
1539     msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
1540     msgBox.setDefaultButton(QMessageBox::Yes);
1541     msgBox.setIcon(QMessageBox::Information);
1542     msgBox.raise();
1543     //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
1544     msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup);
1545 
1546     int ret = msgBox.exec();
1547     switch (ret)
1548     {
1549         case QMessageBox::Yes:
1550         // Save was clicked
1551             updateToLatest();
1552 
1553         break;
1554         case QMessageBox::No:
1555         // NO backup was DONE
1556             msgBox.setWindowTitle("KLog DB backup not done.");
1557             msgBox.setText( QObject::tr("KLog DB backup was not done."));
1558             msgBox.setInformativeText( QObject::tr("You will be redirected to the first message.") );
1559             msgBox.setStandardButtons(QMessageBox::Ok);
1560             msgBox.setDefaultButton(QMessageBox::Ok);
1561             msgBox.setIcon(QMessageBox::Warning);
1562             msgBox.raise();
1563             msgBox.exec();
1564             updateIfNeeded();
1565 
1566         break;
1567         default:
1568         // should never be reached
1569             //qDebug() << "DataBase::backupB4Update - FALSE - CHECK IF SEEN, shoud not be here! - END "  << QT_ENDL;
1570             //lse;
1571         //break;
1572     }
1573 */
1574     //qDebug() << "DataBase::logBackup - END" << QT_ENDL;
1575 }
1576 
createTheBandQuickReference()1577 bool DataBase::createTheBandQuickReference()
1578 {
1579 /*
1580           KEY      Value
1581     QHash<QString, int> bandIDHash;
1582     QHash<QString, int> modeIDHash;
1583     QHash<int, QString> IDBandHash;
1584     QHash<int, QString> IDModeHash
1585     QHash<int, QString> freqBandIdHash;
1586 
1587 */
1588         //qDebug() << "DataBase::createTheBandQuickReference: " << QT_ENDL;
1589     QString st = "NULL";
1590     int in = 0;
1591 
1592     QString stringQuery = QString("SELECT id, name, lower FROM band");
1593     QString fr = QString();
1594     bandIDHash.clear();
1595     IDBandHash.clear();
1596     QSqlQuery query;
1597     bool sqlOK = query.exec(stringQuery);
1598 
1599     if (!sqlOK)
1600     {
1601         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1602         query.finish();
1603        //// emit debugLog(Q_FUNC_INFO, "1", 7);
1604         return false;
1605     }
1606 
1607     while (query.next())
1608     {
1609         if (query.isValid())
1610         {
1611             st = (query.value(1)).toString();
1612             in = (query.value(0)).toInt();
1613             fr = (query.value(2)).toString();
1614             bandIDHash.insert(st, in );
1615             IDBandHash.insert(in, st);
1616             freqBandIdHash.insert(in, fr);
1617                  //qDebug() << "DataBase::createTheBandQuickReference: " << st <<"/" << QString::number(in)<< QT_ENDL;
1618         }
1619         else
1620         {
1621           //qDebug() << "DataBase::createTheBandQuickReference: Query not valid -'RETURN FALSE - END" << QT_ENDL;
1622           // QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheBandQuickReference)"),
1623           //                      query.lastError().text());
1624             query.finish();
1625            //// emit debugLog(Q_FUNC_INFO, "2", 7);
1626            return false;
1627            //TODO: Manage this error, in case the query is NOK.
1628         }
1629               //qDebug() << "DataBase::createTheBandQuickReference: Go for the next one!" << QT_ENDL;
1630     }
1631     query.finish();
1632         //qDebug() << "DataBase::createTheBandQuickReference: END" << QT_ENDL;
1633     return true;
1634 }
1635 
1636 
createTheModeQuickReference()1637 bool DataBase::createTheModeQuickReference()
1638 {
1639     /*
1640               KEY      Value
1641         QHash<QString, int> modeIDHash;
1642         QHash<int, QString> IDModeHash
1643 
1644     */
1645           //qDebug() << "DataBase::createTheModeQuickReference: " << QT_ENDL;
1646 
1647     if (getDBVersion().toFloat()<0.01f)
1648     {
1649         // If the version is not updated we don't create the reference
1650         return true;
1651     }
1652         QString st = QString();
1653         QString sm = QString();
1654         int in = 0;
1655         modeIDHash.clear();
1656         IDModeHash.clear();
1657         subModeIDHash.clear();
1658         IDSubModeHash.clear();
1659         QString stringQuery = QString("SELECT id, name, submode FROM mode");
1660         QSqlQuery query;
1661 
1662         bool sqlOK = query.exec(stringQuery);
1663 
1664         if (!sqlOK)
1665         {
1666             queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1667             query.finish();
1668            //// emit debugLog(Q_FUNC_INFO, "1", 7);
1669             return false;
1670         }
1671         while (query.next())
1672         {
1673             if (query.isValid())
1674             {
1675                 in = (query.value(0)).toInt();
1676                 st = (query.value(1)).toString();
1677                 sm = (query.value(2)).toString();
1678 
1679                 modeIDHash.insert(st, in );
1680                 IDModeHash.insert(in, st);
1681                 subModeIDHash.insert(sm, in );
1682                 IDSubModeHash.insert(in, sm);
1683                      //qDebug() << "DataBase::createTheModeQuickReference: " << st <<"/" << QString::number(in)<< QT_ENDL;
1684             }
1685             else
1686             {
1687                    //qDebug() << "DataBase::createTheModeQuickReference: Query not valid - END" << QT_ENDL;
1688 
1689                //QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheModeQuickReference)"),
1690                //                     query.lastError().text());
1691                 query.finish();
1692                //// emit debugLog(Q_FUNC_INFO, "2", 7);
1693                return false;
1694                //TODO: Manage this error, in case the query is NOK.
1695             }
1696         }
1697         query.finish();
1698             //qDebug() << "DataBase::createTheModeQuickReference: END" << QT_ENDL;
1699         return true;
1700 }
1701 
1702 
getBandIDFromName2(const QString & b)1703 int DataBase::getBandIDFromName2(const QString &b)
1704 {//KEY, value
1705  //name, id
1706     /*
1707               KEY      Value
1708     QHash<QString, int> bandIDHash;
1709     QHash<QString, int> modeIDHash;
1710     QHash<int, QString> IDBandHash;
1711     QHash<int, QString> IDModeHash
1712     */
1713         //qDebug() << "DataBase::getBandIDFromName2: " << b << QT_ENDL;
1714         //qDebug() << "DataBase::getBandIDFromName2: This line should be the last one... "  << QT_ENDL;
1715     return getBandIdFromName(b);
1716         //qDebug() << "DataBase::getBandIDFromName2: CHECK IF THIS LINE IS SEEN"  << QT_ENDL;
1717     /*
1718 
1719     if (b.length()<1)
1720     {
1721         return -3;
1722     }
1723 
1724     if (bandIDHash.contains(b))
1725     {
1726              //qDebug() << "DataBase::getBandIDFromName2: " << b << ":" <<  bandIDHash.value(b) << QT_ENDL;
1727         return bandIDHash.value(b);
1728     }
1729     else
1730     {
1731             //qDebug() << "DataBase::getBandIDFromName2: Contains - False" << QT_ENDL;
1732         return -1;
1733     }
1734          //qDebug() << "DataBase::getBandIDFromName2: Safety exit" << QT_ENDL;
1735     */
1736 }
1737 
getModeIDFromName2(const QString & b)1738 int DataBase::getModeIDFromName2(const QString &b)
1739 {
1740       //qDebug() << "DataBase::getModeIDFromName2: " << b << QT_ENDL;
1741     return getModeIdFromSubMode(b);
1742     /*
1743     if (b.length()<2)
1744     {
1745             //qDebug() << "DataBase::getModeIDFromName2: END -3" << QT_ENDL;
1746         return -3;
1747     }
1748 
1749     if (modeIDHash.contains(b))
1750     {
1751            //qDebug() << "DataBase::getModeIDFromName2: END - " << b << ":" <<  modeIDHash.value(b) << QT_ENDL;
1752         return modeIDHash.value(b);
1753     }
1754     else
1755     {
1756            //qDebug() << "DataBase::getModeIDFromName2: Contains - False - END" << QT_ENDL;
1757         return -1;
1758     }
1759         //qDebug() << "DataBase::getModeIDFromName2: Safety exit - END" << QT_ENDL;
1760     */
1761 }
1762 
1763 
getSubModeIDFromName2(const QString & b)1764 int DataBase::getSubModeIDFromName2(const QString &b)
1765 {
1766        //qDebug() << "DataBase::getSubModeIDFromName2: " << b << QT_ENDL;
1767 
1768     return getModeIdFromSubMode(b);
1769 }
1770 
getBandNameFromID2(const int _i)1771 QString DataBase::getBandNameFromID2(const int _i)
1772 {
1773        //qDebug() << "DataBase::getBandNameFromid2: " << QString::number(_i) << QT_ENDL;
1774     return getBandNameFromNumber(_i);
1775     /*
1776     if (IDBandHash.contains(_i))
1777     {
1778             //qDebug() << "DataBase::getBandNameFromid2: END OK"  << QT_ENDL;
1779         return IDBandHash.value(_i);
1780     }
1781     else
1782     {
1783             //qDebug() << "DataBase::getBandNameFromid2: END-1"  << QT_ENDL;
1784         return "-1";
1785     }
1786     */
1787         //qDebug() << "DataBase::getBandNameFromid2: END-2"  << QT_ENDL;
1788     //return "-2";
1789 }
1790 
getModeNameFromID2(const int _i)1791 QString DataBase::getModeNameFromID2(const int _i)
1792 {
1793          //qDebug() << "DataBase::getModeNameFromId2: " << QString::number(_i) << QT_ENDL;
1794     return getSubModeNameFromNumber(_i);
1795 /*
1796     if (IDModeHash.contains(_i))
1797     {
1798             //qDebug() << "DataBase::getModeNameFromId2: END OK - " << IDModeHash.value(_i) << QT_ENDL;
1799         return IDModeHash.value(_i);
1800     }
1801     else
1802     {
1803              //qDebug() << "DataBase::getModeNameFromId2: END-1" << QT_ENDL;
1804         return "-1";
1805     }
1806     */
1807          //qDebug() << "DataBase::getModeNameFromId2: END-2" << QT_ENDL;
1808     //return "-2";
1809 }
1810 
getSubModeNameFromID2(const int _i)1811 QString DataBase::getSubModeNameFromID2(const int _i)
1812 {
1813          //qDebug() << "DataBase::getSubModeNameFromId2: " << QString::number(_i) << QT_ENDL;
1814     return getSubModeNameFromNumber(_i);
1815     /*
1816     if (IDSubModeHash.contains(_i))
1817     {
1818             //qDebug() << "DataBase::getSubModeNameFromId2: END OK - " << IDModeHash.value(_i) << QT_ENDL;
1819         return IDSubModeHash.value(_i);
1820     }
1821     else
1822     {
1823              //qDebug() << "DataBase::getSubModeNameFromId2: END-1" << QT_ENDL;
1824         return "-1";
1825     }
1826          //qDebug() << "DataBase::getSubModeNameFromId2: END-2" << QT_ENDL;
1827     */
1828 }
1829 
createBandModeMaps()1830 bool DataBase::createBandModeMaps()
1831 {
1832     //qDebug() << "DataBase::createBandModeMaps" << QT_ENDL;
1833     bool b = false;
1834     bool m = false;
1835 
1836      //return (b && m);
1837     if (isTheDBCreated())
1838     {
1839         b = createTheBandQuickReference();
1840         m = createTheModeQuickReference();
1841 
1842              //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated TRUE" << QT_ENDL;
1843         if (!b)
1844         {
1845            //emit debugLog(Q_FUNC_INFO, "1", 7);
1846         }
1847         if (!m)
1848         {
1849            //emit debugLog(Q_FUNC_INFO, "2", 7);
1850         }
1851         //qDebug() << "DataBase::createBandModeMaps END 1" << QT_ENDL;
1852         return (b && m);
1853     }
1854     else
1855     {
1856         //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated FALSE" << QT_ENDL;
1857        //emit debugLog(Q_FUNC_INFO, "3", 7);
1858         return false;
1859     }
1860     //return false;
1861     //qDebug() << "DataBase::createBandModeMaps END" << QT_ENDL;
1862 }
1863 
getFreqFromBandId(const int _i)1864 QString DataBase::getFreqFromBandId(const int _i)
1865 {
1866     //qDebug() << "DataBase::getFreqFromBandId" << QT_ENDL;
1867 
1868     if (freqBandIdHash.contains(_i))
1869     {
1870         //qDebug() << "DataBase::getFreqFromBandId OK END" << QT_ENDL;
1871         return freqBandIdHash.value(_i);
1872     }
1873     else
1874     {
1875         //qDebug() << "DataBase::getFreqFromBandId END-1" << QT_ENDL;
1876         return "-1.0";
1877     }
1878         //qDebug() << "DataBase::getFreqFromBandId END-2" << QT_ENDL;
1879     //return "-2.0";
1880 }
1881 
1882 /*
1883 int DataBase::getLogTypeNumber(const QString &_logType)
1884 {
1885         //qDebug() << "DataBase::getLogTypeNumber: " << _logType << QT_ENDL;
1886      QSqlQuery query;
1887      QString queryString = QString("SELECT id FROM supportedcontests WHERE name='%1'").arg(_logType);
1888 
1889      bool sqlOK = query.exec(queryString);
1890 
1891 
1892      if(!sqlOK)
1893      {
1894          queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1895          query.finish();
1896      }
1897      query.next();
1898      if ( query.isValid() )
1899      {
1900         return (query.value(0)).toInt();
1901      }
1902      else
1903      {
1904          query.finish();
1905          return -1;
1906      }
1907      //query.finish();
1908      //return -2;
1909 }
1910 
1911 QString DataBase::getLogTypeName(const int _logType)
1912 {
1913          //qDebug() << "DataBase::getLogTypeName: " << QString::number(_logType) << QT_ENDL;
1914      QSqlQuery query;
1915      QString queryString = QString("SELECT name FROM supportedcontests WHERE id='%1'").arg(_logType);
1916      bool sqlOK = query.exec(queryString);
1917 
1918      if(!sqlOK)
1919      {
1920          queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
1921          query.finish();
1922      }
1923      query.next();
1924      if ( query.isValid() )
1925      {
1926         return (query.value(0)).toString();
1927      }
1928      else
1929      {
1930          query.finish();
1931          return QString();
1932      }
1933      //query.finish();
1934      //return QString();
1935 }
1936 */
updateToLatest()1937 bool DataBase::updateToLatest()
1938 {
1939 /*
1940  * With the DB updates, the function that is called from here should be also updated.
1941  * The updateXXX are recursive calls that calls the previous one.
1942  *
1943  */
1944       //qDebug() << "DataBase::updateToLatest " << QT_ENDL;
1945     if (requiresManualUpgrade())
1946     {
1947         //qDebug() << "DataBase::updateToLatest requires" << QT_ENDL;
1948         exit(1);
1949         //return false;
1950     }
1951     return updateTo022();
1952 }
1953 
requiresManualUpgrade()1954 bool DataBase::requiresManualUpgrade()
1955 {
1956     // If DB version <= 0.006, DB can't be upgraded automatically.
1957     // Recomendation is to export to ADIF in an olf KLog version (before KLog 1.1);
1958     // Install new KLog version
1959     // import ADIF file
1960     float ver = getDBVersion().toFloat();
1961     //qDebug() << "DataBase::requiresManualUpgrade - ver: " << QString::number(ver) << QT_ENDL;
1962     if (ver >= 0.007f)
1963     {
1964         //qDebug() << "DataBase::requiresManualUpgrade false" << QT_ENDL;
1965         return false;
1966     }
1967     else
1968     {
1969         //qDebug() << "DataBase::requiresManualUpgrade true" << QT_ENDL;
1970         QMessageBox msgBox;
1971         msgBox.setIcon(QMessageBox::Critical);
1972         msgBox.setWindowTitle(QObject::tr("KLog - DB can't be updated automatically"));
1973         QString aux = QObject::tr("You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version.");
1974         QString aux2 = QObject::tr("The process to upgrade is:\n- Using an old KLog version export your log to ADIF.\n- Remove your logbook.dat file from your KLog folder.\n- Install the new KLog version.\n- Import your ADIF file.\n\nKLog will finish when you click on OK.");
1975 
1976         msgBox.setText(aux);
1977         msgBox.setDetailedText(aux2);
1978         msgBox.setStandardButtons(QMessageBox::Ok);
1979         msgBox.setDefaultButton(QMessageBox::Ok);
1980         msgBox.exec();
1981     }
1982     return true;
1983 }
1984 
updateTo003()1985 bool DataBase::updateTo003()
1986 {// Updates the DB to 0.0.3
1987  /*
1988   * This function should be used as a template to create the all the update functions implementing the needed changes
1989   * in the dB to update from one version to the following one.
1990   *
1991   * // dbVersion shows the DB version that is being deployed
1992   * // latestReaded shows the DB version that is currently deployed.
1993   *i.e.:
1994   *  QString stringQuery = QString ("ALTER TABLE award_enumeration ADD COLUMN dxcc INTEGER;");
1995   *
1996   */
1997        //qDebug() << "DataBase::updateTo003: latestRead: " << QString::number(latestReaded) << QT_ENDL;
1998     bool IAmIn003 = false;
1999     bool IAmIn002 = false;
2000     bool ErrorUpdating = false;
2001 
2002     latestReaded = getDBVersion().toFloat();
2003     if (latestReaded >= 0.003f)
2004     {
2005         //IAmIn003 = true;
2006         return true;
2007     }
2008     else
2009     {
2010         IAmIn003 = false;
2011     }
2012 
2013     while (!IAmIn003 && !ErrorUpdating)
2014     {
2015         while (!IAmIn002 && !ErrorUpdating)
2016         {
2017             //IAmIn002 = updateTo002();
2018             IAmIn002 = true;
2019         }
2020         if (ErrorUpdating)
2021         {
2022            //// emit debugLog(Q_FUNC_INFO, "1", 7);
2023             return false;
2024         }
2025         //DO ALL THE TASKS TO BE IN 0.003 from 0.002 HERE and set ErrorUpdating if it is not possible.
2026         IAmIn003 = true;
2027     }
2028     return IAmIn003;
2029 }
2030 
updateTo004()2031 bool DataBase::updateTo004()
2032 {// Updates the DB to 0.0.41
2033        //qDebug() << "DataBase::updateTo004: latestRead: " << getDBVersion() << QT_ENDL;
2034        //qDebug() << "DataBase::updateTo004: latestRead: " << QString::number(latestReaded) << QT_ENDL;
2035     bool IAmIn004 = false;
2036     bool IAmIn003 = false;
2037     bool ErrorUpdating = false;
2038     QString stringQuery = QString();
2039     QSqlQuery query;
2040 
2041     bool sqlOk = false;
2042     latestReaded = getDBVersion().toFloat();
2043     if (latestReaded >= 0.004f)
2044     {
2045             //qDebug() << "DataBase::updateTo004: - I am in 004" << QT_ENDL;
2046         return true;
2047     }
2048     else
2049     {
2050             //qDebug() << "DataBase::updateTo004: - I am not in 004" << QT_ENDL;
2051         IAmIn004 = false;
2052     }
2053 
2054     while (!IAmIn004 && !ErrorUpdating)
2055     {
2056            //qDebug() << "DataBase::updateTo004: - And I am not in 004 nor ErrorUpdating" << QT_ENDL;
2057         while (!IAmIn003 && !ErrorUpdating)
2058         {
2059                //qDebug() << "DataBase::updateTo004: - And I am not in 003" << QT_ENDL;
2060             //IAmIn002 = updateTo002();
2061             IAmIn003 = true;
2062         }
2063         if (ErrorUpdating)
2064         {
2065            //// emit debugLog(Q_FUNC_INFO, "1", 7);
2066             return false;
2067         }
2068            //qDebug() << "DataBase::updateTo004: - And I am in 003" << QT_ENDL;
2069         sqlOk = updateDBVersion(softVersion, "0.004");
2070            //qDebug() << "DataBase::updateTo004: - Update Version" << QT_ENDL;
2071         if (sqlOk)
2072         { // Version updated
2073                //qDebug() << "DataBase::updateTo004: - Update OK" << QT_ENDL;
2074             sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE award_enumeration");
2075         }
2076         else
2077         { // Version not updated
2078                //qDebug() << "DataBase::updateTo004: - Update NOK" << QT_ENDL;
2079         }
2080         //DO ALL THE TASKS TO BE IN 0.004 from 0.003 HERE and set ErrorUpdating if it is not possible.
2081            //qDebug() << "DataBase::updateTo004: - IAmIn004 = true" << QT_ENDL;
2082         IAmIn004 = true;
2083     }
2084 
2085     if (IAmIn004)
2086     {
2087            //qDebug() << "DataBase::updateTo004: - Return... TRUE" << QT_ENDL;
2088     }
2089     else
2090     {
2091            //qDebug() << "DataBase::updateTo004: - Return... FALSE" << QT_ENDL;
2092     }
2093        //qDebug() << "DataBase::updateTo004: UPDATED OK!" << QT_ENDL;
2094     return IAmIn004;
2095 }
2096 
2097 
updateTo005()2098 bool DataBase::updateTo005()
2099 {// Updates the DB to 0.0.5
2100           //qDebug() << "DataBase::updateTo005: latestRead: " << getDBVersion() << QT_ENDL;
2101        bool IAmIn005 = false;
2102        bool IAmIn004 = false;
2103        bool ErrorUpdating = false;
2104        QString stringQuery = QString();
2105        QSqlQuery query;
2106        QMessageBox msgBox;
2107        msgBox.setWindowTitle(QObject::tr("KLog - DB update"));
2108        msgBox.setIcon(QMessageBox::Information);
2109        //int errorCode;
2110 
2111        bool sqlOk = false;
2112        latestReaded = getDBVersion().toFloat();
2113 
2114        if (latestReaded >= 0.005f)
2115        {
2116                 //qDebug() << "DataBase::updateTo005 - Already in 005" << QT_ENDL;
2117            return true;
2118        }
2119        else
2120        {
2121                 //qDebug() << "DataBase::updateTo005 - 005 update false" << QT_ENDL;
2122            IAmIn005 = false;
2123        }
2124 
2125 
2126        while (!IAmIn005 && !ErrorUpdating)
2127        {
2128                  //qDebug() << "DataBase::updateTo005 - I am not in 005" << QT_ENDL;
2129            while (!IAmIn004 && !ErrorUpdating)
2130            {
2131                     //qDebug() << "DataBase::updateTo005 - I am not in 004" << QT_ENDL;
2132                IAmIn004 = updateTo004();
2133            }
2134               //qDebug() << "DataBase::updateTo005 - I am in 004" << QT_ENDL;
2135            if (ErrorUpdating)
2136            {
2137                   //qDebug() << "DataBase::updateTo005 - 005 update false2" << QT_ENDL;
2138               //// emit debugLog(Q_FUNC_INFO, "1", 7);
2139                return false;
2140            }
2141            sqlOk = updateDBVersion(softVersion, "0.005");
2142 
2143            if (sqlOk)
2144            { // Version updated
2145                if (recreateContestData())
2146                {
2147                         //qDebug() << "DataBase::updateTo005 - recreateContestData OK" << QT_ENDL;
2148 
2149                    sqlOk = execQuery(Q_FUNC_INFO, "DROP table logs");
2150 
2151                    sqlOk = createTableLogs(true);
2152                     if (!sqlOk)
2153                     {
2154                         //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
2155                             //qDebug() << "DataBase::updateTo005 - logs table do not created" << QT_ENDL;
2156                     }
2157 
2158 
2159                    if (howManyQSOsInLog(0)>0)
2160                    { // If the user has QSOs that were added with previous versions...
2161                      // We need to create a new log and rename all QSOs to that QSO.
2162                      //stringQuery = QString("UPDATE log SET lognumber='1' WHERE lognumber='0'");
2163 
2164 
2165                        msgBox.setText(QObject::tr("KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you."));
2166                        msgBox.exec();
2167 
2168                         if (execQuery(Q_FUNC_INFO, "UPDATE log SET lognumber='1' WHERE lognumber='0'"))
2169                         {}
2170                         else
2171                         {
2172                             //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
2173                             //showError(QObject::tr("QSOs not updated to main log"));
2174                                  //qDebug() << "DataBase::updateTo005 - QSOs not updated to main log" << QT_ENDL;
2175                         }
2176 
2177                         QString dateString = (QDate::currentDate()).toString("yyyy-MM-dd");
2178                         QString callToUse = QString();
2179                         bool ok;
2180                         //QString text;
2181 
2182                         //text = QInputDialog::getText(this, QObject::tr("Station Callsign"), QObject::tr("Enter the Station Callsign you want to use in the imported log:"), QLineEdit::Normal, QObject::tr("N0CALL"), &ok);
2183                         QString text = (QInputDialog::getText(nullptr, QObject::tr("KLog: Enter Station callsign"),
2184                                                                   QObject::tr("Enter the station callsign used in this log"), QLineEdit::Normal,
2185                                                               QObject::tr("Station Callsign"), &ok)).toUpper();
2186                         text = text.toUpper();
2187                             if (ok && !text.isEmpty())
2188                             {
2189                                 callToUse = text;
2190                             }
2191                             else
2192                             {
2193                                 callToUse = "N0CALL";
2194                             }
2195 
2196                         stringQuery = QString("INSERT INTO logs (logdate, stationcall, logtype, logtypen) values('%1','%2','DX', '1')").arg(dateString).arg(callToUse);
2197                         sqlOk = execQuery(Q_FUNC_INFO, stringQuery);
2198 
2199 
2200                         if (!sqlOk)
2201                         {
2202                             //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
2203                             //showError(QObject::tr("New Log not created"));
2204                                  //qDebug() << "DataBase::updateTo005 - New Log not created" << QT_ENDL;
2205                                  //qDebug() << "DataBase::clearLog: Log deleted FAILED" << QT_ENDL;
2206                         }
2207                    }
2208                    IAmIn005 = true;
2209                }
2210                else
2211                {
2212                         //qDebug() << "DataBase::updateTo005 - recreateContestData FAILED" << QT_ENDL;
2213                    ErrorUpdating = true;
2214                }
2215            }
2216            else
2217            { // Version not updated
2218                     //qDebug() << "DataBase::updateTo005 - 005 update false6" << QT_ENDL;
2219                 ErrorUpdating = true;
2220            }
2221        }
2222             //qDebug() << "DataBase::updateTo005 - 005 updated 3" << QT_ENDL;
2223 
2224        //TODO: Delete the table and recreate it
2225        if (IAmIn005)
2226        {
2227             msgBox.setText(QObject::tr("All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay."));
2228             msgBox.exec();
2229        }
2230        else
2231         {
2232           //// emit debugLog(Q_FUNC_INFO, "2", 7);
2233         }
2234              //qDebug() << "DataBase::updateTo005 - I am in 005 already!! " << QT_ENDL;
2235           //qDebug() << "DataBase::updateTo005: UPDATED OK!" << QT_ENDL;
2236        return IAmIn005;
2237 }
2238 
recreateSatelliteData()2239 bool DataBase::recreateSatelliteData()
2240 {
2241        //qDebug() << "DataBase::recreateSatelliteData"  << QT_ENDL;
2242     QSqlQuery query;
2243 
2244     if (isTheTableExisting("satellites"))
2245     {
2246         if (execQuery(Q_FUNC_INFO, "DROP TABLE satellites"))
2247         {
2248             if (createTableSatellites(true))
2249             {
2250                     //qDebug() << "DataBase::recreateSatelliteData SAT table created"  << QT_ENDL;
2251                 return populateTableSatellites(true);
2252             }
2253             else
2254             {
2255                      //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created"  << QT_ENDL;
2256             }
2257         }
2258         else
2259         {
2260                //qDebug() << "DataBase::recreateSatelliteData execQuery FAILED"  << QT_ENDL;
2261         }
2262     }
2263     else
2264     {
2265         if (createTableSatellites(true))
2266         {
2267                 //qDebug() << "DataBase::recreateSatelliteData SAT table created"  << QT_ENDL;
2268             return populateTableSatellites(true);
2269         }
2270         else
2271         {
2272                  //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created"  << QT_ENDL;
2273         }
2274     }
2275 
2276        //qDebug() << "DataBase::recreateSatelliteData END FALSE"  << QT_ENDL;
2277     return false;
2278 }
2279 
recreateContestData()2280 bool DataBase::recreateContestData()
2281 {
2282         //qDebug() << "DataBase::recreateContestData"  << QT_ENDL;
2283     if (isTheTableExisting("contest"))
2284     {
2285         QSqlQuery query;
2286         bool sqlOk = false;
2287         sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE contest");
2288         if (sqlOk)
2289         {
2290             if (createTableContest())
2291             {
2292                 return populateContestData();
2293             }
2294         }
2295     }
2296     else
2297     {
2298         if (createTableContest())
2299         {
2300             return populateContestData();
2301         }
2302     }
2303     return false;
2304 }
2305 
recreateSupportedContest()2306 bool DataBase::recreateSupportedContest()
2307 {
2308        //qDebug() << "DataBase::recreateSupportedContest"  << QT_ENDL;
2309     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests");
2310 
2311     if (isTheTableExisting("supportedcontests"))
2312     {
2313         QSqlQuery query;
2314         bool sqlOk = false;
2315         sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontests");
2316         if (sqlOk)
2317         {
2318                 //qDebug() << "DataBase::recreateSupportedContest SQLOK"  << QT_ENDL;
2319             if (createTableSupportedContest())
2320             {
2321                     //qDebug() << "DataBase::recreateSupportedContest - createTable OK"  << QT_ENDL;
2322                 return populateTableSupportedContest();
2323             }
2324             else
2325             {
2326                     //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE"  << QT_ENDL;
2327                 return false;
2328             }
2329         }
2330         else
2331         {
2332             //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
2333         }
2334     }
2335     else
2336     {
2337         if (createTableSupportedContest())
2338         {
2339                 //qDebug() << "DataBase::recreateSupportedContest - createTable OK"  << QT_ENDL;
2340             return populateTableSupportedContest();
2341         }
2342         else
2343         {
2344                 //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE"  << QT_ENDL;
2345             return false;
2346         }
2347     }
2348         //qDebug() << "DataBase::recreateSupportedContest - FALSE end"  << QT_ENDL;
2349     return false;
2350 }
2351 
2352 
recreatePropModes()2353 bool DataBase::recreatePropModes()
2354 {
2355        //qDebug() << "DataBase::recreatePropModes"  << QT_ENDL;
2356     if (isTheTableExisting("prop_mode_enumeration"))
2357     {
2358            //qDebug() << "DataBase::recreatePropModes: Table Exist"  << QT_ENDL;
2359         bool sqlOk = false;
2360         sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE prop_mode_enumeration");
2361 
2362         if (sqlOk)
2363         {
2364                //qDebug() << "DataBase::recreatePropModes SQLOK"  << QT_ENDL;
2365             if (createTablePropModes())
2366             {
2367                    //qDebug() << "DataBase::recreatePropModes - createTable OK"  << QT_ENDL;
2368                 if (populatePropagationModes())
2369                 {
2370                        //qDebug() << "DataBase::recreatePropModes - populatePropModes OK"  << QT_ENDL;
2371                     return true;
2372                 }
2373                 else
2374                 {
2375                        //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK"  << QT_ENDL;
2376                     return false;
2377                 }
2378             }
2379             else
2380             {
2381                      //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-1"  << QT_ENDL;
2382                   return false;
2383             }
2384         }
2385         else
2386         {
2387             //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
2388                  //qDebug() << "DataBase::recreatePropModes - prop_mode_enumeration table has not been dropped"  << QT_ENDL;
2389                  //qDebug() << "DataBase::recreatePropModes : Table creation FAILED" << QT_ENDL;
2390         }
2391     }
2392     else
2393     {
2394            //qDebug() << "DataBase::recreatePropModes: Table does NOT Exist"  << QT_ENDL;
2395         if (createTablePropModes())
2396         {
2397                //qDebug() << "DataBase::recreatePropModes - createTable OK"  << QT_ENDL;
2398             if (populatePropagationModes())
2399             {
2400                    //qDebug() << "DataBase::recreatePropModes - populatePropModes OK"  << QT_ENDL;
2401                 return true;
2402             }
2403             else
2404             {
2405                    //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK"  << QT_ENDL;
2406                 return false;
2407             }
2408         }
2409         else
2410         {
2411                  //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-2"  << QT_ENDL;
2412         }
2413     }
2414 
2415         //qDebug() << "DataBase::recreatePropModes - FALSE end"  << QT_ENDL;
2416     return false;
2417 }
2418 
2419 
createTableLogs(const bool real)2420 bool DataBase::createTableLogs(const bool real)
2421 { // NoTmp = false => TMP data table to operate and be deleted afterwards
2422     //Creating the Sats DB to be able to include satellites to the LOTW
2423 
2424         //qDebug() << "DataBase::createTableLogs" << QT_ENDL;
2425 
2426     QString stringQuery = QString();
2427     //QSqlQuery query;
2428     if (real)
2429     {
2430             //qDebug() << "DataBase::createTableLogs - logs" << QT_ENDL;
2431         stringQuery = "CREATE TABLE logs" ;
2432     }
2433     else
2434     {
2435             //qDebug() << "DataBase::createTableLogs - logstemp" << QT_ENDL;
2436         stringQuery = "CREATE TABLE logstemp" ;
2437     }
2438 
2439         stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, "
2440                                             "logdate VARCHAR(10), "
2441                                             "stationcall VARCHAR(15) NOT NULL, "
2442                                             "operators VARCHAR, "
2443                                             "comment VARCHAR, "
2444                                             "logtype VARCHAR, "
2445                                             "logtypen INTEGER, "
2446                                             "FOREIGN KEY (logtypen) REFERENCES supportedcontests(id),"
2447                                             "FOREIGN KEY (logtype) REFERENCES supportedcontests(name))");
2448 
2449 
2450 
2451             //qDebug() << "DataBase::createTableLogs - END" << QT_ENDL;
2452 
2453         return execQuery(Q_FUNC_INFO, stringQuery);
2454 }
2455 
2456 
createTablePropModes()2457 bool DataBase::createTablePropModes()
2458 {
2459        //qDebug() << "DataBase::createTablePropModes" << QT_ENDL;
2460 
2461     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists prop_mode_enumeration");
2462     return execQuery(Q_FUNC_INFO, "CREATE TABLE prop_mode_enumeration (id INTEGER PRIMARY KEY AUTOINCREMENT, shortname VARCHAR(8), name VARCHAR(55) )");
2463 }
2464 
createTableSupportedContest()2465 bool DataBase::createTableSupportedContest()
2466 {
2467          //qDebug() << "DataBase::createTableSupportedContest" << QT_ENDL;
2468     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests");
2469 
2470     QString st = QString("CREATE TABLE supportedcontests ("
2471                          "id INTEGER PRIMARY KEY, "
2472                          "longname VARCHAR,"
2473                          "name VARCHAR)");
2474     return execQuery(Q_FUNC_INFO, st);
2475 }
2476 
createTableContest()2477 bool DataBase::createTableContest()
2478 {
2479         //qDebug() << "DataBase::createTableContest" << QT_ENDL;
2480     //QSqlQuery query;
2481 
2482     createTableSupportedContest();
2483 
2484     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists contest");
2485 
2486     execQuery(Q_FUNC_INFO, "CREATE TABLE contest ("
2487                "id INTEGER PRIMARY KEY AUTOINCREMENT, "
2488                "contest INTEGER NOT NULL,"
2489                "catoperator INTEGER NOT NULL,"
2490                "catassisted INTEGER NOT NULL,"
2491                "catpower INTEGER NOT NULL,"
2492                "catband INTEGER NOT NULL,"
2493                "catoverlay INTEGER NOT NULL,"
2494                "catmode INTEGER NOT NULL,"
2495                "FOREIGN KEY (contest) REFERENCES supportedcontests(id), "
2496                "FOREIGN KEY (catoperator) REFERENCES contestcatoperator(id), "
2497                "FOREIGN KEY (catassisted) REFERENCES contestcatassisted(id), "
2498                "FOREIGN KEY (catpower) REFERENCES contestcatpower(id), "
2499                "FOREIGN KEY (catband) REFERENCES contestcatband(id), "
2500                "FOREIGN KEY (catoverlay) REFERENCES contestcatoverlay(id), "
2501                "FOREIGN KEY (catmode) REFERENCES contestcatmode(id))");
2502 
2503 
2504 
2505     execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoperator ("
2506                    "id INTEGER PRIMARY KEY, "
2507                    "name VARCHAR)");
2508 
2509     execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatassisted ("
2510                    "id INTEGER PRIMARY KEY, "
2511                    "name VARCHAR)");
2512 
2513     execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatpower ("
2514                    "id INTEGER PRIMARY KEY, "
2515                    "name VARCHAR)");
2516 
2517     execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatband ("
2518                    "id INTEGER PRIMARY KEY, "
2519                    "name VARCHAR)");
2520 
2521     execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoverlay ("
2522                    "id INTEGER PRIMARY KEY, "
2523                    "name VARCHAR)");
2524 
2525     execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatmode ("
2526                    "id INTEGER PRIMARY KEY, "
2527                    "name VARCHAR)");
2528 
2529     populateTableSupportedContest();
2530 
2531     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('0', 'N/A')");
2532     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('1', 'Single-Operator')");
2533     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('2', 'Multi-One')");
2534     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('3', 'Multi-Two')");
2535     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('4', 'Multi-Unlimited')");
2536     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('5', 'CheckLog')");
2537 
2538     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('0', 'N/A')");
2539     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('1', 'Non-Assisted')");
2540     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('2', 'Assisted')");
2541 
2542     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('0', 'N/A')");
2543     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('1', 'High-Power')");
2544     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('2', 'Low-Power')");
2545     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('3', 'QRP')");
2546 
2547     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('0', 'N/A')");
2548     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('1', 'All-Band')");
2549     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('2', 'Single-Band')");
2550 
2551     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('0', 'N/A')");
2552     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('1', 'Classic')");
2553     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('2', 'Rookie')");
2554 
2555     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('0', 'N/A')");
2556     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('1', 'SSB')");
2557     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('2', 'CW')");
2558     execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('3', 'MIXED')");
2559 
2560          //qDebug() << "DataBase::createTableContest END" << QT_ENDL;
2561     return true;
2562 }
2563 
populateTableSupportedContest()2564 bool DataBase::populateTableSupportedContest()
2565 {
2566         //qDebug() << "DataBase::populateTableSupportedContest" << QT_ENDL;
2567     // ADDING ALL THE CATEGORIES OPTIONS
2568     return execQuery(Q_FUNC_INFO, "INSERT INTO supportedcontests (id, longname, name) VALUES ('0', 'Normal log', 'DX')");
2569 }
2570 
createTableQSL_Via_enumeration()2571 bool DataBase::createTableQSL_Via_enumeration()
2572 {
2573     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via_enumeration");
2574     QString st = QString("CREATE TABLE qsl_via_enumeration ("
2575                          "id INTEGER PRIMARY KEY AUTOINCREMENT, "
2576                          "shortname VARCHAR(1) NOT NULL, "
2577                          "name VARCHAR(15) NOT NULL)");
2578      return execQuery(Q_FUNC_INFO, st);
2579 }
2580 
populateTableQSL_Via_enumeration()2581 bool DataBase::populateTableQSL_Via_enumeration()
2582 {
2583     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('B', 'Bureau')");
2584     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('D', 'Direct')");
2585     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('E', 'Electronic')");
2586     execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('M', 'Manager')");
2587     return true;
2588 }
2589 
2590 
createTableMode(const bool NoTmp)2591 bool DataBase::createTableMode(const bool NoTmp)
2592 { // NoTmp = false => TMP data table to operate and be deleted afterwards
2593         //qDebug() << "DataBase::createTableMode" << QT_ENDL;
2594     QString stringQuery = QString();
2595     QSqlQuery query;
2596     if (NoTmp)
2597     {
2598         stringQuery = "CREATE TABLE mode" ;
2599     }
2600     else
2601     {
2602         stringQuery = "CREATE TABLE modetemp" ;
2603     }
2604 
2605         stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, "
2606                                             "cabrillo VARCHAR(2) NOT NULL, "
2607                                              "name VARCHAR(40) NOT NULL, "
2608                                              "submode VARCHAR(40) NOT NULL, "
2609                                              "deprecated VARCHAR(1) NOT NULL)");
2610 
2611             //qDebug() << "DataBase::createTableMode END" << QT_ENDL;
2612 
2613         return execQuery(Q_FUNC_INFO, stringQuery);
2614 }
2615 
populateTableMode(const bool NoTmp)2616 bool DataBase::populateTableMode(const bool NoTmp)
2617 {
2618          //qDebug() << "DataBase::populateTableMode" << QT_ENDL;
2619     //QSqlQuery query;
2620     QString tableName = QString();
2621     QString squery = QString();
2622     if (NoTmp)
2623     {
2624         tableName = "mode";
2625     }
2626     else
2627     {
2628         tableName = "modetemp";
2629     }
2630 
2631 
2632     bool sqlOK = execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AM', 'AM', 'PH', '0')").arg(tableName));
2633 
2634     //int errorCode = -1;
2635     if (!sqlOK)
2636     {
2637         //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
2638              //qDebug() << "DataBase::populateTableMode: Mode table population FAILED" << QT_ENDL;
2639         //errorCode = query.lastError().nativeErrorCode();
2640     }
2641     else
2642     {
2643              //qDebug() << "DataBase::populateTableMode: Mode table population  OK" << QT_ENDL;
2644     }
2645 
2646     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ARDOP', 'ARDOP', 'NO', '0')").arg(tableName));
2647     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AMTORFEC', 'TOR', 'NO', '1')").arg(tableName));
2648     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ASCI', 'RTTY', 'NO', '1')").arg(tableName));
2649     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ATV', 'ATV', 'NO', '0')").arg(tableName));
2650     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('C4FM', 'C4FM', 'NO', '0')").arg(tableName));
2651     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP', 'CHIP', 'NO', '0')").arg(tableName));
2652     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP64', 'CHIP', 'NO', '1')").arg(tableName));
2653     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP128', 'CHIP', 'NO', '1')").arg(tableName));
2654     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CLO', 'CLO', 'NO', '0')").arg(tableName));
2655     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CONTESTI', 'CONTESTI', 'NO', '0')").arg(tableName));
2656     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CW', 'CW', 'CW', '0')").arg(tableName));
2657     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DIGITALVOICE', 'DIGITALVOICE', 'NO', '0')").arg(tableName));
2658     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DSTAR', 'DSTAR', 'NO', '0')").arg(tableName));
2659     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINO', 'DOMINO', 'NO', '0')").arg(tableName));
2660     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOEX', 'DOMINO', 'NO', '0')").arg(tableName));
2661     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOF', 'DOMINO', 'NO', '1')").arg(tableName));
2662     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FAX', 'FAX', 'NO', '0')").arg(tableName));
2663     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FM', 'FM', 'PH', '0')").arg(tableName));
2664     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FMHELL', 'HELL', 'NO', '1')").arg(tableName));
2665     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT4', 'MFSK', 'DG', '0')").arg(tableName));
2666     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FST4', 'MFSK', 'DG', '0')").arg(tableName));
2667     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FST4W', 'MFSK', 'DG', '0')").arg(tableName));
2668     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'DG', '0')").arg(tableName));
2669     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK31', 'PSK', 'DG', '1')").arg(tableName));
2670     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK441', 'FSK441', 'DG', '0')").arg(tableName));
2671     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSKHELL', 'HELL', 'NO', '0')").arg(tableName));
2672     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSQCALL', 'MFSK', 'NO', '0')").arg(tableName));
2673     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('GTOR', 'TOR', 'NO', '1')").arg(tableName));
2674     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL', 'HELL', 'NO', '0')").arg(tableName));
2675     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL80', 'HELL', 'NO', '1')").arg(tableName));
2676     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HFSK', 'HELL', 'NO', '1')").arg(tableName));
2677     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT', 'ISCAT', 'NO', '0')").arg(tableName));
2678     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-A', 'ISCAT', 'NO', '0')").arg(tableName));
2679     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-B', 'ISCAT', 'NO', '0')").arg(tableName));
2680     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JS8', 'MFSK', 'DG', '0')").arg(tableName));
2681     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4', 'JT4', 'DG', '0')").arg(tableName));
2682     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4A', 'JT4', 'DG', '1')").arg(tableName));
2683     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4B', 'JT4', 'DG', '1')").arg(tableName));
2684     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4C', 'JT4', 'DG', '1')").arg(tableName));
2685     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4D', 'JT4', 'DG', '1')").arg(tableName));
2686     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4E', 'JT4', 'DG', '1')").arg(tableName));
2687     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4F', 'JT4', 'DG', '1')").arg(tableName));
2688     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4G', 'JT4', 'DG', '1')").arg(tableName));
2689     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT6M', 'JT6M', 'DG', '0')").arg(tableName));
2690     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9', 'JT9', 'DG', '0')").arg(tableName));
2691     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-1', 'JT9', 'DG', '0')").arg(tableName));
2692     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-2', 'JT9', 'DG', '0')").arg(tableName));
2693     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-5', 'JT9', 'DG', '0')").arg(tableName));
2694     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-10', 'JT9', 'DG', '0')").arg(tableName));
2695     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-30', 'JT9', 'DG', '0')").arg(tableName));
2696     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9A', 'JT9', 'DG', '0')").arg(tableName));
2697     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9B', 'JT9', 'DG', '0')").arg(tableName));
2698     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9C', 'JT9', 'DG', '0')").arg(tableName));
2699     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9D', 'JT9', 'DG', '0')").arg(tableName));
2700     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E', 'JT9', 'DG', '0')").arg(tableName));
2701     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E FAST', 'JT9', 'DG', '0')").arg(tableName));
2702     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F', 'JT9', 'DG', '0')").arg(tableName));
2703     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F FAST', 'JT9', 'DG', '0')").arg(tableName));
2704     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G', 'JT9', 'DG', '0')").arg(tableName));
2705     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G FAST', 'JT9', 'DG', '0')").arg(tableName));
2706     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H', 'JT9', 'DG', '0')").arg(tableName));
2707     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H FAST', 'JT9', 'DG', '0')").arg(tableName));
2708     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT44', 'JT44', 'DG', '0')").arg(tableName));
2709     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65', 'JT65', 'DG', '0')").arg(tableName));
2710     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65A', 'JT65', 'DG', '1')").arg(tableName));
2711     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B', 'JT65', 'DG', '1')").arg(tableName));
2712     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B2', 'JT65', 'DG', '0')").arg(tableName));
2713     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C', 'JT65', 'DG', '1')").arg(tableName));
2714     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C2', 'JT65', 'DG', '0')").arg(tableName));
2715     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK', 'MFSK', 'DG', '0')").arg(tableName));
2716     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK4', 'MFSK', 'DG', '0')").arg(tableName));
2717     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK8', 'MFSK', 'DG', '1')").arg(tableName));
2718     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK11', 'MFSK', 'DG', '0')").arg(tableName));
2719     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK16', 'MFSK', 'DG', '1')").arg(tableName));
2720     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK22', 'MFSK', 'DG', '0')").arg(tableName));
2721     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK31', 'MFSK', 'DG', '0')").arg(tableName));
2722     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK32', 'MFSK', 'DG', '0')").arg(tableName));
2723     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK64', 'MFSK', 'DG', '0')").arg(tableName));
2724     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK128', 'MFSK', 'DG', '0')").arg(tableName));
2725     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'DG', '0')").arg(tableName));
2726     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MT63', 'MT63', 'DG', '0')").arg(tableName));
2727     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA', 'OLIVIA', 'DG', '0')").arg(tableName));
2728     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/125', 'OLIVIA', 'DG', '0')").arg(tableName));
2729     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/250', 'OLIVIA', 'DG', '0')").arg(tableName));
2730     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/250', 'OLIVIA', 'DG', '0')").arg(tableName));
2731     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/500', 'OLIVIA', 'DG', '0')").arg(tableName));
2732     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/500', 'OLIVIA', 'DG', '0')").arg(tableName));
2733     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/1000', 'OLIVIA', 'DG', '0')").arg(tableName));
2734     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 32/1000', 'OLIVIA', 'DG', '0')").arg(tableName));
2735     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA', 'OPERA', 'DG', '0')").arg(tableName));
2736     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-BEACON', 'OPERA', 'DG', '0')").arg(tableName));
2737     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-QSO', 'OPERA', 'DG', '0')").arg(tableName));
2738     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC', 'PAC', 'NO', '0')").arg(tableName));
2739     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC2', 'PAC', 'NO', '1')").arg(tableName));
2740     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC3', 'PAC', 'NO', '1')").arg(tableName));
2741     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC4', 'PAC', 'NO', '0')").arg(tableName));
2742     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX', 'PAX', 'NO', '0')").arg(tableName));
2743     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX2', 'PAX', 'NO', '1')").arg(tableName));
2744     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PCW', 'CW', 'NO', '1')").arg(tableName));
2745     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PKT', 'PKT', 'DG', '0')").arg(tableName));
2746     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK', 'PSK', 'DG', '0')").arg(tableName));
2747     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK10', 'PSK', 'DG', '1')").arg(tableName));
2748     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK31', 'PSK', 'DG', '1')").arg(tableName));
2749     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63', 'PSK', 'DG', '1')").arg(tableName));
2750     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63F', 'PSK', 'DG', '1')").arg(tableName));
2751     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK125', 'PSK', 'DG', '1')").arg(tableName));
2752     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK250', 'PSK', 'DG', '0')").arg(tableName));
2753     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK500', 'PSK', 'DG', '0')").arg(tableName));
2754     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK1000', 'PSK', 'DG', '0')").arg(tableName));
2755     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM10', 'PSK', 'NO', '1')").arg(tableName));
2756     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM31', 'PSK', 'NO', '1')").arg(tableName));
2757     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM50', 'PSK', 'NO', '1')").arg(tableName));
2758     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKFEC31', 'PSK', 'NO', '1')").arg(tableName));
2759     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK2K', 'PSK2K', 'NO', '0')").arg(tableName));
2760     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKHELL', 'HELL', 'NO', '0')").arg(tableName));
2761     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('Q15', 'Q15', 'DG', '0')").arg(tableName));
2762     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('Q65', 'MFSK', 'DG', '0')").arg(tableName));
2763     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK31', 'PSK', 'DG', '1')").arg(tableName));
2764     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK63', 'PSK', 'DG', '1')").arg(tableName));
2765     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK125', 'PSK', 'DG', '1')").arg(tableName));
2766     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK250', 'PSK', 'DG', '0')").arg(tableName));
2767     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK500', 'PSK', 'DG', '0')").arg(tableName));
2768     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64', 'QRA64', 'DG', '0')").arg(tableName));
2769     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64A', 'QRA64', 'DG', '0')").arg(tableName));
2770     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64B', 'QRA64', 'DG', '0')").arg(tableName));
2771     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64C', 'QRA64', 'DG', '0')").arg(tableName));
2772     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64D', 'QRA64', 'DG', '0')").arg(tableName));
2773     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64E', 'QRA64', 'DG', '0')").arg(tableName));
2774     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS', 'ROS', 'DG', '0')").arg(tableName));
2775     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-EME', 'ROS', 'DG', '0')").arg(tableName));
2776     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-HF', 'ROS', 'DG', '0')").arg(tableName));
2777     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-MF', 'ROS', 'DG', '0')").arg(tableName));
2778     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTY', 'RTTY', 'RY', '0')").arg(tableName));
2779     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTYM', 'RTTYM', 'RY', '0')").arg(tableName));
2780     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSB', 'SSB', 'PH', '0')").arg(tableName));
2781     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('LSB', 'SSB', 'PH', '0')").arg(tableName));
2782     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('USB', 'SSB', 'PH', '0')").arg(tableName));
2783     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SIM31', 'PSK', 'NO', '0')").arg(tableName));
2784     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSTV', 'SSTV', 'NO', '0')").arg(tableName));
2785     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('T10', 'T10', 'NO', '0')").arg(tableName));
2786     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRB', 'THRB', 'NO', '0')").arg(tableName));
2787     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRBX', 'THRB', 'NO', '1')").arg(tableName));
2788     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR', 'THOR', 'NO', '0')").arg(tableName));
2789     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('TOR', 'TOR', 'NO', '0')").arg(tableName));
2790     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('V4', 'V4', 'NO', '0')").arg(tableName));
2791     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VOI', 'VOI', 'NO', '0')").arg(tableName));
2792     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WINMOR', 'WINMOR', 'NO', '0')").arg(tableName));
2793     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WSPR', 'WSPR', 'NO', '0')").arg(tableName));
2794 
2795 
2796     createTheModeQuickReference();
2797          //qDebug() << "DataBase::populateTableMode END" << QT_ENDL;
2798     return true;
2799 }
2800 
2801 
createTableSatellites(const bool NoTmp)2802 bool DataBase::createTableSatellites(const bool NoTmp)
2803 { // NoTmp = false => TMP data table to operate and be deleted afterwards
2804     //Creating the Sats DB to be able to include satellites to the LOTW
2805 
2806        //qDebug() << "DataBase::createTableSatellites" << QT_ENDL;
2807 
2808     // The satmode column has the following format: {Up/down-mode;Up/down-mode}
2809     // this way we can implement several freqs/modes per sat
2810     // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also
2811     // being mode "SSB, CW, ... and other ADIF modes
2812 
2813     QString stringQuery = QString();
2814 
2815 
2816     QString table = QString();
2817     if (NoTmp)
2818     {
2819         table = "satellites" ;
2820     }
2821     else
2822     {
2823         table = "satellitestemp" ;
2824     }
2825     stringQuery = "CREATE TABLE "+ table;
2826 
2827     stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, "
2828                                             "satarrlid VARCHAR, "
2829                                             "satname VARCHAR, "
2830                                             "uplink VARCHAR,"
2831                                             "downlink VARCHAR,"
2832                                             "satmode VARCHAR, "
2833                                             "UNIQUE (satarrlid) )");
2834 /*
2835  *
2836  *  uplink/downlink format is the following:
2837  *      Single frecuency: 145.950
2838  *      Segment: 145.950-145.975
2839  *      Several freqs: 145.950,435.950
2840  *      Several segments: 145.950-145.975,435.950-435.975
2841  *
2842  *  satmode format:
2843  *      Single mode: FM
2844  *      Modes complex Up/Downlink: USB/LSB
2845  *      Several modes (one per uplink/downlink pair): FM,SSB
2846  *      Several complex modes (one per uplink/downlink pair): USB/LSB,LSB/USB,FM
2847  *
2848  */
2849     QString delS = QString();
2850     delS = "DROP TABLE IF exists " + table;
2851     execQuery(Q_FUNC_INFO, delS);
2852 
2853     return execQuery(Q_FUNC_INFO, stringQuery);
2854 }
2855 
populateTableSatellites(const bool NoTmp)2856 bool DataBase::populateTableSatellites(const bool NoTmp)
2857 {
2858     // Data must come from:
2859     // https://lotw.arrl.org/lotw-help/frequently-asked-questions/#sats
2860        //qDebug() << "DataBase::populateTableSatellites" << QT_ENDL;
2861 
2862     //QSqlQuery query;
2863     QString tableName = QString();
2864     QString squery = QString();
2865     if (NoTmp)
2866     {
2867         tableName = "satellites";
2868     }
2869     else
2870     {
2871         tableName = "satellitestemp";
2872     }
2873 
2874     // The satmode column has the following format: {Up/down-mode;Up/down-mode}
2875     // this way we can implement several freqs/modes per sat
2876     // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also
2877     // being mode "SSB, CW, ... and other ADIF modes
2878     //To add a band, just create another line:
2879 
2880 
2881     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-10', 'AMSAT-OSCAR 10', '435.030,146.180', '145.81', 'SSB,CW')").arg(tableName));
2882     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-13', 'AMSAT-OSCAR 13', '435.423-435.573', '145.975-145.825', 'SSB,CW')").arg(tableName));
2883     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-16', 'AMSAT-OSCAR 16', '145.92', '437.026', 'FM/USB')").arg(tableName));
2884     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-21', 'OSCAR 21/RS-14', '', '145.8', 'CW')").arg(tableName));
2885     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-24', 'Arsene-OSCAR 24', '', '145.975', 'PKT')").arg(tableName));
2886     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-27', 'AMRAD-OSCAR 27', '145.85', '436.795', 'FM')").arg(tableName));
2887     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-3', 'AMSAT-OSCAR 3', '145.975-146.025', '144.325-144.375', 'SSB,CW')").arg(tableName));
2888     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-4', 'AMSAT-OSCAR 4', '432.145-432.155', '144.300-144.310', 'SSB,CW')").arg(tableName));
2889     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-40', 'AMSAT-OSCAR 40','145.840-145.990,435.790-435.520', '2401.2225-2401.475', 'SSB,CW')").arg(tableName));
2890     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-51', 'AMSAT-OSCAR 51', '145.92', '435.3', 'FM')").arg(tableName));
2891     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-6', 'AMSAT-OSCAR 6', '145.900-146.000', '29.450-29.550', 'SSB,CW')").arg(tableName));
2892     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-7', 'AMSAT-OSCAR 7', '145.850-145.950,432.180-432.120', '29.400-29.500,145.920-145.980', 'USB,LSB/USB')").arg(tableName));
2893     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-73', 'AMSAT-OSCAR 73', '435.150-435.130', '145.950-145.970', 'LSB/USB')").arg(tableName));
2894     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-8', 'AMSAT-OSCAR 8', '145.850-145.900,145.900-146.000', '29.400-29.500,435.200-435.100', 'SSB,CW')").arg(tableName));
2895     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-85', 'AMSAT-OSCAR 85 (Fox-1A)', '435.170', '145.980', 'FM')").arg(tableName));
2896     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('ARISS', 'ARISS', '145.200,144.490', '145.800,145.800', 'FM')").arg(tableName));
2897     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-BT', 'BHUTAN-1', '145.825', ',145.825', 'PKT')").arg(tableName));
2898     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-MY', 'UiTMSat-1', '145.825', ',145.825', 'PKT')").arg(tableName));
2899     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-PH', 'MAYA-1', '145.825', ',145.825', 'PKT')").arg(tableName));
2900     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BY70-1', 'Bayi Kepu Weixing 1', '145.92', '436.2', 'FM')").arg(tableName));
2901     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-3H', 'LilacSat 2', '144.350,144.390', '437.225,144.390', 'FM,PKT')").arg(tableName));
2902     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4A', 'CAMSAT 4A', '435.210-435.230', '145.880-145.860', 'LSB/USB')").arg(tableName));
2903     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4B', 'CAMSAT 4B', '435.270-435.290', '145.935-145.915', 'LSB/USB')").arg(tableName));
2904     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('DO-64', 'Delfi OSCAR-64', '', '145.870', 'CW')").arg(tableName));
2905     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-79', 'FUNcube-3', '435.047-435.077', '145.935-145.965', 'LSB/USB')").arg(tableName));
2906     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-88', 'Emirates OSCAR 88 (Nayif-1)', '435.045-435.015', '145.960-145.990', 'LSB/USB')").arg(tableName));
2907     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-12', 'Fuji-OSCAR 12', '145.900-146.000,145.85', '435.900-435.800,435.91', 'SSB,PKT')").arg(tableName));
2908     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-20', 'Fuji-OSCAR 20', '145.900-146.000', '435.900-435.800', 'SSB')").arg(tableName));
2909     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-29', 'Fuji-OSCAR 29', '145.900-145.999', '435.900-435.800', 'LSB/USB,CW')").arg(tableName));
2910     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('HO-68', 'Hope OSCAR 68', '145.925-145.975,145.825', '435.765-435.715,435.675', 'LSB/USB,FM')").arg(tableName));
2911     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('IO-86', 'Indonesia OSCAR 86 (LAPAN-ORARI)', '435.880', '145.880', 'FM')").arg(tableName));
2912     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-19', 'Lusat-OSCAR 19', '145.840-145.900', '437.125-437.150', 'CW')").arg(tableName));
2913     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-78', 'LituanicaSAT-1', '145.95,145.85', '435.1755,437.543', 'FM,PKT')").arg(tableName));
2914     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-87', 'LUSEX-OSCAR 87', '435.935-435.965', '145.935-145.965', 'LSB/USB')").arg(tableName));
2915     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('MIREX', 'Mir packet digipeater', '145.985', '145.985', 'PKT')").arg(tableName));
2916     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-44', 'Navy-OSCAR 44', '145.827', '145.827', 'PKT')").arg(tableName));
2917     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-83', 'BRICsat','145.825,28.120', '145.825,435.975','PKT,PSK31')").arg(tableName));
2918     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-84', 'PSAT', '145.825,28.120', '435.350', 'PKT,PSK31')").arg(tableName));
2919     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-1',  'Radio Sputnik 1', '145', '29', '')").arg(tableName));
2920     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-10', 'Radio Sputnik 10', '','29.357,29.403', '')").arg(tableName));
2921     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-11', 'Radio Sputnik 11', '','29.357,29.403', '')").arg(tableName));
2922     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-12', 'Radio Sputnik 12', '21.210-21.250', '29.410-29.450', 'SSB')").arg(tableName));
2923     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-13', 'Radio Sputnik 13', '21.260-21.300', '145.860-145.900', 'SSB')").arg(tableName));
2924     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-15', 'Radio Sputnik 15', '', '29.3525-29.3987', '')").arg(tableName));
2925     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-2',  'Radio Sputnik 2', '145', '29', '')").arg(tableName));
2926     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-44', 'DOSAAF-85', '145.935-145.995', '435.610-435.670', 'LSB/USB')").arg(tableName));
2927     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-5', 'Radio Sputnik 5', 'CW')").arg(tableName));
2928     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-6', 'Radio Sputnik 6', '')").arg(tableName));
2929     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-7', 'Radio Sputnik 7', 'CW')").arg(tableName));
2930     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-8', 'Radio Sputnik 8', '')").arg(tableName));
2931     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SAREX', 'Shuttle Amateur Radio Experiment packet digipeater', '144.80,144.49', '144.55', 'FM')").arg(tableName));
2932     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-35', 'Sunsat-OSCAR 35', '436.291', '145.825', 'FM')").arg(tableName));
2933     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-41', 'Saudi-OSCAR 41', '145.850', '436.775', 'CW')").arg(tableName));
2934     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-50', 'Saudi-OSCAR 50', '145.850', '436.795', 'FM')").arg(tableName));
2935     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-67', 'Sumbandila OSCAR 67', '145.875', '435.345', 'FM')").arg(tableName));
2936     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UKUBE1', 'UKube-1 (FUNcube-2)', '435.080-435.060', '145.930-145.950,2401.0', 'LSB/USB,CW')").arg(tableName));
2937     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UO-14', 'UOSAT-OSCAR 14', '145.975', '435.07', 'FM')").arg(tableName));
2938     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('VO-52', 'VUsat-OSCAR 52', '435.220-435.280,435.225-435.275', '145.930-145.870,145.925-145.875', 'LSB/USB')").arg(tableName));
2939     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2A', 'Hope 2A (CAS-3A)', '435.030-435.050', '145.665-145.685', 'LSB/USB')").arg(tableName));
2940     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2B', 'Hope 2B (CAS-3B)', '435.090-435.110', '145.730-145.750', 'LSB/USB')").arg(tableName));
2941     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2C', 'Hope 2C (CAS-3C)', '435.150-435.170', '145.795-145.815', 'LSB/USB')").arg(tableName));
2942     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2D', 'Hope 2D (CAS-3D)', '435.210-435.230', '145.860-145.880', 'LSB/USB')").arg(tableName));
2943     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2E', 'Hope 2E (CAS-3E)', '435.270-435.290', '145.915-145.935', 'LSB/USB')").arg(tableName));
2944     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2F', 'Hope 2F (CAS-3F)', '435.330-435.350', '145.980-145.999', 'LSB/USB')").arg(tableName));
2945     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-90', 'LilacSat-OSCAR 90 (LilacSat-1)', '145.985', '436.510', 'FM')").arg(tableName));
2946     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-91', 'RadFxSat (Fox-1B)', '435.250', '145.960', 'FM')").arg(tableName));
2947     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-92', 'Fox-1D', '435.350,1267.35', '145.880', 'FM')").arg(tableName));
2948     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FS-3', 'FalconSat-3', '435.103', '145.840', 'PKT')").arg(tableName));
2949     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('QO-100', 'Es''hail-2', '2400.050-2409.500', '10489.550-10499.000', 'SSB,CW')").arg(tableName));
2950 
2951 
2952        //qDebug() << "DataBase::populateTableSatellites - END" << QT_ENDL;
2953     return true;
2954 }
2955 
createTableEntity(const bool NoTmp)2956 bool DataBase::createTableEntity(const bool NoTmp)
2957 { // NoTmp = false => TMP data table to operate and be deleted afterwards
2958         //qDebug() << "DataBase::createTableEntity" << QT_ENDL;
2959 
2960     QString stringQuery = QString();
2961     //QSqlQuery query;
2962     if (NoTmp)
2963     {
2964         stringQuery = "CREATE TABLE entity" ;
2965     }
2966     else
2967     {
2968         stringQuery = "CREATE TABLE entitytemp" ;
2969     }
2970 
2971         stringQuery = stringQuery + QString( " (id INTEGER PRIMARY KEY AUTOINCREMENT, "
2972                                              "name VARCHAR(40) NOT NULL,"
2973                                              "cqz INTEGER NOT NULL, "
2974                                              "ituz INTEGER NOT NULL, "
2975                                              "continent INTEGER NOT NULL, "
2976                                              "latitude REAL NOT NULL, "
2977                                              "longitude REAL NOT NULL, "
2978                                              "utc INTEGER NOT NULL, "
2979                                              "dxcc INTEGER NOT NULL, "
2980                                              "mainprefix VARCHAR(15) NOT NULL, "
2981                                              "deleted INTEGER, "
2982                                              "sincedate VARCHAR(10), "
2983                                              "todate VARCHAR(10), "
2984                                              "isoname VARCHAR(10), "
2985                                              "UNIQUE (dxcc, mainprefix), "
2986                                              "FOREIGN KEY (continent) REFERENCES continent(shortname) )");
2987 
2988          //qDebug() << "DataBase::createTableEntity END" << QT_ENDL;
2989     return execQuery(Q_FUNC_INFO, stringQuery);
2990     //TODO: To add some columns in this the table to mark if worked/confirmed/band/Mode
2991 }
2992 
2993 
createTableBand(const bool NoTmp)2994 bool DataBase::createTableBand(const bool NoTmp)
2995 { // NoTmp = false => TMP data table to operate and be deleted afterwards
2996         //qDebug() << "DataBase::createTableBand" << QT_ENDL;
2997     QString stringQuery = QString();
2998     //QSqlQuery query;
2999     if (NoTmp)
3000     {
3001         stringQuery = "CREATE TABLE band" ;
3002     }
3003     else
3004     {
3005         stringQuery = "CREATE TABLE bandtemp" ;
3006     }
3007         stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, "
3008                                             "lower REAL NOT NULL, "
3009                                             "upper REAL NOT NULL, "
3010                                             "cabrillo VARCHAR(6) NOT NULL, "
3011                                             "name VARCHAR(40) NOT NULL, "
3012                                             "UNIQUE (lower, upper, cabrillo, name) )");
3013 
3014         //qDebug() << "DataBase::createTableBand END" << QT_ENDL;
3015     return execQuery(Q_FUNC_INFO, stringQuery);
3016 }
3017 
syncLogQSOsOnBandTableChange()3018 bool DataBase::syncLogQSOsOnBandTableChange()
3019 {
3020     //qDebug() << Q_FUNC_INFO << QT_ENDL;
3021     QString stringQuery;
3022     QSqlQuery query;
3023 
3024     stringQuery = "SELECT DISTINCT log.bandid FROM log ORDER BY bandid DESC";
3025 
3026     if (!query.exec(stringQuery))
3027     {
3028         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
3029         query.finish();
3030         return false;
3031     }
3032 
3033     QList<int> bandIDs;
3034     bandIDs.clear();
3035     int bandid = -1;
3036     while(query.next())
3037     {
3038         if (!query.isValid())
3039         {
3040             query.finish();
3041             return false;
3042         }
3043         bandid = (query.value(0)).toInt();
3044         if (bandid>0)
3045         {
3046             bandIDs.append (bandid);
3047             bandid = -1;
3048         }
3049     }
3050 
3051     if (bandIDs.length ()>0)
3052     {
3053         foreach(int i, bandIDs)
3054         {
3055             stringQuery = QString("UPDATE log SET bandid = (SELECT DISTINCT bandtemp.id FROM bandtemp INNER JOIN band ON band.name = bandtemp.name WHERE band.id='%1') WHERE log.bandid='%1'").arg(i);
3056             //qDebug() << Q_FUNC_INFO << ": " << stringQuery << QT_ENDL;
3057             if (!query.exec(stringQuery))
3058             {
3059                 query.finish();
3060                 return false;
3061             }
3062         }
3063     }
3064     query.finish ();
3065 
3066     //qDebug() << Q_FUNC_INFO << " - END" << QT_ENDL;
3067     return true;
3068 }
3069 
populateTableBand(const bool NoTmp)3070 bool DataBase::populateTableBand(const bool NoTmp)
3071 {
3072     // Cabrillo definition: http://wwrof.org/cabrillo/cabrillo-specification-v3/
3073 
3074         //qDebug() << "DataBase::populateTableBand" << QT_ENDL;
3075 
3076 
3077     QString tableName = QString();
3078     QString squery = QString();
3079     if (NoTmp)
3080     {
3081         tableName = "band";
3082     }
3083     else
3084     {
3085         tableName = "bandtemp";
3086     }
3087 
3088 
3089     //To add a band, just create another line:
3090     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('0', '0', '0', 'Light')").arg(tableName));
3091     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1mm', '241000', '250000', '241G')").arg(tableName));
3092     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2mm', '142000', '149000', '142G')").arg(tableName));
3093     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2.5mm', '119980', '120020', '119G')").arg(tableName));
3094     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4mm', '75500', '81000', '75G')").arg(tableName));
3095     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6mm', '47000', '47200', '47G')").arg(tableName));
3096     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25CM', '24000', '24250', '24G')").arg(tableName));
3097     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('3CM', '10000', '10500', '10G')").arg(tableName));
3098     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6CM', '5650', '5925', '5.7G')").arg(tableName));
3099     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('9CM', '3300', '3500', '3.4G')").arg(tableName));
3100     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('13CM', '2340', '2450', '2.3G')").arg(tableName));
3101     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('23CM', '1240', '1300', '1.2G')").arg(tableName));
3102     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('33CM', '902', '928', '902')").arg(tableName));
3103     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('70CM', '420', '450', '432')").arg(tableName));
3104     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25M', '222', '225', '222')").arg(tableName));
3105     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2M', '144', '148', '2M')").arg(tableName));
3106     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4M', '70', '71', '4M')").arg(tableName));
3107     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('5M', '54.000001', '69.9', '5M')").arg(tableName));
3108     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6M', '50', '54', '6M')").arg(tableName));
3109     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('8M', '40', '45', '8M')").arg(tableName));
3110     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('10M', '28.0', '29.7', '10M')").arg(tableName));
3111     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('12M', '24.89', '24.99', '12M')").arg(tableName));
3112     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('15M', '21.0', '21.45', '15M')").arg(tableName));
3113     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('17M', '18.068', '18.168', '17M')").arg(tableName));
3114     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('20M', '14.0', '14.35', '20M')").arg(tableName));
3115     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('30M', '10.0', '10.15', '40M')").arg(tableName));
3116     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('40M', '7.0', '7.3', '40M')").arg(tableName));
3117     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('60M', '5.102', '5.404', '60M')").arg(tableName));
3118     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('80M', '3.5', '4.0', '80M')").arg(tableName));
3119     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('160M', '1.8', '2.0', '160M')").arg(tableName));
3120     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('560M', '0.501', '0.504', '560M')").arg(tableName));
3121     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('630M', '0.472', '0.479', '630M')").arg(tableName));
3122     execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2190M', '0.1357', '0.1378', '2190M')").arg(tableName));
3123 
3124     createTheBandQuickReference();
3125 
3126         //qDebug() << "DataBase::populateTableBand END" << QT_ENDL;
3127     return true;
3128 }
3129 
3130 
populatePropagationModes()3131 bool DataBase::populatePropagationModes()
3132 {
3133         //qDebug() << "DataBase::populatePropagationModes" << QT_ENDL;
3134     //QSqlQuery query;
3135 
3136     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')"));
3137     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUR', 'Aurora')"));
3138     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUE', 'Aurora-E')"));
3139     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('BS', 'Back scatter')"));
3140     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ECH', 'EchoLink')"));
3141     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('EME', 'Earth-Moon-Earth')"));
3142     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ES', 'Sporadic E')"));
3143     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('FAI', 'Field Aligned Irregularities')"));
3144     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('F2', 'F2 Reflection')"));
3145     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('INTERNET', 'Internet-assisted')"));
3146     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ION', 'Ionoscatter')"));
3147     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('IRL', 'IRLP')"));
3148     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('MS', 'Meteor scatter')"));
3149     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RPT', 'Terrestrial or atmospheric repeater or transponder')"));
3150     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RS', 'Rain scatter')"));
3151     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('SAT', 'Satellite')"));
3152     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TEP', 'Trans-equatorial')"));
3153     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TR', 'Tropospheric ducting')"));
3154 
3155        //qDebug() << "DataBase::populatePropagationModes END" << QT_ENDL;
3156     return true;
3157 }
3158 
3159 
populateContestData()3160 bool DataBase::populateContestData()
3161 {
3162         //qDebug() << "DataBase::populateContestData" << QT_ENDL;
3163 
3164 
3165 
3166     // CONTEST DEFINITIONS START HERE
3167 
3168     // DX
3169     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (0, 0, 0, 0, 0, 0, 0)");
3170 
3171     // DX START
3172 /*
3173     // CQ WW DX SSB START
3174     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 0, 1)");
3175     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 0, 1)");
3176     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 0, 1)");
3177     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 0, 1)");
3178     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 0, 1)");
3179     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 0, 1)");
3180     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 0, 1)");
3181     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 0, 1)");
3182     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 0, 1)");
3183     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 0, 1)");
3184     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 0, 1)");
3185     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 0, 1)");
3186 
3187 
3188     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 1, 1)");
3189     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 1, 1)");
3190     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 1, 1)");
3191     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 1, 1)");
3192     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 1, 1)");
3193     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 1, 1)");
3194     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 1, 1)");
3195     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 1, 1)");
3196     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 1, 1)");
3197     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 1, 1)");
3198     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 1, 1)");
3199     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 1, 1)");
3200 
3201     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 2, 1)");
3202     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 2, 1)");
3203     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 2, 1)");
3204     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 2, 1)");
3205     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 2, 1)");
3206     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 2, 1)");
3207     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 2, 1)");
3208     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 2, 1)");
3209     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 2, 1)");
3210     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 2, 1)");
3211     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 2, 1)");
3212     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 2, 1)");
3213 
3214     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 1, 1, 0, 1)");
3215     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 2, 1, 0, 1)");
3216     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 1, 1, 0, 1)");
3217     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 2, 1, 0, 1)");
3218     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 4, 0, 1, 1, 0, 1)");
3219     execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 5, 0, 0, 0, 0, 1)");
3220     // CQ WW DX SSB END
3221 */
3222 
3223         //qDebug() << "DataBase::populateContestData END" << QT_ENDL;
3224     return true;
3225 }
3226 
howManyQSOsInLog(const int i)3227 bool DataBase::howManyQSOsInLog(const int i)
3228 {
3229         //qDebug() << "DataBase::howManyQSOsInLog" << QT_ENDL;
3230 
3231     QSqlQuery query;
3232     QString sqlQueryString = QString("SELECT COUNT(id) from log WHERE lognumber='%1'").arg(i);
3233     bool sqlOK = query.exec(sqlQueryString);
3234 
3235     if (sqlOK)
3236     {
3237         query.next();
3238         if (query.isValid())
3239         {
3240                 //qDebug() << "DataBase::howManyQSOsInLog OK END" << QT_ENDL;
3241             return (query.value(0)).toInt();
3242         }
3243         else
3244         {
3245                 //qDebug() << "DataBase::howManyQSOsInLog END-1" << QT_ENDL;
3246             query.finish();
3247             return false;
3248         }
3249     }
3250     else
3251     {
3252         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
3253         query.finish();
3254             //qDebug() << "DataBase::howManyQSOsInLog END-2" << QT_ENDL;
3255         return false;
3256     }
3257     //query.finish();
3258     //return -2;
3259 }
3260 
updateTo006()3261 bool DataBase::updateTo006()
3262 {// Updates the DB to 0.0.6
3263        //qDebug() << "DataBase::updateTo006: latestRead: " << getDBVersion() << QT_ENDL;
3264     bool IAmIn006 = false;
3265     bool IAmIn005 = false;
3266     bool ErrorUpdating = false;
3267     QString stringQuery = QString();
3268 
3269     bool sqlOk = false;
3270     latestReaded = getDBVersion().toFloat();
3271     if (latestReaded >= 0.006f)
3272     {
3273         return true;
3274     }
3275     else
3276     {
3277         IAmIn006 = false;
3278     }
3279 
3280     while (!IAmIn006 && !ErrorUpdating)
3281     {
3282              //qDebug() << "DataBase::updateTo006: - Still not in 006" << QT_ENDL;
3283         while (!IAmIn005 && !ErrorUpdating)
3284         {
3285                //qDebug() << "DataBase::updateTo006: - And still not in 005" << QT_ENDL;
3286             IAmIn005 = updateTo005();
3287         }
3288            //qDebug() << "DataBase::updateTo006: - Already in 005" << QT_ENDL;
3289         if (ErrorUpdating)
3290         {
3291                //qDebug() << "DataBase::updateTo006: UPDATED NOK!(0)" << QT_ENDL;
3292             return false;
3293         }
3294 
3295         sqlOk = updateDBVersion(softVersion, "0.006");
3296 
3297         if(sqlOk)
3298         {
3299                //qDebug() << "DataBase::updateTo006: - DB Updated" << QT_ENDL;
3300             sqlOk = recreatePropModes();
3301 
3302             if(sqlOk)
3303             {
3304                    //qDebug() << "DataBase::updateTo006: - recreatePropModes OK" << QT_ENDL;
3305                 sqlOk = updateTableLog(6); // We copy the log into logtemp
3306             }
3307             else
3308             {
3309                    //qDebug() << "DataBase::updateTo006: - recreatePropModes NOK" << QT_ENDL;
3310                 ErrorUpdating = true;
3311                 IAmIn006 = false;
3312                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(1)" << QT_ENDL;
3313                 return false;
3314             }
3315 
3316             sqlOk = createTableBand(false);             // We create the bandTemp
3317             if (sqlOk)
3318             {
3319                    //qDebug() << "DataBase::updateTo006: - createTableBand OK" << QT_ENDL;
3320             }
3321             else
3322             {
3323                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(2)" << QT_ENDL;
3324                 ErrorUpdating = true;
3325                 //return false;
3326             }
3327 
3328             sqlOk = populateTableBand(false);           // Populate the bandTemp
3329             if (sqlOk)
3330             {
3331                    //qDebug() << "DataBase::updateTo006: - populateTableBand OK" << QT_ENDL;
3332             }
3333             else
3334             {
3335                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(3)" << QT_ENDL;
3336                 ErrorUpdating = true;
3337             }
3338 
3339             sqlOk = updateBandIdTableLogToNewOnes();
3340             if (sqlOk)
3341             {
3342                    //qDebug() << "DataBase::updateTo006: - updateBandIdTableLogToNewOnes OK" << QT_ENDL;
3343             }
3344             else
3345             {
3346                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(4)" << QT_ENDL;
3347                 ErrorUpdating = true;
3348             }
3349 
3350             sqlOk = updateBandIdTableAward(1); // DXCC
3351             if (sqlOk)
3352             {
3353                    //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 1 OK" << QT_ENDL;
3354             }
3355             else
3356             {
3357                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(5)" << QT_ENDL;
3358                 ErrorUpdating = true;
3359             }
3360 
3361             sqlOk = updateBandIdTableAward(2); // WAZ
3362             if (sqlOk)
3363             {
3364                    //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 2 OK" << QT_ENDL;
3365             }
3366             else
3367             {
3368                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(6)" << QT_ENDL;
3369                 ErrorUpdating = true;
3370             }
3371 
3372 
3373             if (execQuery(Q_FUNC_INFO, "DROP TABLE band"))
3374             {
3375                 if (execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band"))
3376                 {
3377                        //qDebug() << "DataBase::updateTo006 - bandtemp renamed" << QT_ENDL;
3378                 }
3379                 else
3380                 {
3381                        //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not renamed" << QT_ENDL;
3382                     ErrorUpdating = true;
3383                        //qDebug() << "DataBase::updateTo006: UPDATED NOK!(7)" << QT_ENDL;
3384                 }
3385             }
3386             else
3387             {
3388                    //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not dropped" << QT_ENDL;
3389                 ErrorUpdating = true;
3390                 IAmIn006 = false;
3391                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(8)" << QT_ENDL;
3392                 ErrorUpdating = true;
3393             }
3394 
3395             sqlOk = updateTheModeTableAndSyncLog();
3396             if (sqlOk)
3397             {
3398                    //qDebug() << "DataBase::updateTo006: - updateTheModeTableAndSyncLog OK" << QT_ENDL;
3399             }
3400             else
3401             {
3402                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(9)" << QT_ENDL;
3403                 ErrorUpdating = true;
3404             }
3405 
3406             sqlOk = createTableClubLogStatus();
3407             if (sqlOk)
3408             {
3409                    //qDebug() << "DataBase::updateTo006: - createTableClubLogStatus OK" << QT_ENDL;
3410                 sqlOk = populateTableClubLogStatus();
3411                 if (sqlOk)
3412                 {
3413                        //qDebug() << "DataBase::updateTo006: - populateTableClubLogStatus OK" << QT_ENDL;
3414                 }
3415                 else
3416                 {
3417                        //qDebug() << "DataBase::updateTo006: UPDATED NOK!(10)" << QT_ENDL;
3418                     ErrorUpdating = true;
3419                 }
3420             }
3421             else
3422             {
3423                    //qDebug() << "DataBase::updateTo006: UPDATED NOK!(11)" << QT_ENDL;
3424                 ErrorUpdating = true;
3425             }
3426         }
3427         else
3428         {// Version not updated
3429                //qDebug() << "DataBase::updateTo006: - DB NOT Updated" << QT_ENDL;
3430             ErrorUpdating = true;
3431             IAmIn006 = false;
3432                //qDebug() << "DataBase::updateTo006: UPDATED NOK!(12)" << QT_ENDL;
3433             ErrorUpdating = true;
3434         }
3435            //qDebug() << "DataBase::updateTo006: - IAmIn006 = TRUE" << QT_ENDL;
3436         IAmIn006 = true;
3437     }
3438         //DO ALL THE TASKS TO BE IN 0.006 from 0.005 HERE and set ErrorUpdating if it is not possible.
3439              //qDebug() << "DataBase::updateTo006 - I am in 006 " << QT_ENDL;
3440          //qDebug() << "DataBase::updateTo006 - END " << QT_ENDL;
3441        //qDebug() << "DataBase::updateTo006: UPDATED OK!" << QT_ENDL;
3442     if (!IAmIn006)
3443      {
3444        // emit debugLog(Q_FUNC_INFO, "2", 7);
3445      }
3446     return IAmIn006;
3447 }
3448 
updateTableLog(const int _v)3449 bool DataBase::updateTableLog(const int _v)
3450 {
3451        //qDebug() << "DataBase::updateTableLog " << QT_ENDL;
3452     createTableLog(false);
3453     QString queryString;
3454     switch (_v)
3455     {
3456     case 6:     // If 6, we copy in logtemp the full data coming from the old log. This way, the structure of
3457                 // the log table is updated without any data loss.
3458         queryString = QString ("INSERT INTO logtemp (qso_date, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, points, multiplier, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, transmiterid, marked, lognumber) SELECT qso_date, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, points, multiplier, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, transmiterid, marked, lognumber FROM log");
3459     break;
3460     default:
3461             //qDebug() << "DataBase::updateTableLog FALSE END" << QT_ENDL;
3462         return false;
3463     //break;
3464     }
3465 
3466     if (execQuery(Q_FUNC_INFO, queryString))
3467     {
3468             //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Query executed" << QT_ENDL;
3469         queryString = "DROP TABLE log";
3470         if (execQuery(Q_FUNC_INFO, queryString))
3471         {
3472                 //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log dropped" << QT_ENDL;
3473 
3474             queryString = "ALTER TABLE logtemp RENAME TO log" ;
3475             if (execQuery(Q_FUNC_INFO, queryString))
3476             {
3477                    //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - tmp renamed - END" << QT_ENDL;
3478                 return true;
3479             }
3480             else
3481             {
3482                     //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Renaming failed" << QT_ENDL;
3483             }
3484         }
3485         else
3486         {
3487                 //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log Not dropped" << QT_ENDL;
3488         }
3489     }
3490     else
3491     {
3492             //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - query failed" << QT_ENDL;
3493     }
3494         //qDebug() << "DataBase::updateTableLog END" << QT_ENDL;
3495     return false;
3496 }
3497 
3498 
createTableClubLogStatus()3499 bool DataBase::createTableClubLogStatus()
3500 {
3501         //qDebug() << "createTableClubLogStatus" << QT_ENDL;
3502 
3503     execQuery(Q_FUNC_INFO, "DROP TABLE IF exists clublog_status");
3504     QString queryString = QString("CREATE TABLE clublog_status ("
3505                "id INTEGER PRIMARY KEY AUTOINCREMENT, "
3506                "shortname VARCHAR(1) NOT NULL, "
3507                "name VARCHAR(15) NOT NULL)");
3508 
3509     return execQuery(Q_FUNC_INFO, queryString);
3510 }
3511 
populateTableClubLogStatus()3512 bool DataBase::populateTableClubLogStatus()
3513 {
3514         //qDebug() << "populateTableClubLogStatus" << QT_ENDL;
3515 
3516     QString queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('Y', 'Uploaded')";
3517 
3518 
3519     if (execQuery(Q_FUNC_INFO, queryString))
3520     {
3521         queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('N', 'Do not upload')";
3522         if (execQuery(Q_FUNC_INFO, queryString))
3523         {
3524             queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('M', 'Modified')";
3525                 //qDebug() << "populateTableClubLogStatus END" << QT_ENDL;
3526             return execQuery(Q_FUNC_INFO, queryString);
3527         }
3528     }
3529         //qDebug() << "populateTableClubLogStatus FALSE END" << QT_ENDL;
3530     return false;
3531 }
3532 
updateTableEntity()3533 bool DataBase::updateTableEntity()
3534 {
3535         //qDebug() << "DataBase::updateTableEntity" << QT_ENDL;
3536     bool result = false;
3537     QString stringQuery;
3538     bool sqlOk;
3539 
3540     result = createTableEntity(false);  // Now we have a temp entity table with the correct format
3541     if (result)
3542     {
3543             //qDebug() << "DataBase::updateTableEntity: Table entitytemp created!" << QT_ENDL;
3544         // Now we need to move all the data from the old to the temp entity table.
3545 
3546         stringQuery = QString("INSERT INTO entitytemp (name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate) SELECT name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate FROM entity");
3547 
3548         sqlOk = execQuery(Q_FUNC_INFO, stringQuery);
3549 
3550         if (sqlOk)
3551         {
3552                 //qDebug() << "DataBase::updateTableEntity: Data copied from entity to entitytemp!" << QT_ENDL;
3553             stringQuery = "DROP TABLE entity";
3554             if (execQuery(Q_FUNC_INFO, stringQuery))
3555             {
3556                     //qDebug() << "DataBase::updateTableEntity: Table entity DELETED" << QT_ENDL;
3557                 stringQuery = "ALTER TABLE entitytemp RENAME TO entity";
3558                 return execQuery(Q_FUNC_INFO, stringQuery);
3559             }
3560             else
3561             {
3562                return false;
3563             }
3564         }
3565         else
3566         {
3567                 //qDebug() << "DataBase::updateTableEntity: Data NOT copied from entity to entitytemp!" << QT_ENDL;
3568             //TODO: If it fails, we should manage errors...
3569             return false;
3570         }
3571     }
3572     else
3573     {
3574             //qDebug() << "DataBase::updateTableEntity: Table entitytemp NOT created!" << QT_ENDL;
3575         return false;
3576     }
3577 
3578     //return false;
3579 }
3580 
updateTableLogs()3581 bool DataBase::updateTableLogs()
3582 {
3583         //qDebug() << "DataBase::updateTableLogs" << QT_ENDL;
3584     bool result = false;
3585     QString stringQuery;
3586     bool sqlOk;
3587 
3588     result = createTableLogs(false);  // Now we have a temp entity table with the correct format
3589 
3590     if (result)
3591     {
3592             //qDebug() << "DataBase::updateTableLogs: Table logstemp created!" << QT_ENDL;
3593         // Now we need to move all the data from the old to the temp logs table.
3594 
3595         stringQuery = QString("INSERT INTO logstemp (logdate, stationcall, comment, logtype, logtypen) SELECT logdate, stationcall, comment, logtype, logtypen FROM logs");
3596 
3597         sqlOk = execQuery(Q_FUNC_INFO, stringQuery);
3598 
3599         if (sqlOk)
3600         {
3601                 //qDebug() << "DataBase::updateTableLogs: data copied" << QT_ENDL;
3602 
3603             stringQuery = "DROP TABLE logs";
3604             if (execQuery(Q_FUNC_INFO, stringQuery))
3605             {
3606                     //qDebug() << "DataBase::updateTableLogs: Table logs DELETED" << QT_ENDL;
3607                 stringQuery = "ALTER TABLE logstemp RENAME TO logs";
3608                 return execQuery(Q_FUNC_INFO, stringQuery);
3609             }
3610             else
3611             {
3612                    //qDebug() << "DataBase::updateTableLogs: Table logs NOT DELETED" << QT_ENDL;
3613                return false;
3614             }
3615         }
3616         else
3617         {
3618             //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
3619                 //qDebug() << "DataBase::updateTableLogs: data NOT copied" << QT_ENDL;
3620             //TODO: If it fails, we should manage errors...
3621             return false;
3622         }
3623     }
3624     else
3625     {
3626             //qDebug() << "DataBase::updateTableLogs: Table logstemp NOT created!" << QT_ENDL;
3627         return false;
3628     }
3629 
3630         //qDebug() << "DataBase::updateTableLogs: END" << QT_ENDL;
3631     //return false;
3632 }
3633 
updateModeIdFromSubModeId()3634 bool DataBase::updateModeIdFromSubModeId()
3635 {// Updates the log with the new mode IDs in each QSO:
3636     // STEP-1: Get the modeid and QSOid from the log
3637     // STEP-2: uses the modeid to get the name of the mode in the mode table (the old one)
3638     // STEP-3: uses the name of the mode in the modetemp table (the new one) to get the new ID
3639     // STEP-4: Updates the new ID in the QSO in the log
3640     //TODO: Optimize this function
3641 
3642          //qDebug() << "DataBase::updateModeIdFromSubModeId: "  << QT_ENDL;
3643     bool cancel = false;
3644     bool alreadyCancelled = false;
3645     QString modetxt = QString();
3646     QString sq = QString();
3647     bool sqlOk2 = false;
3648     bool sqlOk3 = false;
3649     int modeFound = -1;
3650     int id = -1;
3651 
3652     int qsos;
3653     int i = 0;
3654     QString aux;
3655     QSqlQuery query, query2;
3656     bool sqlOk = query.exec("SELECT COUNT (*) FROM log");
3657 
3658     if (sqlOk)
3659     {
3660         //QSqlDatabase::database().commit();
3661         query.next();
3662         qsos = (query.value(0)).toInt();
3663         query.finish();
3664     }
3665     else
3666     {
3667         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
3668         query.finish();
3669              //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END"  << QT_ENDL;
3670         return false;
3671     }
3672 
3673     int step = util->getProgresStepForDialog(qsos);
3674 
3675     QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos);
3676     progress.setMaximum(qsos);
3677     progress.setWindowModality(Qt::WindowModal);
3678 
3679     sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY modeid");                                                   // STEP-1
3680 
3681     if (sqlOk)
3682     {
3683         while (query.next())
3684         {
3685             modetxt = QString();
3686             modeFound = -1;
3687 
3688             if (query.isValid())
3689             {
3690                 i++;
3691 
3692                 if (( (i % step )== 0) )
3693                 { // To update the speed I will only show the progress once each X QSOs
3694                     aux = QObject::tr("Updating mode information...") + "\n" + QObject::tr("QSO: ")  + QString::number(i) + "/" + QString::number(qsos);
3695                     progress.setLabelText(aux);
3696                     progress.setValue(i);
3697                 }
3698 
3699                 modeFound = (query.value(0)).toInt();
3700                 id = (query.value(1)).toInt();
3701                      //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-1) modeFound (numb): " << QString::number(modeFound) << QT_ENDL;
3702 
3703                 modetxt = getModeNameFromNumber(modeFound, false);                                                      //STEP-2
3704 
3705                      //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-2) mode found (txt): " << modetxt << QT_ENDL;
3706 
3707                 //TODO The following query can be executed in: getModeIdFromSubMode()
3708 
3709                 sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(modetxt);                                // STEP-3
3710                 sqlOk2 = query2.exec(sq);
3711 
3712                 if (sqlOk2)
3713                 {
3714                          //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) sqlOK2 TRUE" << QT_ENDL;
3715                     if (query2.next())
3716                     {
3717                         if (query2.isValid())
3718                         {
3719                             modeFound = query2.value(0).toInt();
3720                             query2.finish();
3721                             sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(modeFound).arg(id);           // STEP-4
3722                             sqlOk3 = execQuery(Q_FUNC_INFO, sq);
3723 
3724                             if (sqlOk3)
3725                             {
3726                                 //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " updated to: " << QString::number(modeFound) <<"/"<< modetxt << QT_ENDL;
3727                             }
3728                             else
3729                             {
3730                                 //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery());
3731                                      //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " NOT updated-2"  << QT_ENDL;
3732                             }
3733                         }
3734                         else
3735                         {
3736                             query2.finish();
3737                                  //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) query2 not valid "   << QT_ENDL;
3738                         }
3739                     }
3740                     else
3741                     {
3742                           //qDebug() << "DataBase::updateModeIdFromSubModeId: query2 not next "   << QT_ENDL;
3743                     }
3744                 }
3745                 else
3746                 {
3747                     queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery());
3748                     query2.finish();
3749                          //qDebug() << "DataBase::updateModeIdFromSubModeId: ID: " << QString::number(id) << " NOT updated-1"  << QT_ENDL;
3750                 }
3751             }
3752 
3753             if ( progress.wasCanceled() )
3754             {
3755                 if (!alreadyCancelled)
3756                 {
3757                     alreadyCancelled = true;
3758 
3759                     QMessageBox msgBox;
3760                     msgBox.setWindowTitle(QObject::tr("KLog - DB update"));
3761                     aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?");
3762                     msgBox.setText(aux);
3763                     msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
3764                     msgBox.setDefaultButton(QMessageBox::No);
3765                     int ret = msgBox.exec();
3766                     switch (ret) {
3767                       case QMessageBox::Yes:
3768                           // Yes was clicked
3769                             cancel = true;
3770                           break;
3771 
3772                       case QMessageBox::No:
3773                           // No Save was clicked
3774                             cancel = false;
3775                             progress.setCancelButton(nullptr);
3776                           break;
3777                       default:
3778                           // should never be reached
3779                             cancel = false;
3780                           break;
3781                     }
3782                 }
3783             }
3784         }
3785         query.finish();
3786         if (cancel && (!alreadyCancelled))
3787         {
3788                 //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 2"  << QT_ENDL;
3789             query.finish();
3790             return false;
3791         }
3792 
3793             //qDebug() << "DataBase::updateModeIdFromSubModeId: END"  << QT_ENDL;
3794 
3795         query.finish();
3796         return true;
3797     }
3798     else
3799     {
3800         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
3801             //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 3"  << QT_ENDL;
3802         query.finish();
3803         return false;
3804     }
3805         //qDebug() << "DataBase::updateModeIdFromSubModeId: CHECK IF this is seen - END"  << QT_ENDL;
3806     //query.finish();
3807    //return false;
3808 }
3809 
3810 
updateBandIdTableLogToNewOnes()3811 bool DataBase::updateBandIdTableLogToNewOnes()
3812 {
3813        //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: "  << QT_ENDL;
3814 
3815     QString bandtxt = QString();
3816 
3817     bool cancel = false;
3818     bool alreadyCancelled = false;
3819     //int errorCode = -1;
3820 
3821     QString sq = QString();
3822     bool sqlOk2 = false;
3823     bool sqlOk3 = false;
3824     int bandFound = -1;
3825     int id = -1;
3826     int qsos;
3827     int i = 0;
3828     QString aux;
3829     QSqlQuery query, query2;
3830     bool sqlOk = query.exec("SELECT COUNT (*) FROM log");
3831 
3832     if (sqlOk)
3833     {
3834         query.next();
3835         qsos = (query.value(0)).toInt();
3836         query.finish();
3837     }
3838     else
3839     {
3840         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
3841         //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END"  << QT_ENDL;
3842         query.finish();
3843         return false;
3844     }
3845 
3846     int step = util->getProgresStepForDialog(qsos);
3847 
3848     QProgressDialog progress(QObject::tr("Updating bands information..."), QObject::tr("Abort updating"), 0, qsos);
3849     progress.setMaximum(qsos);
3850     progress.setWindowModality(Qt::WindowModal);
3851 
3852     sqlOk = query.exec("SELECT bandid, id FROM log ORDER BY bandid DESC");
3853 
3854     if (sqlOk)
3855     {
3856         while (query.next() && (!cancel) )
3857         {
3858             bandtxt = QString();
3859             bandFound = -1;
3860 
3861             if (query.isValid())
3862             {
3863                 i++;
3864 
3865                 if (( (i % step )== 0) )
3866                 { // To update the speed I will only show the progress once each X QSOs
3867                     aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("QSO: ")  + QString::number(i) + "/" + QString::number(qsos);
3868                     progress.setLabelText(aux);
3869                     progress.setValue(i);
3870                 }
3871 
3872 
3873                 bandFound = (query.value(0)).toInt();
3874                 id = (query.value(1)).toInt();
3875                 bandtxt = getBandNameFromNumber(bandFound);
3876 
3877                      //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: band found: " << bandtxt << QT_ENDL;
3878 
3879                 sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt);
3880                 sqlOk2 = query2.exec(sq);
3881 
3882                 if (sqlOk2)
3883                 {
3884                     if (query2.next())
3885                     {
3886                         if (query2.isValid())
3887                         {
3888                             bandFound = query2.value(0).toInt();
3889 
3890                             sq = QString ("UPDATE log SET bandid='%1' WHERE id='%2'").arg(bandFound).arg(id);
3891                             query.finish();
3892                             sqlOk3 = execQuery(Q_FUNC_INFO, sq);
3893                             if (sqlOk3)
3894                             {
3895                                      //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL;
3896                             }
3897                             else
3898                             {
3899                                 //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery());
3900                                      //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2"  << QT_ENDL;
3901                                     //qDebug() << "DataBase::updateBandIdTableLogToNewOnes - QSOs not updated to main log" << QT_ENDL;
3902                             }
3903                         }
3904                         else
3905                         {
3906                                  //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not valid "   << QT_ENDL;
3907                         }
3908                     }
3909                     else
3910                     {
3911                           //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not next "   << QT_ENDL;
3912                     }
3913                     query2.finish();
3914                 }
3915                 else
3916                 {
3917                     queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery());
3918                     query2.finish();
3919                          //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1"  << QT_ENDL;
3920                 }
3921             }
3922 
3923             if ( progress.wasCanceled() )
3924             {
3925                 if (!alreadyCancelled)
3926                 {
3927                     alreadyCancelled = true;
3928 
3929                     QMessageBox msgBox;
3930                     msgBox.setWindowTitle(QObject::tr("KLog - DB update"));
3931                     aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?");
3932                     msgBox.setText(aux);
3933                     msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
3934                     msgBox.setDefaultButton(QMessageBox::No);
3935                     int ret = msgBox.exec();
3936                     switch (ret) {
3937                       case QMessageBox::Yes:
3938                           // Yes was clicked
3939                             cancel = true;
3940                           break;
3941 
3942                       case QMessageBox::No:
3943                           // No Save was clicked
3944                             cancel = false;
3945                             progress.setCancelButton(nullptr);
3946                           break;
3947                       default:
3948                           // should never be reached
3949                             cancel = false;
3950                           break;
3951                     }
3952                 }
3953             }
3954         }
3955         query.finish();
3956         if (cancel && (!alreadyCancelled))
3957         {
3958                 //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 2"  << QT_ENDL;
3959             return false;
3960         }
3961             //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: END OK"  << QT_ENDL;
3962         return true;
3963     }
3964     else
3965     {
3966         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
3967         query.finish();
3968             //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 3"  << QT_ENDL;
3969         return false;
3970     }
3971 }
3972 
updateBandIdTableAward(const int _db)3973 bool DataBase::updateBandIdTableAward(const int _db)
3974 {
3975        //qDebug() << "DataBase::updateBandIdTableAward: "  << QT_ENDL;
3976 
3977     QString table = QString();
3978     QString field = QString();
3979     QString awardSelected = QString();
3980 
3981     switch (_db) {
3982       case 1: //
3983             table = "awarddxcc";
3984             field = "band";
3985             awardSelected = "DXCC";
3986           break;
3987 
3988       case 2:
3989             table = "awardwaz";
3990             field = "band";
3991             awardSelected = "WAZ";
3992           break;
3993       default:
3994                 //qDebug() << "DataBase::updateBandIdTableAward: FALSE END"  << QT_ENDL;
3995             return false;
3996           //break;
3997     }
3998 
3999     QString bandtxt = QString();
4000 
4001     bool cancel = false;
4002     bool alreadyCancelled = false;
4003     //int errorCode = -1;
4004 
4005 
4006     QString sq = QString();
4007     bool sqlOk2 = false;
4008     bool sqlOk3 = false;
4009     int bandFound = -1;
4010     int id = -1;
4011     int qsos;
4012     int i = 0;
4013     QString aux;
4014     QSqlQuery query, query2;
4015 
4016 
4017     sq = QString("SELECT COUNT (*) FROM %1").arg(table);
4018 
4019     bool sqlOk = query.exec(sq);
4020 
4021     if (sqlOk)
4022     {
4023         query.next();
4024         qsos = (query.value(0)).toInt();
4025         query.finish();
4026     }
4027     else
4028     {
4029         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
4030         query.finish();
4031             //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-2"  << QT_ENDL;
4032         return false;
4033     }
4034 
4035     int step = util->getProgresStepForDialog(qsos);
4036     QString progressmsg = QString(QObject::tr("Updating bands information in %1 status...")).arg(awardSelected);
4037 
4038     QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos);
4039     progress.setMaximum(qsos);
4040     progress.setWindowModality(Qt::WindowModal);
4041 
4042 
4043     sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field);
4044 
4045     sqlOk = query.exec(sq);
4046 
4047     if (sqlOk)
4048     {
4049         while (query.next() && (!cancel) )
4050         {
4051             bandtxt = QString();
4052             bandFound = -1;
4053 
4054             if (query.isValid())
4055             {
4056                 i++;
4057 
4058                 if (( (i % step )== 0) )
4059                 { // To update the speed I will only show the progress once each X QSOs
4060                     aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ")  + QString::number(i) + "/" + QString::number(qsos);
4061                     progress.setLabelText(aux);
4062                     progress.setValue(i);
4063                 }
4064 
4065 
4066                 bandFound = (query.value(0)).toInt();
4067                 id = (query.value(1)).toInt();
4068                 bandtxt = getBandNameFromNumber(bandFound);
4069 
4070                      //qDebug() << "DataBase::updateBandIdTableAward: band found: " << bandtxt << QT_ENDL;
4071 
4072                 sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt);
4073                 sqlOk2 = query2.exec(sq);
4074 
4075                 if (sqlOk2)
4076                 {
4077                     if (query2.next())
4078                     {
4079                         if (query2.isValid())
4080                         {
4081                             bandFound = query2.value(0).toInt();
4082                             query2.finish();
4083                             sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id);
4084 
4085                             sqlOk3 = execQuery(Q_FUNC_INFO, sq);
4086                             if (sqlOk3)
4087                             {
4088                                      //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL;
4089                             }
4090                             else
4091                             {
4092                                 //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery());
4093                                     //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-2"  << QT_ENDL;
4094 
4095                                     //qDebug() << "DataBase::updateBandIdTableAward - QSOs not updated to main log" << QT_ENDL;
4096                             }
4097                         }
4098                         else
4099                         {
4100                                  //qDebug() << "DataBase::updateBandIdTableAward: query2 not valid "   << QT_ENDL;
4101                         }
4102                     }
4103                     else
4104                     {
4105                           //qDebug() << "DataBase::updateBandIdTableAward: query2 not next "   << QT_ENDL;
4106                     }
4107                     query2.finish();
4108                 }
4109                 else
4110                 {
4111                     queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery());
4112                     query2.finish();
4113                          //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-1"  << QT_ENDL;
4114                 }
4115             }
4116             if ( progress.wasCanceled() )
4117             {
4118                 if (!alreadyCancelled)
4119                 {
4120                     alreadyCancelled = true;
4121 
4122                     QMessageBox msgBox;
4123                     msgBox.setWindowTitle(QObject::tr("KLog - DB update"));
4124                     aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?");
4125                     msgBox.setText(aux);
4126                     msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
4127                     msgBox.setDefaultButton(QMessageBox::No);
4128                     int ret = msgBox.exec();
4129                     switch (ret) {
4130                       case QMessageBox::Yes:
4131                           // Yes was clicked
4132                             cancel = true;
4133                           break;
4134 
4135                       case QMessageBox::No:
4136                           // No Save was clicked
4137                             cancel = false;
4138                             progress.setCancelButton(nullptr);
4139                           break;
4140                       default:
4141                           // should never be reached
4142                             cancel = false;
4143                           break;
4144                     }
4145                 }
4146             }
4147         }
4148         if (cancel && (!alreadyCancelled))
4149         {
4150                 //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-3"  << QT_ENDL;
4151             query.finish();
4152             return false;
4153         }
4154            //qDebug() << "DataBase::updateBandIdTableAward: END OK"  << QT_ENDL;
4155         query.finish();
4156         return true;
4157     }
4158     else
4159     {
4160         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
4161             //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-4"  << QT_ENDL;
4162         query.finish();
4163         return false;
4164     }
4165          //qDebug() << "DataBase::updateBandIdTableAward: CHECK IF SEEN END"  << QT_ENDL;
4166     //query.finish();
4167     //return false;
4168 }
4169 
updateModeIdTableAward(const int _db)4170 bool DataBase::updateModeIdTableAward(const int _db)
4171 {
4172        //qDebug() << "DataBase::updateModeIdTableAward: " << QString::number(_db)  << QT_ENDL;
4173 
4174     QString table = QString();
4175     QString field = "mode";
4176     QString awardSelected = QString();
4177 
4178     switch (_db) {
4179       case 1: //
4180             table = "awarddxcc";
4181             awardSelected = "DXCC";
4182           break;
4183 
4184       case 2:
4185             table = "awardwaz";
4186             awardSelected = "WAZ";
4187           break;
4188       default:
4189                 //qDebug() << "DataBase::updateModeIdTableAward: FALSE END"   << QT_ENDL;
4190             return false;
4191           //break;
4192     }
4193 
4194     QString bandtxt = QString();
4195 
4196     bool cancel = false;
4197     bool alreadyCancelled = false;
4198     //int errorCode = -1;
4199 
4200 
4201     QString sq = QString();
4202     bool sqlOk2 = false;
4203     bool sqlOk3 = false;
4204     int bandFound = -1;
4205     int id = -1;
4206     int qsos;
4207     int i = 0;
4208     QString aux;
4209     QSqlQuery query, query2;
4210 
4211 
4212     sq = QString("SELECT COUNT (*) FROM %1").arg(table);
4213 
4214     bool sqlOk = query.exec(sq);
4215 
4216     if (sqlOk)
4217     {
4218         query.next();
4219         qsos = (query.value(0)).toInt();
4220         query.finish();
4221     }
4222     else
4223     {
4224         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
4225             //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-2"   << QT_ENDL;
4226         query.finish();
4227         return false;
4228     }
4229 
4230     int step = util->getProgresStepForDialog(qsos);
4231     QString progressmsg = QString(QObject::tr("Updating mode information in %1 status...")).arg(awardSelected);
4232 
4233     QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos);
4234     progress.setMaximum(qsos);
4235     progress.setWindowModality(Qt::WindowModal);
4236 
4237 
4238     sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field);
4239 
4240     sqlOk = query.exec(sq);
4241 
4242           //qDebug() << "DataBase::updateModeIdTableAward (query): " << query.lastQuery()  << QT_ENDL;
4243     if (sqlOk)
4244     {
4245         while (query.next() && (!cancel) )
4246         {
4247             bandtxt = QString();
4248             bandFound = -1;
4249 
4250             if (query.isValid())
4251             {
4252                 i++;
4253 
4254                 if (( (i % step )== 0) )
4255                 { // To update the speed I will only show the progress once each X QSOs
4256                     aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ")  + QString::number(i) + "/" + QString::number(qsos);
4257                     progress.setLabelText(aux);
4258                     progress.setValue(i);
4259                 }
4260 
4261 
4262                 bandFound = (query.value(0)).toInt();
4263                 id = (query.value(1)).toInt();
4264                      //qDebug() << "DataBase::updateModeIdTableAward: bandfound: "  << QString::number(bandFound) << QT_ENDL;
4265                      //qDebug() << "DataBase::updateModeIdTableAward: id: "  << QString::number(id) << QT_ENDL;
4266 
4267                 bandtxt = getSubModeNameFromNumber(bandFound, true);
4268 
4269                      //qDebug() << "DataBase::updateModeIdTableAward: mode found: " << bandtxt << "/" << QString::number(bandFound) << QT_ENDL;
4270 
4271                 sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(bandtxt);
4272                 sqlOk2 = query2.exec(sq);
4273 
4274 
4275                      //qDebug() << "DataBase::updateModeIdTableAward (query2): " << query2.lastQuery()  << QT_ENDL;
4276                 if (sqlOk2)
4277                 {
4278                     if (query2.next())
4279                     {
4280                         if (query2.isValid())
4281                         {
4282                             bandFound = query2.value(0).toInt();
4283                             query2.finish();
4284 
4285                             sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id);
4286                             sqlOk3 = execQuery(Q_FUNC_INFO, sq);
4287 
4288                             if (sqlOk3)
4289                             {
4290                                      //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL;
4291                             }
4292                             else
4293                             {
4294                                 //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery());
4295                                     //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-2"  << QT_ENDL;
4296 
4297                                     //qDebug() << "DataBase::updateModeIdTableAward - QSOs not updated to main log" << QT_ENDL;
4298                             }
4299                         }
4300                         else
4301                         {
4302                                  //qDebug() << "DataBase::updateModeIdTableAward: query2 not valid "   << QT_ENDL;
4303                         }
4304                     }
4305                     else
4306                     {
4307                           //qDebug() << "DataBase::updateModeIdTableAward: query2 not next "   << QT_ENDL;
4308                     }
4309                 }
4310                 else
4311                 {
4312                     queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery());
4313                     query2.finish();
4314                          //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-1"  << QT_ENDL;
4315                 }
4316             }
4317 
4318             if ( progress.wasCanceled() )
4319             {
4320                 if (!alreadyCancelled)
4321                 {
4322                     alreadyCancelled = true;
4323 
4324                     QMessageBox msgBox;
4325                     msgBox.setWindowTitle(QObject::tr("KLog - DB update"));
4326                     aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?");
4327                     msgBox.setText(aux);
4328                     msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
4329                     msgBox.setDefaultButton(QMessageBox::No);
4330                     int ret = msgBox.exec();
4331                     switch (ret) {
4332                       case QMessageBox::Yes:
4333                           // Yes was clicked
4334                             cancel = true;
4335                           break;
4336 
4337                       case QMessageBox::No:
4338                           // No Save was clicked
4339                             cancel = false;
4340                             progress.setCancelButton(nullptr);
4341                           break;
4342                       default:
4343                           // should never be reached
4344                             cancel = false;
4345                           break;
4346                     }
4347                 }
4348             }
4349         }
4350         if (cancel && (!alreadyCancelled))
4351         {
4352                 //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-3"   << QT_ENDL;
4353             query.finish();
4354             return false;
4355         }
4356            //qDebug() << "DataBase::updateModeIdTableAward: END OK"  << QT_ENDL;
4357         query.finish();
4358         return true;
4359     }
4360     else
4361     {
4362         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
4363             //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-4"   << QT_ENDL;
4364         query.finish();
4365         return false;
4366     }
4367         //qDebug() << "DataBase::updateModeIdTableAward: Checkif seen END"   << QT_ENDL;
4368     //query.finish();
4369     //return false;
4370 }
4371 
4372 /*
4373 
4374 bool DataBase::updateModeIdTableLogToNewOnes()
4375 {
4376         //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: "  << QT_ENDL;
4377 
4378     QString bandtxt = QString();
4379 
4380     bool cancel = false;
4381     bool alreadyCancelled = false;
4382     int errorCode = -1;
4383 
4384     QString sq = QString();
4385     bool sqlOk2 = false;
4386     bool sqlOk3 = false;
4387     int bandFound = -1;
4388     int id = -1;
4389     int qsos;
4390     int i = 0;
4391     QString aux;
4392     QSqlQuery query, query2, query3;
4393     bool sqlOk = query.exec("SELECT COUNT (*) FROM log");
4394     if (sqlOk)
4395     {
4396         query.next();
4397         qsos = (query.value(0)).toInt();
4398     }
4399     else
4400     {
4401         return false;
4402     }
4403 
4404     int step = util->getProgresStepForDialog(qsos);
4405 
4406     QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos);
4407     progress.setMaximum(qsos);
4408     progress.setWindowModality(Qt::WindowModal);
4409 
4410     sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY bandid DESC");
4411     if (sqlOk)
4412     {
4413         while (query.next() && (!cancel) )
4414         {
4415             bandtxt = QString();
4416             bandFound = -1;
4417 
4418             if (query.isValid())
4419             {
4420                 i++;
4421 
4422                 if (( (i % step )== 0) )
4423                 { // To update the speed I will only show the progress once each X QSOs
4424                     aux = QObject::tr("Updating mode information...\n QSO: ")  + QString::number(i) + "/" + QString::number(qsos);
4425                     progress.setLabelText(aux);
4426                     progress.setValue(i);
4427                 }
4428 
4429 
4430                 bandFound = (query.value(0)).toInt();
4431                 id = (query.value(1)).toInt();
4432                 bandtxt = getModeNameFromNumber(bandFound, false);
4433 
4434                      //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: mode found: " << bandtxt << QT_ENDL;
4435 
4436                 sq = QString("SELECT id FROM modetemp WHERE name='%1'").arg(bandtxt);
4437                 sqlOk2 = query2.exec(sq);
4438                 if (sqlOk2)
4439                 {
4440                     if (query2.next())
4441                     {
4442                         if (query2.isValid())
4443                         {
4444                             bandFound = query2.value(0).toInt();
4445 
4446     sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(bandFound).arg(id);
4447                             sqlOk3 = query3.exec(sq);
4448                             if (sqlOk3)
4449                             {
4450                                      //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt << QT_ENDL;
4451                             }
4452                             else
4453                             {
4454                                      //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2"  << QT_ENDL;
4455                                     //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - QSOs not updated to main log" << QT_ENDL;
4456                                 errorCode = query3.lastError().nativeErrorCode();
4457                                     //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - query error: " << QString::number(errorCode) << QT_ENDL;
4458                                     //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastQuery: " << query3.lastQuery()  << QT_ENDL;
4459                                     //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-data: " << query3.lastError().databaseText()  << QT_ENDL;
4460                                     //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-driver: " << query3.lastError().driverText()  << QT_ENDL;
4461                                     //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-n: " << QString::number(query3.lastError().nativeErrorCode() ) << QT_ENDL;
4462 
4463                             }
4464 
4465                         }
4466                         else
4467                         {
4468                                  //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not valid "   << QT_ENDL;
4469                         }
4470                     }
4471                     else
4472                     {
4473                           //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not next "   << QT_ENDL;
4474                     }
4475 
4476                 }
4477                 else
4478                 {
4479                          //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1"  << QT_ENDL;
4480                 }
4481 
4482             }
4483 
4484             if ( progress.wasCanceled() )
4485             {
4486                 if (alreadyCancelled)
4487                 {
4488 
4489                 }
4490                 else
4491                 {
4492                     alreadyCancelled = true;
4493 
4494                     QMessageBox msgBox;
4495                     aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?");
4496                     msgBox.setText(aux);
4497                     msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
4498                     msgBox.setDefaultButton(QMessageBox::No);
4499                     int ret = msgBox.exec();
4500                     switch (ret) {
4501                       case QMessageBox::Yes:
4502                           // Yes was clicked
4503                             cancel = true;
4504                           break;
4505 
4506                       case QMessageBox::No:
4507                           // No Save was clicked
4508                             cancel = false;
4509                             progress.setCancelButton(0);
4510                           break;
4511                       default:
4512                           // should never be reached
4513                             cancel = false;
4514                           break;
4515                     }
4516                 }
4517             }
4518 
4519         }
4520         if (cancel && (!alreadyCancelled))
4521         {
4522             return false;
4523         }
4524              //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: FINISHED OK"  << QT_ENDL;
4525         return true;
4526     }
4527     else
4528     {
4529         return false;
4530     }
4531 
4532 }
4533 */
4534 
updateTo007()4535 bool DataBase::updateTo007()
4536 {// Updates the DB to 0.0.7
4537        //qDebug() << "DataBase::updateTo007: latestRead: " << getDBVersion() << QT_ENDL;
4538     bool IAmIn007 = false;
4539     bool IAmIn006 = false;
4540     bool ErrorUpdating = false;
4541     QString stringQuery = QString();
4542 
4543     QSqlQuery query;
4544     latestReaded = getDBVersion().toFloat();
4545     bool sqlOk = false;
4546 
4547     if (latestReaded >= 0.007f)
4548     {
4549              //qDebug() << "DataBase::updateTo007: - I am in 007" << QT_ENDL;
4550         return true;
4551     }
4552     else
4553     {
4554              //qDebug() << "DataBase::updateTo007: - I am not in 007" << QT_ENDL;
4555         IAmIn007 = false;
4556     }
4557 
4558 
4559     while (!IAmIn007 && !ErrorUpdating)
4560     {
4561         while (!IAmIn006 && !ErrorUpdating)
4562         {
4563                 //qDebug() << "DataBase::updateTo007: - And I am not in 006" << QT_ENDL;
4564             IAmIn006 = updateTo006();
4565         }
4566            //qDebug() << "DataBase::updateTo007: - And I am in 006!!!!" << QT_ENDL;
4567         if (ErrorUpdating)
4568         {
4569                //qDebug() << "DataBase::updateTo007: NOK-1" << QT_ENDL;
4570              // emit debugLog(Q_FUNC_INFO, "1", 7);
4571 
4572             return false;
4573         }
4574         sqlOk = updateDBVersion(softVersion, "0.007");
4575 
4576         if (sqlOk)
4577         { // Version updated
4578             IAmIn007 = updateTableLog(6);
4579         }
4580         else
4581         { // Version not updated
4582                //qDebug() << "DataBase::updateTo007: NOK-2" << QT_ENDL;
4583               // emit debugLog(Q_FUNC_INFO, "2", 7);
4584 
4585             return false;
4586         }
4587         //DO ALL THE TASKS TO BE IN 0.007 from 0.006 HERE and set ErrorUpdating if it is not possible.
4588         IAmIn007 = true;
4589     }
4590        //qDebug() << "DataBase::updateTo007: END" << QT_ENDL;
4591     if (!IAmIn007)
4592     {
4593        // emit debugLog(Q_FUNC_INFO, "3", 7);
4594     }
4595     return IAmIn007;
4596 }
4597 
4598 
4599 
updateTo008()4600 bool DataBase::updateTo008()
4601 {// Updates the DB to 0.0.8
4602     //qDebug() << "DataBase::updateTo008: latestRead: " << getDBVersion() << QT_ENDL;
4603     bool IAmIn008 = false;
4604     bool IAmIn007 = false;
4605     bool ErrorUpdating = false;
4606 
4607     latestReaded = getDBVersion().toFloat();
4608     if (latestReaded >= 0.008f)
4609     {
4610           //qDebug() << "DataBase::updateTo008: - I am in 008" << QT_ENDL;
4611         return true;
4612     }
4613     else
4614     {
4615           //qDebug() << "DataBase::updateTo008: - I am not in 008" << QT_ENDL;
4616         IAmIn008 = false;
4617     }
4618 
4619 
4620     while (!IAmIn008 && !ErrorUpdating)
4621     {
4622         while (!IAmIn007 && !ErrorUpdating)
4623         {
4624                //qDebug() << "DataBase::updateTo008: - And I am not in 007" << QT_ENDL;
4625             IAmIn007 = updateTo007();
4626         }
4627            //qDebug() << "DataBase::updateTo008: - I am in 007" << QT_ENDL;
4628         if (ErrorUpdating)
4629         {
4630                //qDebug() << "DataBase::updateTo008: - NOK-1" << QT_ENDL;
4631            // emit debugLog(Q_FUNC_INFO, "1", 7);
4632             return false;
4633         }
4634 
4635         //DO ALL THE TASKS TO BE IN 0.008 from 0.007 HERE and set ErrorUpdating if it is not possible.
4636 
4637         IAmIn008 = updateTheModeTableAndSyncLog();
4638         if (IAmIn008)
4639         {
4640             bool sqlOk = updateDBVersion(softVersion, "0.008");
4641             if (sqlOk)
4642             { // Version updated
4643                    //qDebug() << "DataBase::updateTo008: - OK" << QT_ENDL;
4644             }
4645             else
4646             { // Version not updated
4647                    //qDebug() << "DataBase::updateTo008: - NOK-3" << QT_ENDL;
4648                // emit debugLog(Q_FUNC_INFO, "2", 7);
4649                 return false;
4650             }
4651         }
4652         else
4653         {
4654                //qDebug() << "DataBase::updateTo008: - NOK-2" << QT_ENDL;
4655            // emit debugLog(Q_FUNC_INFO, "3", 7);
4656             return false;
4657         }
4658     }
4659        //qDebug() << "DataBase::updateTo008: - END" << QT_ENDL;
4660     if (!IAmIn008)
4661     {/*emit debugLog(Q_FUNC_INFO, "4", 7);*/
4662     }
4663     return IAmIn008;
4664 }
4665 
4666 
updateTo009()4667 bool DataBase::updateTo009()
4668 {// Updates the DB to 0.0.9 - We add the Satellite tables
4669        //qDebug() << "DataBase::updateTo009: latestRead: " << getDBVersion() << QT_ENDL;
4670     bool IAmIn009 = false;
4671     bool IAmIn008 = false;
4672     bool ErrorUpdating = false;
4673 
4674     //qDebug() << "DataBase::updateTo009: Checking:" << QString::number(latestReaded) << ":" << QString::number(0.009)<< QT_ENDL;
4675     latestReaded = getDBVersion().toFloat();
4676    if (latestReaded >= 0.009f)
4677     //if ((latestReaded = 0.009) || (latestReaded > 0.009))
4678     {
4679             //qDebug() << "DataBase::updateTo009: - I am in 009" << QT_ENDL;
4680         //IAmIn009 = true;
4681         return true;
4682     }
4683     else
4684     {
4685              //qDebug() << "DataBase::updateTo009: - I am not in 009 I am in: " << QString::number(latestReaded)<< QT_ENDL;
4686         IAmIn009 = false;
4687     }
4688         //qDebug() << "DataBase::updateTo009: compared latestRead: " << QString::number(latestReaded) << QT_ENDL;
4689     while (!IAmIn009 && !ErrorUpdating)
4690     {
4691         while (!IAmIn008 && !ErrorUpdating)
4692         {
4693                //qDebug() << "DataBase::updateTo009: - And I am not in 008" << QT_ENDL;
4694             IAmIn008 = updateTo008();
4695         }
4696            //qDebug() << "DataBase::updateTo009: - And I am already at least in 008" << QT_ENDL;
4697         if (ErrorUpdating)
4698         {
4699            // emit debugLog(Q_FUNC_INFO, "1", 7);
4700             return false;
4701         }
4702         bool sqlOk = updateDBVersion(softVersion, "0.009");
4703 
4704         if (sqlOk)
4705         { // Version updated
4706                //qDebug() << "DataBase::updateTo009: - version updated" << QT_ENDL;
4707             //IAmIn009 = updateTableLog(6);
4708         }
4709         else
4710         { // Version not updated
4711                //qDebug() << "DataBase::updateTo009: - version not updated" << QT_ENDL;
4712         }
4713         //DO ALL THE TASKS TO BE IN 0.009 from 0.008 HERE and set ErrorUpdating if it is not possible.
4714         if (recreateSatelliteData())
4715         //if (createTableSatellites(true))
4716         {
4717                //qDebug() << "DataBase::updateTo009: - createTableSatellites OK" << QT_ENDL;
4718             //if (populateTableSatellites(true))
4719 
4720             if (updateTableEntity())
4721             {
4722                   //qDebug() << "DataBase::updateTo009: - updateTableEntity OK" << QT_ENDL;
4723                if (updateTheEntityTableISONames())
4724                {
4725                      //qDebug() << "DataBase::updateTo009: - isonames updated" << QT_ENDL;
4726                   // Now I need to update the logs table
4727 
4728                   if (updateTableLogs())
4729                   {
4730                          //qDebug() << "DataBase::updateTo009: - logs updated and Function finished successfuly!!" << QT_ENDL;
4731                       IAmIn009 = true;
4732                   }
4733                   else
4734                   {
4735                          //qDebug() << "DataBase::updateTo009: - logs NOT updated" << QT_ENDL;
4736                       IAmIn009 = false;
4737                       ErrorUpdating = true;
4738                   }
4739                }
4740                else
4741                {
4742                      //qDebug() << "DataBase::updateTo009: - isonames NOT updated" << QT_ENDL;
4743                   IAmIn009 = false;
4744                   ErrorUpdating = true;
4745                }
4746             }
4747             else
4748             {
4749                ErrorUpdating = true;
4750                IAmIn009 = false;
4751             }
4752         }
4753         else
4754         {
4755                //qDebug() << "DataBase::updateTo009: - createTableSatellites FALSE" << QT_ENDL;
4756             ErrorUpdating = true;
4757             IAmIn009 = false;
4758         }
4759     }
4760 
4761          //qDebug() << "DataBase::updateTo009: - END" << QT_ENDL;
4762     if (!IAmIn009)
4763     {
4764        // emit debugLog(Q_FUNC_INFO, "1", 7);
4765     }
4766     return IAmIn009;
4767 }
4768 
4769 
updateTo010()4770 bool DataBase::updateTo010()
4771 {// Updates the DB to 0.010:
4772     // We add FT8 mode and
4773     // AS Propagation
4774 
4775        //qDebug() << "DataBase::updateTo010: latestRead: " << getDBVersion() << QT_ENDL;
4776     bool IAmIn010 = false;
4777     bool IAmIn009 = false;
4778     bool ErrorUpdating = false;
4779     QString stringQuery = QString();
4780     QSqlQuery query;
4781 
4782     latestReaded = getDBVersion().toFloat();
4783         //qDebug() << "DataBase::updateTo010: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) << QT_ENDL;
4784     if (latestReaded >= 0.010f)
4785     {
4786            //qDebug() << "DataBase::updateTo010: - I am in 010" << QT_ENDL;
4787         IAmIn010 = true;
4788         return true;
4789     }
4790     else
4791     {
4792              //qDebug() << "DataBase::updateTo010: - I am not in 010 I am in: " << QString::number(latestReaded)<< QT_ENDL;
4793 
4794         while (!IAmIn009 && !ErrorUpdating)
4795         {
4796                  //qDebug() << "DataBase::updateTo010: - Check if I am in 009: !" << QT_ENDL;
4797             IAmIn009 = updateTo009();
4798 
4799             if (IAmIn009)
4800             {
4801                      //qDebug() << "DataBase::updateTo010: - updateTo009 returned TRUE - I am in 0.009: " << QString::number(latestReaded) << QT_ENDL;
4802             }
4803             else
4804             {
4805                      //qDebug() << "DataBase::updateTo010: - updateTo009 returned FALSE - I am NOT in 0.009: " << QString::number(latestReaded) << QT_ENDL;
4806                 ErrorUpdating = false;
4807             }
4808         }
4809 
4810         if (ErrorUpdating)
4811         {
4812                  //qDebug() << "DataBase::updateTo010: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
4813            // emit debugLog(Q_FUNC_INFO, "1", 7);
4814             return false;
4815         }
4816     }
4817 
4818 
4819     bool sqlOk = execQuery(Q_FUNC_INFO, "UPDATE band SET lower = '0.1357', upper = '0.1378' WHERE name='2190M'");
4820     if (sqlOk)
4821     {
4822              //qDebug() << "DataBase::updateTo010: - Band update OK" << QT_ENDL;
4823     }
4824     else
4825     {
4826         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
4827              //qDebug() << "DataBase::updateTo010: - Band update NOK" << QT_ENDL;
4828     }
4829 
4830 
4831     execQuery(Q_FUNC_INFO, QString("INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'NO', '0')"));
4832     execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')"));
4833 
4834 
4835     if (updateDBVersion(softVersion, "0.010"))
4836     {
4837              //qDebug() << "DataBase::updateTo010: - We are in 010! " << QT_ENDL;
4838         IAmIn010 = true;
4839     }
4840     else
4841     {
4842              //qDebug() << "DataBase::updateTo010: - Failed to go to 010! " << QT_ENDL;
4843         IAmIn010 = false;
4844        // emit debugLog(Q_FUNC_INFO, "1", 7);
4845     }
4846 
4847          //qDebug() << "DataBase::updateTo010: - END" << QT_ENDL;
4848     return IAmIn010;
4849 }
4850 
updateDBVersion(QString _softV,QString _dbV)4851 bool DataBase::updateDBVersion(QString _softV, QString _dbV)
4852 {
4853     QString dateString = util->getDateSQLiteStringFromDate(QDate::currentDate());
4854 
4855        //qDebug() << "DataBase::updateDBVersion: (date/SoftVersion/dbVersion): " << dateString << "/" << _softV << "/" << _dbV << QT_ENDL;
4856     QString stringQuery = "INSERT INTO softwarecontrol (dateupgrade, softversion, dbversion) VALUES ('" + dateString + "', '" + _softV + "', '" + _dbV + "')";
4857     bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
4858     if (!sqlOK)
4859     {
4860        // emit debugLog(Q_FUNC_INFO, "1", 7);
4861     }
4862     return sqlOK;
4863 }
4864 
4865 
updateTheModeTableAndSyncLog()4866 bool DataBase::updateTheModeTableAndSyncLog()
4867 {
4868          //qDebug() << "DataBase::updateTheModeTableAndSyncLog" << QT_ENDL;
4869     QSqlQuery query;
4870 
4871     createTableMode(false);         // Create modetemp
4872     populateTableMode(false);       // Populate modetemp
4873 
4874     updateModeIdFromSubModeId();    // Updates the log with the new mode IDs in each QSO
4875     //updateModeIdTableAward(1); //DXCC
4876     //updateModeIdTableAward(2); // WAZ
4877 
4878     //QSqlDatabase::database().commit();
4879 
4880     bool sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE mode");
4881     if (sqlOK)
4882     {
4883         //QSqlDatabase::database().commit();
4884              //qDebug() << "DataBase::updateTheModeTableAndSyncLog - OK - mode was dropped" << QT_ENDL;
4885 
4886         sqlOK = execQuery(Q_FUNC_INFO, "ALTER TABLE modetemp RENAME TO mode");
4887         if (!sqlOK)
4888         {
4889            // emit debugLog(Q_FUNC_INFO, "1", 7);
4890         }
4891         return sqlOK;
4892     }
4893     else
4894     {
4895         //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
4896             //qDebug() << "DataBase::updateTheModeTableAndSyncLog - ERROR - modetemp not dropped" << QT_ENDL;
4897        // emit debugLog(Q_FUNC_INFO, "2", 7);
4898         return false;
4899     }
4900          //qDebug() << "DataBase::updateTheModeTableAndSyncLog END" << QT_ENDL;
4901     //return true;
4902 }
4903 
recreateTableBand()4904 bool DataBase::recreateTableBand()
4905 {
4906     //qDebug() << "DataBase::recreateTableBand" << QT_ENDL;
4907     QSqlQuery query;
4908 
4909     createTableBand(false);         // Create modetemp
4910     populateTableBand(false);       // Populate modetemp
4911     syncLogQSOsOnBandTableChange();
4912 
4913     if (execQuery(Q_FUNC_INFO, "DROP TABLE band"))
4914     {
4915        // emit debugLog(Q_FUNC_INFO, "1", 7);
4916         return execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band");
4917     }
4918     else
4919     {
4920         //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
4921             //qDebug() << "DataBase::recreateTableBand - ERROR - bandtemp not dropped" << QT_ENDL;
4922        // emit debugLog(Q_FUNC_INFO, "2", 7);
4923         return false;
4924     }
4925         //qDebug() << "DataBase::recreateTableBand END" << QT_ENDL;
4926 }
4927 
fillCountryCodes()4928 QMultiMap<QString, int> DataBase::fillCountryCodes()
4929 {
4930     //qDebug() << Q_FUNC_INFO;
4931     QMultiMap<QString, int> countryCodes;
4932     countryCodes.clear ();
4933     countryCodes.insert ("mt", 246);
4934     countryCodes.insert ("un", 247);
4935     countryCodes.insert ("mc", 260);
4936     countryCodes.insert ("mu", 4);
4937     countryCodes.insert ("mu", 165);
4938     countryCodes.insert ("mu", 207);
4939     countryCodes.insert ("gq", 49);
4940     countryCodes.insert ("gq", 195);
4941     countryCodes.insert ("fj", 176);
4942     countryCodes.insert ("fj", 489);
4943     countryCodes.insert ("fj", 460);
4944     countryCodes.insert ("sz", 468);
4945     countryCodes.insert ("tn", 474);
4946     countryCodes.insert ("vn", 293);
4947     countryCodes.insert ("gn", 107);
4948     countryCodes.insert ("bv", 24);
4949     countryCodes.insert ("no", 199);
4950     countryCodes.insert ("az", 18);
4951     countryCodes.insert ("ge", 75);
4952     countryCodes.insert ("me", 514);
4953     countryCodes.insert ("lk", 315);
4954     countryCodes.insert ("ch", 177);  // ITU HQ
4955     countryCodes.insert ("us", 289);  // UN HQ
4956     countryCodes.insert ("tl", 511);  // Timor Leste
4957     countryCodes.insert ("il", 336);  // Israel
4958     countryCodes.insert ("ly", 436);  // Libya
4959     countryCodes.insert ("cy", 215);  // Cyprus
4960     countryCodes.insert ("tz", 470);  // Tanzania
4961     countryCodes.insert ("ng", 450);  // Nigeria
4962     countryCodes.insert ("mg", 438);  // Madagascar
4963     countryCodes.insert ("mr", 444);  // Mauritania
4964     countryCodes.insert ("ne", 187);  // Niger
4965     countryCodes.insert ("tg", 484);  // Togo
4966     countryCodes.insert ("ws", 190);  // Samoa
4967     countryCodes.insert ("ug", 286);  // Uganda
4968     countryCodes.insert ("ke", 430);  // Kenya
4969     countryCodes.insert ("sn", 456);  // Senegal
4970     countryCodes.insert ("jm", 82);   // Jamaica
4971     countryCodes.insert ("es", 281);  // Spain
4972     countryCodes.insert ("ls", 432);  // Lesotho
4973     countryCodes.insert ("mw", 440);  // Malawi
4974     countryCodes.insert ("dz", 400);  // Algeria
4975     countryCodes.insert ("ye", 492);  // Yemen
4976     countryCodes.insert ("bb", 62);   // Barbados
4977     countryCodes.insert ("mv", 159);  // Maldives
4978     countryCodes.insert ("gy", 129);  // Guyana
4979     countryCodes.insert ("hr", 497);  // Croatia
4980     countryCodes.insert ("gh", 424);  // Ghana
4981     countryCodes.insert ("mt", 257);  // Malta
4982     countryCodes.insert ("zm", 482);  // Zambia
4983     countryCodes.insert ("kw", 348);  // Kuwait
4984     countryCodes.insert ("sl", 458);  //Sierra Leone
4985     countryCodes.insert ("my", 299);  // West Malaysia
4986     countryCodes.insert ("my", 46);   // East Malaysia
4987     countryCodes.insert ("np", 369);  // Nepal
4988     countryCodes.insert ("cd", 414);  // Dem Rep Congo
4989     countryCodes.insert ("bi", 404);  // Burundi
4990     countryCodes.insert ("sg", 381);  // Singapore
4991     countryCodes.insert ("rw", 454);  // Rwanda
4992     countryCodes.insert ("tt", 90);   // Trinidad & Tobago
4993     countryCodes.insert ("bw", 402);
4994     countryCodes.insert ("to", 160);
4995     countryCodes.insert ("om", 370);
4996     countryCodes.insert ("bt", 306);  // Bhutan
4997     countryCodes.insert ("ae", 391);  // Un Arab Emirates
4998     countryCodes.insert ("qa", 376);  // Qatar
4999     countryCodes.insert ("bh", 304);  // Bahrain
5000     countryCodes.insert ("pk", 372);  // Pakistan
5001     countryCodes.insert ("tw", 386);  // Taiwan
5002     countryCodes.insert ("tw", 505);  // Pratas Is
5003     countryCodes.insert ("cn", 318);  // China
5004     countryCodes.insert ("nr", 157);  //  Nauru
5005     countryCodes.insert ("ad", 203);  // Andorra
5006     countryCodes.insert ("gm", 422);  // Gambia
5007     countryCodes.insert ("bs", 60);
5008     countryCodes.insert ("mz", 181);  // Mozambique
5009     countryCodes.insert ("cl", 112);  // Chile
5010     countryCodes.insert ("cl", 217);  // San Felix
5011     countryCodes.insert ("cl", 47);   // Easter Is
5012     countryCodes.insert ("cl", 125);  //  Juan Fernandez is
5013     countryCodes.insert ("cu", 70);   // Cuba
5014     countryCodes.insert ("ma", 446);  // Morocco
5015     countryCodes.insert ("bo", 104);  // Bolivia
5016     countryCodes.insert ("pt", 272);  // Portugal
5017     countryCodes.insert ("pt", 256);  // Madeira
5018     countryCodes.insert ("pt", 149);  // Azores
5019     countryCodes.insert ("uy", 144);  // Uruguay
5020     countryCodes.insert ("ca", 211);  // Sable Is
5021     countryCodes.insert ("ca", 252);  // St Paul is
5022     countryCodes.insert ("ao", 401);  // Angola
5023     countryCodes.insert ("cv", 409);  // Cape Verde
5024     countryCodes.insert ("km", 411);  // Comoros
5025     countryCodes.insert ("de", 203);  // Fed Rep Germany
5026     countryCodes.insert ("ph", 375);  //Philippines
5027     countryCodes.insert ("er", 51);   // Eritrea
5028     countryCodes.insert ("ps", 510);  // Palestine
5029     countryCodes.insert ("ck", 191);  // North Cook
5030     countryCodes.insert ("ck", 234);  // South Cook
5031     countryCodes.insert ("nu", 188);  // Niue
5032     countryCodes.insert ("ba", 501);  // Bosnia
5033     countryCodes.insert ("balear", 21); // Balearic is
5034     countryCodes.insert ("canary", 29); // Canary Is
5035     countryCodes.insert ("ceuta", 32);  // Ceuta & Melilla //TODO: Fix the flag
5036     countryCodes.insert ("ie", 245); // Ireland
5037     countryCodes.insert ("am", 14);
5038     countryCodes.insert ("lr", 434);
5039     countryCodes.insert ("ir",330);  // Iran
5040     countryCodes.insert ("mv", 179); // Moldova
5041     countryCodes.insert ("ee", 52);  //  Estonia
5042     countryCodes.insert ("et", 53);  // Ethiopia
5043     countryCodes.insert ("by", 27);  // Belarus
5044     countryCodes.insert ("kg", 135); // Kyrgyzstan
5045     countryCodes.insert ("tm", 280); // Turkmenistan
5046     countryCodes.insert ("tj", 262); // Tajikistan
5047     countryCodes.insert ("fr", 227); // France
5048     countryCodes.insert ("fr", 79);  // Guadeloupe
5049     countryCodes.insert ("yt", 169); // Mayotte
5050     countryCodes.insert ("fr", 516); // St Barthelemy
5051     countryCodes.insert ("fr", 36);  // Clipperton Is
5052     countryCodes.insert ("nc", 162);  // New Caledonia
5053     countryCodes.insert ("nc", 512);  // Chesterfield Is
5054     countryCodes.insert ("mq", 84);   // Martinique
5055     countryCodes.insert ("pf", 175);  // French Polynesia
5056     countryCodes.insert ("pf", 508);  // Austral Is
5057     countryCodes.insert ("pm", 277);  //  St Pierre & Miquelon
5058     countryCodes.insert ("re", 453);  //Reunion Is
5059     countryCodes.insert ("fr", 213); // St Marteen
5060     countryCodes.insert ("fr", 99);  // Glorioso is
5061     countryCodes.insert ("fr", 124); // Juan de nova, Europa
5062     countryCodes.insert ("fr", 276);  //  Tromelin - TODO: Add the wikipedia flag
5063     countryCodes.insert ("fr", 41);  // Crozet
5064     countryCodes.insert ("fr", 131);  // Kerguelen
5065     //TODO: Add the wikipedia flag http://es.wikipedia.org/wiki/Tierras_Australes_y_Ant%C3%A1rticas_Francesas
5066     countryCodes.insert ("fr", 10);  //Amsterdam & St Paul is
5067     //TODO: Add the wikipedia flag
5068     countryCodes.insert ("wf", 298);  // Wallis & Futuna is
5069     countryCodes.insert ("gf", 63);  // French Guiana
5070     //TODO: Add the wikipedia flag
5071     countryCodes.insert ("england", 223);  // England
5072     countryCodes.insert ("gb", 114); //Isle of Man
5073     //TODO: Add the wikipedia flag
5074     countryCodes.insert ("northernireland", 265); // Northern Ireland
5075     countryCodes.insert ("gb", 122);  // Jersey
5076     countryCodes.insert ("scotland", 279);  //  Scotland
5077     countryCodes.insert ("scotland", 1279);  //  Shetland is (Scotland)
5078     countryCodes.insert ("gb", 106);  // Guernsey
5079     //TODO: Add the wikipedia flag
5080     countryCodes.insert ("wales", 294);  // Wales
5081     countryCodes.insert ("sb", 185); // Solomon
5082     countryCodes.insert ("sb", 507);  // Temotu Province
5083     countryCodes.insert ("hu", 239);  // Hungary
5084     countryCodes.insert ("ch", 287);  // Switzerland
5085     countryCodes.insert ("li", 251); // Liechtenstein
5086     countryCodes.insert ("ec", 120);  // Ecuador
5087     countryCodes.insert ("ec", 71);  // Galapagos Is
5088     countryCodes.insert ("ht", 78);  // Haiti
5089     countryCodes.insert ("do", 72);  // Dominican Rep
5090     countryCodes.insert ("co", 116);  // Colombia
5091     countryCodes.insert ("co", 216);  // San Andres & Providencia
5092     countryCodes.insert ("co", 161);  // Malpelo
5093     countryCodes.insert ("kr", 137);  // Rep Korea
5094     countryCodes.insert ("pa", 88);  // Panama
5095     countryCodes.insert ("hn", 80); // Honduras
5096     countryCodes.insert ("th", 387);  // Thailand
5097     countryCodes.insert ("va", 295);
5098     countryCodes.insert ("sa", 378); // Saudi Arabia
5099     countryCodes.insert ("it", 248);  // Italy
5100     countryCodes.insert ("it", 1248);  // African Italy
5101     countryCodes.insert ("it", 2248); // Sicily
5102     countryCodes.insert ("it", 225);  // Sardinia
5103     countryCodes.insert ("dj", 382);  // Djibouti
5104     countryCodes.insert ("gd", 77);  // Grenada
5105     countryCodes.insert ("gw", 109);  // Guinea-Bissau
5106     countryCodes.insert ("lc", 97);  // St Lucia
5107     countryCodes.insert ("dm", 95);  // Dominica
5108     countryCodes.insert ("vc", 98);  // St Vicent
5109     countryCodes.insert ("jp", 339);  // Japan
5110     countryCodes.insert ("jp", 177);  // Minami Torishima
5111     countryCodes.insert ("jp", 192);  // Ogasawara
5112     countryCodes.insert ("mn", 363);  // Mongolia
5113     countryCodes.insert ("sj", 259);  // Svalbard
5114     countryCodes.insert ("sj", 1259);  // Svalbard
5115     countryCodes.insert ("sj", 118);  // Jan Mayen
5116     countryCodes.insert ("jo", 342);
5117     countryCodes.insert ("us", 291);
5118     countryCodes.insert ("us", 105);
5119     countryCodes.insert ("mp", 166);
5120     countryCodes.insert ("us", 20);
5121     countryCodes.insert ("gu", 103);
5122     countryCodes.insert ("us", 123);
5123     countryCodes.insert ("us", 174);
5124     countryCodes.insert ("us", 197);
5125     countryCodes.insert ("us", 134);
5126     countryCodes.insert ("us", 110);  // Hawaii
5127     //TODO: Add the wikipedia flag
5128     countryCodes.insert ("us", 138);  // Kure is
5129     countryCodes.insert ("as", 9);  // American Samoa
5130     countryCodes.insert ("as", 515);  // Swains is
5131     countryCodes.insert ("us", 297);  // Wake is
5132     countryCodes.insert ("us", 6); // Alaska
5133     countryCodes.insert ("us", 182);  // Navassa Is
5134     countryCodes.insert ("vi", 285);  // Us Virgin is
5135     countryCodes.insert ("pr", 202);  // Puerto Rico
5136     countryCodes.insert ("us", 43);  // Desecheo Is
5137     countryCodes.insert ("no", 266);  // Norway
5138     countryCodes.insert ("ar", 100);  // Argentina
5139     countryCodes.insert ("lu", 254);  // Luxembourg
5140     countryCodes.insert ("lt", 146);  // Lithuania
5141     countryCodes.insert ("bg", 212);  // Bulgaria
5142     countryCodes.insert ("pe", 136);  // Peru
5143     countryCodes.insert ("lb", 354);  // Lebanon
5144     countryCodes.insert ("at", 206);  // Austria & Viena Intl HQ
5145     countryCodes.insert ("fi", 224);  // Findland
5146     countryCodes.insert ("fi", 5); // Aland is
5147     countryCodes.insert ("fi", 167);  // Market Reef
5148     countryCodes.insert ("cz", 503);  // Czech Rep
5149     countryCodes.insert ("sk", 504);  // Slovak Rep
5150     countryCodes.insert ("be", 209);  // Belgium
5151     countryCodes.insert ("gl", 237);  // Greenland
5152     countryCodes.insert ("dk", 222); // Faroe is
5153     //TODO: Add the wikipedia flag
5154     countryCodes.insert ("dk", 221);  // Denmark
5155     countryCodes.insert ("pg", 163);  // Papua New Guinea
5156     countryCodes.insert ("aw", 91);  // Aruba
5157     countryCodes.insert ("kp", 344);  //Dpr Korea
5158     countryCodes.insert ("nl", 263); // Netherlands
5159     countryCodes.insert ("cw", 517);  // Curacao
5160     //TODO: Add the wikipedia flag
5161     countryCodes.insert ("bq", 520);  // Bonaire
5162     //TODO: Add the wikipedia flag
5163     countryCodes.insert ("nl", 519);  // Saba & St Eustatius
5164     //TODO: Add the wikipedia flag
5165     countryCodes.insert ("shm", 518);  // Sint Marteen
5166     //TODO: Add the wikipedia flag
5167     countryCodes.insert ("br", 108);  // Brazil
5168     countryCodes.insert ("br", 56);  // Fernando de Noronha
5169     countryCodes.insert ("br", 253);  //  St Peter & St Paul
5170     countryCodes.insert ("br", 273);  // Trindade & Martim Vaz
5171     countryCodes.insert ("sr", 140);  // Suriname
5172     countryCodes.insert ("ru", 61);  // Franz Josef Land
5173     countryCodes.insert ("eh", 302); // Western Sahara
5174     //TODO: Add the wikipedia flag
5175     countryCodes.insert ("bd", 305);  // Bangladesh
5176     countryCodes.insert ("si", 499);  // Slovenia
5177     countryCodes.insert ("sc", 379);  // Seychelles
5178     countryCodes.insert ("st", 219);  // Sao Tome & Principe
5179     countryCodes.insert ("se", 284);  // Sweden
5180     countryCodes.insert ("pl", 269);  // Poland
5181     countryCodes.insert ("sd", 466);  // Sudan
5182     countryCodes.insert ("eg", 478);  // Egypt
5183     countryCodes.insert ("gr", 236);  // Greece
5184     countryCodes.insert ("gr", 180);  // Mount Athos
5185     countryCodes.insert ("gr", 45);  // Dodecanese
5186     countryCodes.insert ("gr", 40);  // Crete
5187     countryCodes.insert ("tv", 282); // Tuvalu
5188     countryCodes.insert ("ki", 301); // Western Kiribati
5189     countryCodes.insert ("ki", 31);  // Central Kiribati
5190     countryCodes.insert ("ki", 48); // Eastern Kiribati
5191     countryCodes.insert ("ki", 490); // Banaba is
5192     countryCodes.insert ("so", 232);  // Somalia
5193     countryCodes.insert ("sm", 278); // San Marino
5194     countryCodes.insert ("pw", 22);  // Palau
5195     countryCodes.insert ("tr", 390);  // Turkey
5196     countryCodes.insert ("tr", 1390);  // European Turkey
5197     countryCodes.insert ("is", 242); // Iceland
5198     countryCodes.insert ("gt", 76); // Guatemala
5199     //TODO: Add the wikipedia flag
5200     countryCodes.insert ("cr", 308);  // Costa Rica
5201     countryCodes.insert ("cr", 37); // Coco is
5202     countryCodes.insert ("cm", 406);  // Cameroon
5203     countryCodes.insert ("fr", 214);  // Corsica
5204     // TODO: Add the wikipedia flag
5205     countryCodes.insert ("cf", 408);  // Central African Rep
5206     countryCodes.insert ("cg", 412);  // Rep of Congo
5207     countryCodes.insert ("ga", 420);  // Gabon
5208     countryCodes.insert ("td", 410);  // Chad
5209     countryCodes.insert ("ci", 428);  // Cote d'Ivoire
5210     countryCodes.insert ("bj", 416); // Benin
5211     countryCodes.insert ("ml", 442);  // Mali
5212     countryCodes.insert ("ru", 54); // European Russia
5213     countryCodes.insert ("ru", 15);  // Asiatic Russia
5214     countryCodes.insert ("ru", 126);  // Kaliningrad
5215     countryCodes.insert ("uz", 292);  // Uzbekistan
5216     countryCodes.insert ("kz", 130);  // Kazakhstan
5217     countryCodes.insert ("ua", 288);  // Ukraine
5218     countryCodes.insert ("ag", 94);  // Antigua & Barbuda
5219     countryCodes.insert ("bz", 66);  // Belize
5220     countryCodes.insert ("kn", 249);  // St Kitts & Nevis
5221     countryCodes.insert ("na", 464);  // Namibia
5222     countryCodes.insert ("fm", 173);  // Micronesia
5223     countryCodes.insert ("fm", 168);  // Marshall Is
5224     countryCodes.insert ("bn", 345); // Brunei Darusalam
5225     countryCodes.insert ("ca", 1);  // Canada
5226     countryCodes.insert ("au", 150);  // Australia
5227     countryCodes.insert ("hm", 111);  // Heard Is
5228     countryCodes.insert ("au", 153);  // Macquarie is
5229     countryCodes.insert ("cc", 38);  //  Cocos / Keeling is
5230     countryCodes.insert ("au", 147); //  Lord Howe is
5231     countryCodes.insert ("au", 171); // Mellish Reed
5232     countryCodes.insert ("nf", 189); // Norkfolk is
5233     countryCodes.insert ("au", 303);  // Willis Is
5234     countryCodes.insert ("cx", 35);  // Christmas is
5235     countryCodes.insert ("ai", 12); //  Anguilla
5236     countryCodes.insert ("ms", 96);  // Montserrat
5237     countryCodes.insert ("vg", 65);  // British is
5238     countryCodes.insert ("tc", 89);  // Turks & Caicos is
5239     countryCodes.insert ("pn", 172);  // Pitcairn
5240     countryCodes.insert ("gb", 513);  // Ducie is
5241     countryCodes.insert ("fk", 141);  // Falkland is
5242     countryCodes.insert ("gs", 235);  // South Georgia is
5243     countryCodes.insert ("southbritish", 241);  // South Shetland is
5244     countryCodes.insert ("un", 238);  // South Orkney is
5245     countryCodes.insert ("gs", 240);  // South Sandwich Is
5246     countryCodes.insert ("bm", 64);  // Bermuda
5247     countryCodes.insert ("io", 33);  // Chagos is
5248     countryCodes.insert ("hk", 321);  // Hong Kong
5249     countryCodes.insert ("in", 324);  // India
5250     countryCodes.insert ("in", 11);  // Andaman & Nicobar
5251     countryCodes.insert ("in", 142);  // Lakshadweep Is
5252     countryCodes.insert ("mx", 50);  // Mexico
5253     countryCodes.insert ("mx", 204);  // Revilagigedo
5254     countryCodes.insert ("bf", 480);  // Burkina Faso
5255     countryCodes.insert ("kh", 312); //  Cambodia
5256     countryCodes.insert ("la", 143);  // Laos
5257     countryCodes.insert ("mo", 152); // Macao
5258     countryCodes.insert ("mm", 309);  // Myanmar
5259     countryCodes.insert ("af", 3);  // Afganistan
5260     countryCodes.insert ("id", 327);  // Indonesia
5261     countryCodes.insert ("iq", 333);  // Iraq
5262     countryCodes.insert ("vu", 158);  // Vanuatu
5263     countryCodes.insert ("sy", 384); // Syria
5264     countryCodes.insert ("lv", 145);  // Latvia
5265     countryCodes.insert ("ni", 86);  //  Nicaragua
5266     countryCodes.insert ("ro", 275); // Romania
5267     countryCodes.insert ("sv", 74);  // El Salvador
5268     countryCodes.insert ("rs", 296); // Serbia
5269     countryCodes.insert ("ve", 148);  // Venezuela
5270     countryCodes.insert ("ve", 17); // Aves Is
5271     countryCodes.insert ("zw", 452);  // Zimbabwe
5272     countryCodes.insert ("mk", 502);  // Macedonia
5273     countryCodes.insert ("ss", 521);  //Rep South Sudan
5274     countryCodes.insert ("al", 7);  // Albania
5275     countryCodes.insert ("gi", 233);  // Gibraltar
5276     countryCodes.insert ("gb", 283);  // UK Base Aereas Cyprus
5277     countryCodes.insert ("sh", 250); // St Helena
5278     countryCodes.insert ("sh", 205);  // Ascension is
5279     countryCodes.insert ("sh", 274);  // Tristan da Cunha & Gough is
5280     countryCodes.insert ("ky", 69); // Cayman Is
5281     countryCodes.insert ("tk", 270);  // Tokelau Is
5282     countryCodes.insert ("marquesas", 509);  // Marquesas Is
5283     countryCodes.insert ("nz", 170);  // New Zeland
5284     countryCodes.insert ("nz", 34);  // Chatham Is
5285     countryCodes.insert ("nz", 133);  // Kermadec is
5286     countryCodes.insert ("nz", 16);  // Auckland & Campbell is
5287     countryCodes.insert ("py", 132);  // Paraguay
5288     countryCodes.insert ("za", 462);  // South Africa
5289     countryCodes.insert ("za", 201);  // Pr Edward & Marion Is
5290     countryCodes.insert ("xk", 522);  // Kosovo
5291     // Countries without flag or controversial - Data is added just to keep the DB filled-up
5292     countryCodes.insert ("un", 506);  // Scarboroug Reef
5293     countryCodes.insert ("un", 13); //  Antartica
5294 
5295     return countryCodes;
5296 }
5297 
updateTheEntityTableISONames()5298 bool DataBase::updateTheEntityTableISONames()
5299 {
5300     //qDebug() << "DataBase::updateTheEntityTableISONames" << QT_ENDL;
5301     QSqlQuery query;
5302     QString sq;
5303 
5304     //First of all we will check if the entity table does contain data. We can't update something non existent!
5305     if (!hasTheTableData("entity"))
5306     {
5307             //qDebug() << "DataBase::updateTheEntityTableISONames: Entity has NO data" << QT_ENDL;
5308        // emit debugLog(Q_FUNC_INFO, "1", 7);
5309         return false;
5310     }
5311     QMultiMap<QString, int> countryCodes;
5312     countryCodes.clear ();
5313 
5314     countryCodes = fillCountryCodes ();
5315 
5316     foreach (const QString &str, countryCodes.uniqueKeys()) {
5317         foreach (int i, countryCodes.values(str))
5318         {
5319             if (!updateEntity (str, i))
5320                 return false;
5321 
5322             //qDebug() << str << ':' << i;
5323         }
5324     }
5325 
5326     //qDebug() << "DataBase::updateTheEntityTableISONames-END" << QT_ENDL;
5327     return true;
5328 }
5329 
updateEntity(const QString & _codeString,const int _code)5330 bool DataBase::updateEntity (const QString &_codeString, const int _code)
5331 {
5332     //qDebug() << Q_FUNC_INFO << "ISOCode: " << _codeString << " - int: " << QString::number(_code);
5333     QString sq = QString ("UPDATE entity SET isoname='%1' WHERE dxcc='%2'").arg(_codeString).arg(_code);
5334     //TODO Capture and manage the error
5335     return execQuery(Q_FUNC_INFO, sq);
5336 }
5337 
isTheTableExisting(const QString & _tableName)5338 bool DataBase::isTheTableExisting(const QString &_tableName)
5339 {
5340     QSqlQuery query;
5341 
5342     QString sq = QString("SELECT name FROM sqlite_master WHERE name='%1'").arg(_tableName);
5343     bool sqlOK = query.exec(sq);
5344     if (sqlOK)
5345     {
5346         if (query.next())
5347         {
5348             if (query.isValid())
5349             {
5350                 int _n = (query.value(0)).toInt();
5351                 query.finish();
5352                 if (_n > 0)
5353                 {
5354                         //qDebug() << "DataBase::isTheTableExisting - Table Exists"  << QT_ENDL;
5355                     return true;
5356                 }
5357                 else
5358                 {
5359                         //qDebug() << "DataBase::isTheTableExisting - Table does not Exist"  << QT_ENDL;
5360                    // emit debugLog(Q_FUNC_INFO, "1", 7);
5361                     return false;
5362                 }
5363             }
5364         }
5365     }
5366     else
5367     {
5368        // emit debugLog(Q_FUNC_INFO, "2", 7);
5369         return false;
5370     }
5371    // emit debugLog(Q_FUNC_INFO, "3", 7);
5372     return false;
5373 }
5374 
5375 
5376 
hasTheTableData(const QString & _tableName)5377 bool DataBase::hasTheTableData(const QString &_tableName)
5378 {
5379        //qDebug() << "DataBase::hasTheTableData" << _tableName << QT_ENDL;
5380     QSqlQuery query;
5381 
5382 
5383     QString stringQuery = QString("SELECT count(id) FROM %1").arg(_tableName);
5384     bool sqlOK = query.exec(stringQuery);
5385 
5386     if (sqlOK)
5387     {
5388         query.next();
5389         if (query.isValid())
5390         {
5391             //qDebug() << "DataBase::hasTheTableData - valid"  << QT_ENDL;
5392             int _num = (query.value(0)).toInt();
5393             query.finish();
5394             if (_num > 0)
5395             {
5396                 //qDebug() << "DataBase::hasTheTableData - DB Exists"  << QT_ENDL;
5397                 return true;
5398             }
5399             else
5400             {
5401                //qDebug() << "DataBase::hasTheTableData - DB does not Exist"  << QT_ENDL;
5402                // emit debugLog(Q_FUNC_INFO, "1", 7);
5403                 return false;
5404             }
5405         }
5406         else
5407         {
5408                 //qDebug() << "DataBase::hasTheTableData - not valid"  << QT_ENDL;
5409             query.finish();
5410            // emit debugLog(Q_FUNC_INFO, "2", 7);
5411             return false;
5412         }
5413     }
5414     else
5415     {
5416             //qDebug() << "DataBase::hasTheTableData: LastQuery: " << query.lastQuery()  << QT_ENDL;
5417             //qDebug() << "DataBase::hasTheTableData: LastError-data: " << query.lastError().databaseText()  << QT_ENDL;
5418             //qDebug() << "DataBase::hasTheTableData: LastError-driver: " << query.lastError().driverText()  << QT_ENDL;
5419             //qDebug() << "DataBase::hasTheTableData LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) << QT_ENDL;
5420             //qDebug() << "DataBase::updateTheEntityTableISONames" << QT_ENDL;
5421         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
5422         query.finish();
5423        // emit debugLog(Q_FUNC_INFO, "3", 7);
5424         return false;
5425     }
5426 
5427     //qDebug() << "DataBase::isTheDBCreated: END FALSE" << QT_ENDL;
5428     //query.finish();
5429     //return false;
5430 }
5431 
updateTo011()5432 bool DataBase::updateTo011()
5433 {// Updates the DB to 0.011:
5434     // We add FT8 mode and
5435     // AS Propagation
5436 
5437 
5438        //qDebug() << "DataBase::updateTo011: latestRead: " << getDBVersion() << QT_ENDL;
5439     bool IAmIn011 = false;
5440     bool IAmIn010 = false;
5441 
5442     QString stringQuery = QString();
5443     //QSqlQuery query;
5444 
5445     //bool sqlOk = false;
5446     latestReaded = getDBVersion().toFloat();
5447        //qDebug() << "DataBase::updateTo011: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) << QT_ENDL;
5448     if (latestReaded >= 0.011f)
5449     {
5450            //qDebug() << "DataBase::updateTo011: - I am in 011" << QT_ENDL;
5451         IAmIn011 = true;
5452         return true;
5453     }
5454     else
5455     {
5456            //qDebug() << "DataBase::updateTo011: - I am not in 0.012 I am in: " << QString::number(latestReaded)<< QT_ENDL;
5457         bool ErrorUpdating = false;
5458         while (!IAmIn010 && !ErrorUpdating)
5459         {
5460                //qDebug() << "DataBase::updateTo011: - Check if I am in 010: !" << QT_ENDL;
5461             IAmIn010 = updateTo010();
5462 
5463             if (IAmIn010)
5464             {
5465                      //qDebug() << "DataBase::updateTo011: - updateTo010 returned TRUE - I am in 0.010: " << QString::number(latestReaded) << QT_ENDL;
5466             }
5467             else
5468             {
5469                    //qDebug() << "DataBase::updateTo011: - updateTo009 returned FALSE - I am NOT in 0.010: " << QString::number(latestReaded) << QT_ENDL;
5470                 ErrorUpdating = false;
5471             }
5472         }
5473 
5474         if (ErrorUpdating)
5475         {
5476                  //qDebug() << "DataBase::updateTo011: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
5477            // emit debugLog(Q_FUNC_INFO, "1", 7);
5478             return false;
5479         }
5480     }
5481 
5482     if (!recreateSatelliteData())
5483     {
5484            //qDebug() << "DataBase::updateTo011: - Sats update NOK " << QT_ENDL;
5485        // emit debugLog(Q_FUNC_INFO, "2", 7);
5486         return false;
5487     }
5488 
5489     if (!recreateTableDXCC())
5490     {
5491            //qDebug() << "DataBase::updateTo011: - recreateTableDXCC NOK " << QT_ENDL;
5492        // emit debugLog(Q_FUNC_INFO, "3", 7);
5493         return false;
5494     }
5495 
5496     if (!recreateTableWAZ())
5497     {
5498            //qDebug() << "DataBase::updateTo011: - recreateTableWAZ NOK " << QT_ENDL;
5499        // emit debugLog(Q_FUNC_INFO, "4", 7);
5500         return false;
5501     }
5502 
5503     if(!execQuery(Q_FUNC_INFO, "INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'NO', '0')"))
5504     {
5505            //qDebug() << "DataBase::updateTo011: - MSK NOK " << QT_ENDL;
5506        // emit debugLog(Q_FUNC_INFO, "5", 7);
5507         return false;
5508     }
5509 
5510 
5511     if (!recreateTableLog())
5512     {
5513            //qDebug() << "DataBase::updateTo011: - Failed to recreate Table Log " << QT_ENDL;
5514        // emit debugLog(Q_FUNC_INFO, "6", 7);
5515         return false;
5516     }
5517 
5518     if (updateDBVersion(softVersion, "0.011"))
5519     {
5520            //qDebug() << "DataBase::updateTo011: - We are in 011! " << QT_ENDL;
5521         IAmIn011 = true;
5522     }
5523     else
5524     {
5525            //qDebug() << "DataBase::updateTo011: - Failed to go to 011! " << QT_ENDL;
5526         IAmIn011 = false;
5527     }
5528 
5529 
5530     if (!updateAwardDXCCTable())
5531     {
5532          //qDebug() << "DataBase::updateTo011: - updateAwardDXCCTable NOK " << QT_ENDL;
5533       IAmIn011 = false;
5534      // emit debugLog(Q_FUNC_INFO, "7", 7);
5535       return false;
5536     }
5537     if (!updateAwardWAZTable())
5538     {
5539            //qDebug() << "DataBase::updateTo011: - updateAwardWAZTable NOK " << QT_ENDL;
5540         IAmIn011 = false;
5541     }
5542        //qDebug() << "DataBase::updateTo011: - END" << QT_ENDL;
5543     if (!IAmIn011)
5544     {// emit debugLog(Q_FUNC_INFO, "8", 7);
5545     }
5546     return IAmIn011;
5547 }
5548 
5549 
updateTo012()5550 bool DataBase::updateTo012()
5551 {
5552     // Updates the DB to 0.012:
5553     // Change the table qsl_via to qsl_via_enumeration
5554     // Solve the supportedContest table missing bug in some deployments
5555 
5556 
5557            //qDebug() << "DataBase::updateTo012: latestRead: " << getDBVersion() << QT_ENDL;
5558         bool IAmIn011 = false;
5559         bool ErrorUpdating = false;
5560         latestReaded = getDBVersion().toFloat();
5561            //qDebug() << "DataBase::updateTo012: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
5562         if (latestReaded >= 0.012f)
5563         {
5564                //qDebug() << "DataBase::updateTo012: - I am in 012" << QT_ENDL;
5565             return true;
5566         }
5567         else
5568         {
5569                //qDebug() << "DataBase::updateTo012: - I am not in 0.012 I am in: " << getDBVersion() << QT_ENDL;
5570             while (!IAmIn011 && !ErrorUpdating)
5571             {
5572                    //qDebug() << "DataBase::updateTo012: - Check if I am in 011: !" << QT_ENDL;
5573                 IAmIn011 = updateTo011();
5574 
5575                 if (IAmIn011)
5576                 {
5577                          //qDebug() << "DataBase::updateTo012: - updateTo011 returned TRUE - I am in 0.011: " << QString::number(latestReaded) << QT_ENDL;
5578                 }
5579                 else
5580                 {
5581                         //qDebug() << "DataBase::updateTo012: - updateTo011 returned FALSE - I am NOT in 0.011: " << QString::number(latestReaded) << QT_ENDL;
5582                     ErrorUpdating = false;
5583                 }
5584             }
5585             if (ErrorUpdating)
5586             {
5587                     //qDebug() << "DataBase::updateTo012: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
5588                 // emit debugLog(Q_FUNC_INFO, "1", 7);
5589                 return false;
5590             }
5591         }
5592 
5593         // Now I am in the previous version and I can update the DB.
5594         //bool sqlOK = false;
5595 
5596         if (isTheTableExisting("supportedcontest"))
5597         {
5598             bool sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontest");
5599             if (sqlOK)
5600             {
5601                 if (createTableSupportedContest())
5602                 {
5603                     sqlOK = recreateSupportedContest();
5604                 }
5605                 else
5606                 {
5607                        //qDebug() << "DataBase::updateTo012: UPDATED NOK-1!" << QT_ENDL;
5608                    // emit debugLog(Q_FUNC_INFO, "2", 7);
5609                    return false;
5610                 }
5611             }
5612         }
5613         else
5614         {
5615             if (createTableSupportedContest())
5616             {
5617                if (!recreateSupportedContest())
5618                {
5619                       //qDebug() << "DataBase::updateTo012: UPDATED NOK-2!" << QT_ENDL;
5620                   // emit debugLog(Q_FUNC_INFO, "3", 7);
5621                    return false;
5622                }
5623             }
5624         }
5625 
5626         if (updateDBVersion(softVersion, "0.012"))
5627         {
5628                //qDebug() << "DataBase::updateTo012: - We are in 012! " << QT_ENDL;
5629         }
5630         else
5631         {
5632                //qDebug() << "DataBase::updateTo011: - Failed to go to 012! " << QT_ENDL;
5633            // emit debugLog(Q_FUNC_INFO, "4", 7);
5634             return false;
5635         }
5636 
5637            //qDebug() << "DataBase::updateTo012: UPDATED OK!" << QT_ENDL;
5638         return true;
5639 }
5640 
updateTo013()5641 bool DataBase::updateTo013()
5642 {
5643     // Updates the DB to 0.013:
5644     // Change the table qsl_via to qsl_via_enumeration
5645     // Solve the supportedContest table missing bug in some deployments
5646 
5647 
5648            //qDebug() << "DataBase::updateTo013: latestRead: " << getDBVersion() << QT_ENDL;
5649         bool IAmIn012 = false;
5650         bool ErrorUpdating = false;
5651         latestReaded = getDBVersion().toFloat();
5652            //qDebug() << "DataBase::updateTo013: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
5653         if (latestReaded >= 0.013f)
5654         {
5655                //qDebug() << "DataBase::updateTo013: - I am in 013" << QT_ENDL;
5656             return true;
5657         }
5658         else
5659         {
5660                //qDebug() << "DataBase::updateTo013: - I am not in 0.013 I am in: " << getDBVersion() << QT_ENDL;
5661             while (!IAmIn012 && !ErrorUpdating)
5662             {
5663                    //qDebug() << "DataBase::updateTo013: - Check if I am in 012: !" << QT_ENDL;
5664                 IAmIn012 = updateTo012();
5665 
5666                 if (IAmIn012)
5667                 {
5668                          //qDebug() << "DataBase::updateTo013: - updateTo012 returned TRUE - I am in 0.012: " << QString::number(latestReaded) << QT_ENDL;
5669                 }
5670                 else
5671                 {
5672                         //qDebug() << "DataBase::updateTo013: - updateTo011 returned FALSE - I am NOT in 0.012: " << QString::number(latestReaded) << QT_ENDL;
5673                     ErrorUpdating = false;
5674                 }
5675             }
5676             if (ErrorUpdating)
5677             {
5678                     //qDebug() << "DataBase::updateTo013: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
5679                // emit debugLog(Q_FUNC_INFO, "1", 7);
5680                 return false;
5681             }
5682         }
5683 
5684         // Now I am in the previous version and I can update the DB.
5685 
5686         if (!recreateSupportedContest())
5687         {
5688            // emit debugLog(Q_FUNC_INFO, "2", 7);
5689             /*emit debugLog(Q_FUNC_INFO, "0", 7);*/
5690             return false;
5691         }
5692 
5693          execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via");
5694          if (createTableQSL_Via_enumeration())
5695          {
5696              if (!populateTableQSL_Via_enumeration())
5697              {
5698                 // emit debugLog(Q_FUNC_INFO, "3", 7);
5699                  return false;
5700              }
5701          }
5702          else
5703          {
5704             // emit debugLog(Q_FUNC_INFO, "4", 7);
5705              return false;
5706          }
5707         if (updateDBVersion(softVersion, "0.013"))
5708         {
5709                //qDebug() << "DataBase::updateTo013: - We are in 013! " << QT_ENDL;
5710         }
5711         else
5712         {
5713                //qDebug() << "DataBase::updateTo013: - Failed to go to 013! " << QT_ENDL;
5714            // emit debugLog(Q_FUNC_INFO, "5", 7);
5715             return false;
5716         }
5717 
5718            //qDebug() << "DataBase::updateTo013: UPDATED OK!" << QT_ENDL;
5719         return true;
5720 }
5721 
5722 
updateTo014()5723 bool DataBase::updateTo014()
5724 {
5725     // Updates the DB to 0.014:
5726     // Updates the Satellite DB
5727 
5728 
5729            //qDebug() << "DataBase::updateto014: latestRead: " << getDBVersion() << QT_ENDL;
5730         bool IAmIn013 = false;
5731         bool ErrorUpdating = false;
5732         latestReaded = getDBVersion().toFloat();
5733            //qDebug() << "DataBase::updateto014: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
5734         if (latestReaded >= 0.014f)
5735         {
5736                //qDebug() << "DataBase::updateto014: - I am in 013" << QT_ENDL;
5737             return true;
5738         }
5739         else
5740         {
5741                //qDebug() << "DataBase::updateto014: - I am not in 0.013 I am in: " << getDBVersion() << QT_ENDL;
5742             while (!IAmIn013 && !ErrorUpdating)
5743             {
5744                    //qDebug() << "DataBase::updateto014: - Check if I am in 013: !" << QT_ENDL;
5745                 IAmIn013 = updateTo013();
5746 
5747                 if (IAmIn013)
5748                 {
5749                          //qDebug() << "DataBase::updateto014: - updateTo012 returned TRUE - I am in 0.013: " << QString::number(latestReaded) << QT_ENDL;
5750                 }
5751                 else
5752                 {
5753                         //qDebug() << "DataBase::updateto014: - updateTo011 returned FALSE - I am NOT in 0.013: " << QString::number(latestReaded) << QT_ENDL;
5754                     ErrorUpdating = false;
5755                 }
5756             }
5757             if (ErrorUpdating)
5758             {
5759                     //qDebug() << "DataBase::updateto014: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
5760                // emit debugLog(Q_FUNC_INFO, "1", 7);
5761                 return false;
5762             }
5763         }
5764 
5765         // Now I am in the previous version and I can update the DB.
5766 
5767 
5768         if (!recreateSatelliteData())
5769         {
5770                //qDebug() << "DataBase::updateTo014: - Sats update NOK " << QT_ENDL;
5771            // emit debugLog(Q_FUNC_INFO, "2", 7);
5772             return false;
5773         }
5774 
5775 
5776         if (updateDBVersion(softVersion, "0.014"))
5777         {
5778                //qDebug() << "DataBase::updateto014: - We are in 013! " << QT_ENDL;
5779         }
5780         else
5781         {
5782                //qDebug() << "DataBase::updateto014: - Failed to go to 013! " << QT_ENDL;
5783            // emit debugLog(Q_FUNC_INFO, "3", 7);
5784             return false;
5785         }
5786 
5787            //qDebug() << "DataBase::updateTo014: UPDATED OK!" << QT_ENDL;
5788         return true;
5789 }
5790 
5791 
updateTo015()5792 bool DataBase::updateTo015()
5793 {
5794     // Updates the DB to 0.015:
5795     // Adds the FT4 mode
5796 
5797     //qDebug() << "DataBase::updateto015: latestRead: " << getDBVersion() << QT_ENDL;
5798     bool IAmIn014 = false;
5799     bool ErrorUpdating = false;
5800     latestReaded = getDBVersion().toFloat();
5801       //qDebug() << "DataBase::updateto015: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
5802     if (latestReaded >= 0.015f)
5803     {
5804           //qDebug() << "DataBase::updateto015: - I am in 013" << QT_ENDL;
5805         return true;
5806     }
5807     else
5808     {
5809           //qDebug() << "DataBase::updateto014: - I am not in 0.014 I am in: " << getDBVersion() << QT_ENDL;
5810         while (!IAmIn014 && !ErrorUpdating)
5811         {
5812               //qDebug() << "DataBase::updateto015: - Check if I am in 014: !" << QT_ENDL;
5813             IAmIn014 = updateTo014();
5814             if (IAmIn014)
5815             {
5816                   //qDebug() << "DataBase::updateto015: - updateTo013 returned TRUE - I am in 0.014: " << QString::number(latestReaded) << QT_ENDL;
5817             }
5818             else
5819             {
5820                   //qDebug() << "DataBase::updateto015: - updateTo011 returned FALSE - I am NOT in 0.014: " << QString::number(latestReaded) << QT_ENDL;
5821                 ErrorUpdating = false;
5822             }
5823         }
5824         if (ErrorUpdating)
5825         {
5826               //qDebug() << "DataBase::updateto015: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
5827            // emit debugLog(Q_FUNC_INFO, "1", 7);
5828             return false;
5829         }
5830     }
5831 
5832     // Now I am in the previous version and I can update the DB.
5833 
5834 
5835     if (updateTheModeTableAndSyncLog())
5836     {
5837           //qDebug() << "DataBase::updateTo015: - updateTheModeTableAndSyncLog OK" << QT_ENDL;
5838     }
5839     else
5840     {
5841           //qDebug() << "DataBase::updateTo015: UPDATED NOK!(9)" << QT_ENDL;
5842         //ErrorUpdating = true;
5843     }
5844 
5845 
5846     if (updateDBVersion(softVersion, "0.015"))
5847     {
5848           //qDebug() << "DataBase::updateto015: - We are in 015! " << QT_ENDL;
5849     }
5850     else
5851     {
5852           //qDebug() << "DataBase::updateto015: - Failed to go to 014! " << QT_ENDL;
5853        // emit debugLog(Q_FUNC_INFO, "2", 7);
5854         return false;
5855     }
5856       //qDebug() << "DataBase::updateTo015: UPDATED OK!" << QT_ENDL;
5857     return true;
5858 }
5859 
5860 
updateTo016()5861 bool DataBase::updateTo016()
5862 {
5863     // Updates the DB to 0.016:
5864     // Updates the Satellite DB
5865 
5866 
5867            //qDebug() << "DataBase::updateto016: latestRead: " << getDBVersion() << QT_ENDL;
5868         bool IAmIn015 = false;
5869         bool ErrorUpdating = false;
5870         latestReaded = getDBVersion().toFloat();
5871            //qDebug() << "DataBase::updateto016: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
5872         if (latestReaded >= 0.016f)
5873         {
5874                //qDebug() << "DataBase::updateto016: - I am in 015" << QT_ENDL;
5875             return true;
5876         }
5877         else
5878         {
5879                //qDebug() << "DataBase::updateto016: - I am not in 0.015 I am in: " << getDBVersion() << QT_ENDL;
5880             while (!IAmIn015 && !ErrorUpdating)
5881             {
5882                    //qDebug() << "DataBase::updateto014: - Check if I am in 015: !" << QT_ENDL;
5883                 IAmIn015 = updateTo015();
5884 
5885                 if (IAmIn015)
5886                 {
5887                          //qDebug() << "DataBase::updateto016: - updateTo015 returned TRUE - I am in 0.015: " << QString::number(latestReaded) << QT_ENDL;
5888                 }
5889                 else
5890                 {
5891                         //qDebug() << "DataBase::updateto016: - updateTo015 returned FALSE - I am NOT in 0.015: " << QString::number(latestReaded) << QT_ENDL;
5892                     ErrorUpdating = false;
5893                 }
5894             }
5895             if (ErrorUpdating)
5896             {
5897                     //qDebug() << "DataBase::updateto016: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
5898                // emit debugLog(Q_FUNC_INFO, "1", 7);
5899                 return false;
5900             }
5901         }
5902 
5903         // Now I am in the previous version and I can update the DB.
5904 
5905         if (!recreateSatelliteData())
5906         {
5907                //qDebug() << "DataBase::updateTo016: - Sats update NOK " << QT_ENDL;
5908            // emit debugLog(Q_FUNC_INFO, "2", 7);
5909             return false;
5910         }
5911         if (updateDBVersion(softVersion, "0.016"))
5912         {
5913                //qDebug() << "DataBase::updateto014: - We are in 016! " << QT_ENDL;
5914         }
5915         else
5916         {
5917                //qDebug() << "DataBase::updateto014: - Failed to go to 016! " << QT_ENDL;
5918            // emit debugLog(Q_FUNC_INFO, "3", 7);
5919             return false;
5920         }
5921            //qDebug() << "DataBase::updateTo016: UPDATED OK!" << QT_ENDL;
5922         return true;
5923 }
5924 
updateTo017()5925 bool DataBase::updateTo017()
5926 {
5927     // Updates the DB to 0.017:
5928     // Updates the Satellite DB
5929 
5930     //qDebug() << "DataBase::updateto017: latestRead: " << getDBVersion() << QT_ENDL;
5931     bool IAmIn016 = false;
5932     bool ErrorUpdating = false;
5933     latestReaded = getDBVersion().toFloat();
5934     //qDebug() << "DataBase::updateto017: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
5935     if (latestReaded >= 0.017f)
5936     {
5937         //qDebug() << "DataBase::updateto017: - I am in 017" << QT_ENDL;
5938         return true;
5939     }
5940     else
5941     {
5942         //qDebug() << "DataBase::updateto017: - I am not in 0.017 I am in: " << getDBVersion() << QT_ENDL;
5943         while (!IAmIn016 && !ErrorUpdating)
5944         {
5945             //qDebug() << "DataBase::updateto017: - Check if I am in 016: !" << QT_ENDL;
5946             IAmIn016 = updateTo016();
5947             if (IAmIn016)
5948             {
5949                 //qDebug() << "DataBase::updateto017: - updateTo016 returned TRUE - I am in 0.016: " << QString::number(latestReaded) << QT_ENDL;
5950             }
5951             else
5952             {
5953                 //qDebug() << "DataBase::updateto017: - updateTo016 returned FALSE - I am NOT in 0.016: " << QString::number(latestReaded) << QT_ENDL;
5954                 ErrorUpdating = false;
5955             }
5956         }
5957         if (ErrorUpdating)
5958         {
5959             //qDebug() << "DataBase::updateto017: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
5960            // emit debugLog(Q_FUNC_INFO, "1", 7);
5961             return false;
5962         }
5963     }
5964 
5965     // Now I am in the previous version and I can update the DB.
5966 
5967         // Query to remove the "/" from a Date: update log set qso_date = replace(qso_date, '/', '')
5968         // Query to remove the ":" from the Time: update log set time_on = replace(time_on, ':', '')
5969         // Query to join columns:
5970         //  update log set qso_date = replace((SELECT qso_date from log)||'-'||time_on, '', '')
5971     /*
5972     PROCEDURE: Move to SQLITE - datetime type: // 2020-01-01 10:12:01
5973     // Query to remove the "/" from a Date: update log set qso_date = replace(qso_date, '/', '-')
5974     // Join: SELECT qso_date || ' ' || time_on from log
5975     UPDATE logtemp SET qso_date = (SELECT qso_date || ' ' || time_on FROM log)
5976     */
5977 
5978     /*
5979     QString stringQuery;
5980     stringQuery = "update log set qso_date = replace((SELECT qso_date from log)||'-'||time_on, '', '')";
5981     //UPDATE log set qso_date =  qso_date ||'-'||time_on
5982     bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
5983     if (!sqlOK)
5984     {return false;}
5985     */
5986 
5987     // Modify the qso_date with the time_on data with the right format
5988     QString stringQuery;
5989 
5990     stringQuery = "UPDATE log set qso_date = replace(qso_date ||' '||time_on, '/', '-')";
5991     bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
5992     if (!sqlOK)
5993     {/*emit debugLog(Q_FUNC_INFO, "2", 7);*/return false;}
5994 
5995     stringQuery = "UPDATE log set qso_date_off = replace(qso_date_off, '/', '-')";
5996     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
5997     if (!sqlOK)
5998     {/*emit debugLog(Q_FUNC_INFO, "3", 7);*/return false;}
5999 
6000     stringQuery = "UPDATE log set qslsdate = replace(qslsdate, '/', '-')";
6001     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6002     if (!sqlOK)
6003     {/*emit debugLog(Q_FUNC_INFO, "4", 7);*/return false;}
6004 
6005     stringQuery = "UPDATE log set qslrdate = replace(qslrdate, '/', '-')";
6006     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6007     if (!sqlOK)
6008     {/*emit debugLog(Q_FUNC_INFO, "5", 7);*/return false;}
6009 
6010     stringQuery = "UPDATE log set lotw_qslsdate = replace(lotw_qslsdate, '/', '-')";
6011     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6012     if (!sqlOK)
6013     {/*emit debugLog(Q_FUNC_INFO, "6", 7);*/return false;}
6014 
6015     stringQuery = "UPDATE log set lotw_qslrdate = replace(lotw_qslrdate, '/', '-')";
6016     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6017     if (!sqlOK)
6018     {/*emit debugLog(Q_FUNC_INFO, "7", 7);*/return false;}
6019 
6020     stringQuery = "UPDATE log set eqsl_qslrdate = replace(eqsl_qslrdate, '/', '-')";
6021     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6022     if (!sqlOK)
6023     {/*emit debugLog(Q_FUNC_INFO, "8", 7);*/return false;}
6024 
6025     stringQuery = "UPDATE log set eqsl_qslsdate = replace(eqsl_qslsdate, '/', '-')";
6026     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6027     if (!sqlOK)
6028     {/*emit debugLog(Q_FUNC_INFO, "9", 7);*/return false;}
6029 
6030     stringQuery = "UPDATE log set hrdlog_qso_upload_date = replace(hrdlog_qso_upload_date, '/', '-')";
6031     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6032     if (!sqlOK)
6033     {/*emit debugLog(Q_FUNC_INFO, "10", 7);*/return false;}
6034 
6035     stringQuery = "UPDATE log set hrdlog_qso_upload_date = replace(hrdlog_qso_upload_date, '/', '-')";
6036     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6037     if (!sqlOK)
6038     {/*emit debugLog(Q_FUNC_INFO, "11", 7);*/return false;}
6039 
6040     stringQuery = "UPDATE log set clublog_qso_upload_date = replace(clublog_qso_upload_date, '/', '-')";
6041     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6042     if (!sqlOK)
6043     {/*emit debugLog(Q_FUNC_INFO, "12", 7);*/return false;}
6044 
6045     stringQuery = "UPDATE log set qrzcom_qso_upload_date = replace(qrzcom_qso_upload_date, '/', '-')";
6046     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6047     if (!sqlOK)
6048     {/*emit debugLog(Q_FUNC_INFO, "13", 7);*/return false;}
6049     if (!recreateTableLog())
6050     {
6051         //qDebug() << "DataBase::updateTo017: - Failed to recreate Table Log " << QT_ENDL;
6052        // emit debugLog(Q_FUNC_INFO, "14", 7);
6053         return false;
6054     }
6055     //qDebug() << "DataBase::updateTo017: - Recreated Table Log " << QT_ENDL;
6056 
6057     /*
6058 
6059     else
6060     {
6061         //qDebug() << "DataBase::updateTo017: - Table log recreated OK" << QT_ENDL;
6062     }
6063     */
6064 
6065     // REMOVE THE FOLLOWING LINE ONCE THIS FUNCTION HAS BEEN UPDATED
6066     //return false;
6067 
6068     // If everything went OK, we update the DB number.
6069     if (updateDBVersion(softVersion, "0.017"))
6070     {
6071         //qDebug() << "DataBase::updateto017: - We are in 017! " << QT_ENDL;
6072     }
6073     else
6074     {
6075         //qDebug() << "DataBase::updateto017: - Failed to go to 017! " << QT_ENDL;
6076        // emit debugLog(Q_FUNC_INFO, "15", 7);
6077         return false;
6078     }
6079     //qDebug() << "DataBase::updateTo017: UPDATED OK!" << QT_ENDL;
6080     return true;
6081 }
6082 
updateTo018()6083 bool DataBase::updateTo018()
6084 {
6085     // Updates the DB to 0.018:
6086     // Adds the Subdivisions
6087 
6088     //qDebug() << "DataBase::updateto018: latestRead: " << getDBVersion() << QT_ENDL;
6089     bool IAmIn017 = false;
6090     bool ErrorUpdating = false;
6091     latestReaded = getDBVersion().toFloat();
6092     //qDebug() << "DataBase::updateto018: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
6093     if (latestReaded >= 0.018f)
6094     {
6095         //qDebug() << "DataBase::updateto018: - I am in 018" << QT_ENDL;
6096         return true;
6097     }
6098     else
6099     {
6100         //qDebug() << "DataBase::updateto018: - I am not in 0.018 I am in: " << getDBVersion() << QT_ENDL;
6101         while (!IAmIn017 && !ErrorUpdating)
6102         {
6103             //qDebug() << "DataBase::updateto017: - Check if I am in 017: !" << QT_ENDL;
6104             IAmIn017 = updateTo017();
6105             if (IAmIn017)
6106             {
6107                 //qDebug() << "DataBase::updateto018: - updateTo017 returned TRUE - I am in 0.017: " << QString::number(latestReaded) << QT_ENDL;
6108             }
6109             else
6110             {
6111                 //qDebug() << "DataBase::updateto017: - updateTo017 returned FALSE - I am NOT in 0.017: " << QString::number(latestReaded) << QT_ENDL;
6112                 ErrorUpdating = false;
6113             }
6114         }
6115         if (ErrorUpdating)
6116         {
6117             //qDebug() << "DataBase::updateto018: - I Could not update to: " << QString::number(dbVersion) << QT_ENDL;
6118            // emit debugLog(Q_FUNC_INFO, "1", 7);
6119             return false;
6120         }
6121     }
6122 
6123     // Now I am in the previous version and I can update the DB.
6124 
6125     bool ok = createTableSubdivision(true);
6126 
6127     if (!ok)
6128     {
6129         return false;
6130     }
6131     // REMOVE THE FOLLOWING LINE ONCE THIS FUNCTION HAS BEEN UPDATED
6132     //return false;
6133 
6134     // If everything went OK, we update the DB number.
6135     if (updateDBVersion(softVersion, "0.018"))
6136     {
6137         //qDebug() << "DataBase::updateto018: - We are in 018! " << QT_ENDL;
6138     }
6139     else
6140     {
6141         //qDebug() << "DataBase::updateto018: - Failed to go to 018! " << QT_ENDL;
6142        // emit debugLog(Q_FUNC_INFO, "15", 7);
6143         return false;
6144     }
6145     //qDebug() << "DataBase::updateTo018: UPDATED OK!" << QT_ENDL;
6146     return true;
6147 }
6148 
updateTo019()6149 bool DataBase::updateTo019()
6150 {// Adds FTS4 and FST4W modes
6151  // Adds RS-44 sat
6152    //qDebug() << Q_FUNC_INFO << " "  << getDBVersion() << QT_ENDL;
6153     bool IAmIn018 = false;
6154     bool ErrorUpdating = false;
6155     latestReaded = getDBVersion().toFloat();
6156    //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
6157     if (latestReaded >= 0.019f)
6158     {
6159        //qDebug() << Q_FUNC_INFO << " : - I am in 019" << QT_ENDL;
6160         return true;
6161     }
6162     else
6163     {
6164         while (!IAmIn018 && !ErrorUpdating)
6165         {
6166             IAmIn018 = updateTo018();
6167             if (IAmIn018)
6168             {
6169             }
6170             else
6171             {
6172                 ErrorUpdating = false;
6173             }
6174         }
6175         if (ErrorUpdating)
6176         {
6177              // emit debugLog(Q_FUNC_INFO, "1", 7);
6178             return false;
6179         }
6180     }
6181 
6182     // Now I am in the previous version and I can update the DB.
6183 
6184 
6185     if (updateTheModeTableAndSyncLog() && recreateSatelliteData())
6186     {
6187           //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" << QT_ENDL;
6188     }
6189     else
6190     {
6191          //qDebug() << Q_FUNC_INFO << " : UPDATED NOK!(9)" << QT_ENDL;
6192         return false;
6193     }
6194 
6195 
6196     if (updateDBVersion(softVersion, "0.019"))
6197     {
6198           //qDebug() << Q_FUNC_INFO << " : - We are in 019! " << QT_ENDL;
6199     }
6200     else
6201     {
6202        //qDebug() << Q_FUNC_INFO << " : - Failed to go to 018! " << QT_ENDL;
6203        // emit debugLog(Q_FUNC_INFO, "2", 7);
6204         return false;
6205     }
6206 
6207    //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" << QT_ENDL;
6208     return true;
6209 }
6210 
updateTo022()6211 bool DataBase::updateTo022()
6212 {// Adds Q65 mode
6213    //qDebug() << Q_FUNC_INFO << " "  << getDBVersion() << QT_ENDL;
6214     bool IamInPreviousVersion = false;
6215     bool ErrorUpdating = false;
6216     latestReaded = getDBVersion().toFloat();
6217    //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
6218     if (latestReaded >= dbVersion)
6219     {
6220        //qDebug() << Q_FUNC_INFO << " : - I am in 022" << QT_ENDL;
6221         return true;
6222     }
6223     while (!IamInPreviousVersion && !ErrorUpdating)
6224     {
6225         IamInPreviousVersion = updateTo021();
6226         if (!IamInPreviousVersion)
6227         {
6228             return false;
6229         }
6230     }
6231 
6232     // Now I am in the previous version and I can update the DB.
6233 
6234     if (!updateTheModeTableAndSyncLog() )
6235     {
6236         //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" << QT_ENDL;
6237         return false;
6238     }
6239 
6240     if (!updateDBVersion(softVersion, QString::number(0.022)))
6241     {
6242         //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " << QT_ENDL;
6243         return false;
6244     }
6245     //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " << QT_ENDL;
6246     //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" << QT_ENDL;
6247     return true;
6248 }
6249 
updateTo021()6250 bool DataBase::updateTo021()
6251 {// Adds 5M & 8M bands
6252     //qDebug() << Q_FUNC_INFO << " "  << getDBVersion() << QT_ENDL;
6253      bool IamInPreviousVersion = false;
6254      bool ErrorUpdating = false;
6255      latestReaded = getDBVersion().toFloat();
6256     //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) << QT_ENDL;
6257      if (latestReaded >= dbVersion)
6258      {
6259         //qDebug() << Q_FUNC_INFO << " : - I am in 019" << QT_ENDL;
6260          return true;
6261      }
6262      while (!IamInPreviousVersion && !ErrorUpdating)
6263      {
6264          IamInPreviousVersion = updateTo019();
6265          if (!IamInPreviousVersion)
6266          {
6267              return false;
6268          }
6269      }
6270 
6271      // Now I am in the previous version and I can update the DB.
6272 
6273      if (!recreateTableBand ())
6274      {
6275          //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" << QT_ENDL;
6276          return false;
6277      }
6278 
6279      if (!updateDBVersion(softVersion, QString::number(0.021)))
6280      {
6281          //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " << QT_ENDL;
6282          return false;
6283      }
6284      //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " << QT_ENDL;
6285      //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" << QT_ENDL;
6286      return true;
6287 }
6288 
updateAwardDXCCTable()6289 bool DataBase::updateAwardDXCCTable()
6290 {
6291        //qDebug() << "DataBase::updateAwardDXCCTable" << QT_ENDL;
6292 
6293     QList<AwarddxccEntry> dxccStatusList;
6294     //QList<AwarddxccEntryCheck> dxccStatusListCheck;
6295     dxccStatusList.clear();
6296     //dxccStatusListCheck.clear();
6297 
6298     AwarddxccEntry awardEntry;
6299     awardEntry.dxcc = QString();
6300     awardEntry.band = QString();
6301     awardEntry.status = QString();
6302     awardEntry.logNumber = QString();
6303     awardEntry.qsoID = QString();
6304 
6305     QString stringQuery = QString("SELECT id, bandid, modeid, dxcc, qsl_rcvd, lotw_qsl_rcvd, lognumber FROM log ORDER BY dxcc");
6306     QSqlQuery query;//, query2;
6307 
6308     bool sqlOK = query.exec(stringQuery);
6309     QSqlRecord rec = query.record();
6310     if (!sqlOK)
6311     {
6312         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
6313         query.finish();
6314        // emit debugLog(Q_FUNC_INFO, "1", 7);
6315         return false;
6316     }
6317     else
6318     {
6319            //qDebug() << "DataBase::updateAwardDXCCTable SELECT when OK" << QT_ENDL;
6320     }
6321     QStringList dxccStatus = QStringList(); //dxcc, band, mode, confirmed, lognumber, qsoid (per award set)
6322     QStringList dxccStatusCheck = QStringList(); //dxcc, band, mode, confirmed, lognumber (per award set) just to check
6323     int nameCol = -1;
6324 
6325     QString _aux = QString();
6326 
6327        //qDebug() << "DataBase::updateAwardDXCCTable before the while" << QT_ENDL;
6328     while (query.next())
6329     {
6330            //qDebug() << "DataBase::updateAwardDXCCTable IN the while" << QT_ENDL;
6331         if (query.isValid())
6332         {
6333                //qDebug() << "DataBase::updateAwardDXCCTable VALID" << QT_ENDL;
6334             awardEntry.dxcc.clear();
6335             awardEntry.band.clear();
6336             awardEntry.status.clear();
6337             awardEntry.logNumber.clear();
6338             awardEntry.qsoID.clear();
6339 
6340                //qDebug() << "DataBase::updateAwardDXCCTable in the while" << QT_ENDL;
6341             nameCol = rec.indexOf("qsl_rcvd");
6342             bool qsl = false;
6343 
6344             if ((query.value(nameCol)).toString() == "Y")
6345             {
6346                 qsl = true;
6347             }
6348 
6349             nameCol = rec.indexOf("lotw_qsl_rcvd");
6350             bool lotw = false;
6351             if ((query.value(nameCol)).toString() == "Y")
6352             {
6353                 lotw = true;
6354             }
6355 
6356             if (qsl || lotw )
6357             {
6358                 awardEntry.status = "1";
6359             }
6360             else
6361             {
6362                 awardEntry.status = "0";
6363             }
6364 
6365                //qDebug() << "DataBase::updateAwardDXCCTable - status" << awardEntry.status << QT_ENDL;
6366             if ((awardEntry.status == "1") || (awardEntry.status == "0") )
6367             {
6368                 nameCol = rec.indexOf("dxcc");
6369                 awardEntry.dxcc = (query.value(nameCol)).toString();
6370 
6371                 if ((awardEntry.dxcc).toInt()>0)
6372                 {
6373                     nameCol = rec.indexOf("bandid");
6374                     awardEntry.band = (query.value(nameCol)).toString();
6375 
6376                     nameCol = rec.indexOf("modeid");
6377                     awardEntry.mode = (query.value(nameCol)).toString();
6378 
6379                     nameCol = rec.indexOf("id");
6380                     awardEntry.qsoID = (query.value(nameCol)).toString();
6381 
6382                     nameCol = rec.indexOf("lognumber");
6383                     awardEntry.logNumber = (query.value(nameCol)).toString();
6384 
6385                        //qDebug() << "DataBase::updateAwardDXCCTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/"  << awardEntry.logNumber <<"/" << awardEntry.qsoID << QT_ENDL;
6386                     dxccStatusList.append(awardEntry);
6387                 }
6388             } // END OF IF VALID
6389         }
6390     } // END OF  WHILE
6391 
6392        //qDebug() << "DataBase::updateAwardDXCCTable - END OF WHILE" << QT_ENDL;
6393 
6394     query.finish();
6395 
6396 
6397        //qDebug() << "DataBase::updateAwardDXCCTable: Log analized... let's clean the table!" << QT_ENDL;
6398 
6399     stringQuery = QString("DELETE FROM awarddxcc");
6400 
6401     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6402     if (!sqlOK)
6403     {return false;}
6404     else
6405     {
6406            //qDebug() << "DataBase::updateAwardDXCCTable: awarddxcc table DELETED" << QT_ENDL;
6407     }
6408 
6409        //qDebug() << "DataBase::updateAwardDXCCTable: Now we start writing the table!!" << QT_ENDL;
6410 
6411     //int i = 0;
6412     _aux.clear();
6413 
6414     int qsos = dxccStatusList.length();
6415     int step = util->getProgresStepForDialog(qsos);
6416 
6417     QProgressDialog progress(QObject::tr("Updating DXCC award information..."), QObject::tr("Abort updating"), 0, qsos);
6418     progress.setMaximum(qsos);
6419     progress.setWindowModality(Qt::WindowModal);
6420 
6421        //qDebug() << "DataBase::updateAwardDXCCTable: INSERTING: " << QString::number(qsos) << " QSOS..." << QT_ENDL;
6422 
6423     for (int j=0;j<dxccStatusList.length();j++)
6424     {
6425         stringQuery = QString("INSERT INTO awarddxcc (dxcc, band, mode, confirmed, lognumber, qsoid) VALUES ('%1', '%2', '%3', '%4', '%5', '%6') ").arg(dxccStatusList.at(j).dxcc).arg(dxccStatusList.at(j).band).arg(dxccStatusList.at(j).mode).arg(dxccStatusList.at(j).status).arg(dxccStatusList.at(j).logNumber).arg(dxccStatusList.at(j).qsoID);
6426         //sqlOK = query.exec(Q_FUNC_INFO, stringQuery);
6427         sqlOK = query.exec(stringQuery);
6428         if (!sqlOK)
6429         {
6430                //qDebug() << "DataBase::updateAwardDXCCTable: Error: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL;
6431             if (query.lastError().nativeErrorCode() == 19)
6432             { // DUPLICATED RECORD: Means that there is already a record in the award... so this set is worked. QSL can be Y or N in the award but inthe log may be other options
6433               // We should only take into account if N or Y
6434                 if (dxccStatusList.at(j).status!="1")
6435                 { // If tne new status is not confirmed, no change. DO NOTHING
6436                        //qDebug() << "DataBase::updateAwardDXCCTable: Duplicated but DO NOTHING as new status is not Confirmed!!!" << QT_ENDL;
6437                 }
6438                 else
6439                 {
6440                        //qDebug() << "DataBase::updateAwardDXCCTable: Duplicated but NOW is confirmed!!!" << QT_ENDL;
6441                     stringQuery = QString("SELECT confirmed, lognumber, qsoid FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND mode='%3'").arg(dxccStatusList.at(j).dxcc).arg(dxccStatusList.at(j).band).arg(dxccStatusList.at(j).mode);
6442                     QSqlQuery query2;//, query2;
6443 
6444                     sqlOK = query2.exec(stringQuery);
6445                     QSqlRecord rec = query2.record();
6446                     if (!sqlOK)
6447                     {
6448                         queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery());
6449                         query2.finish();
6450                        // emit debugLog(Q_FUNC_INFO, "3", 7);
6451                         return false;
6452                     }
6453                     else
6454                     {
6455                         query2.next();
6456                         if (query2.isValid())
6457                         {
6458                             nameCol = rec.indexOf("confirmed");
6459                             stringQuery = (query2.value(nameCol)).toString();
6460                             QString _qsoid = QString();
6461                             nameCol = rec.indexOf("qsoid");
6462                             _qsoid = (query2.value(nameCol)).toString();
6463 
6464                             if ((stringQuery == "0") && (dxccStatusList.at(j).status == "1"))
6465                             {
6466                                 query2.finish();
6467                                 stringQuery = QString ("UPDATE awarddxcc SET confirmed = '1', qsoid = '%1' WHERE qsoid='%2'").arg(dxccStatusList.at(j).qsoID).arg(_qsoid);
6468                                 if (execQuery(Q_FUNC_INFO, stringQuery))                                {
6469                                 }
6470                                 else
6471                                 {
6472                                        //qDebug() << "DataBase::updateAwardDXCCTable: Duplicated but UPDATE IS NOT DONE" << QT_ENDL;
6473                                 }
6474                             }
6475                             else
6476                             {
6477                                    //qDebug() << "DataBase::updateAwardDXCCTable: Duplicated but UPDATE NOT NEEDED" << QT_ENDL;
6478                             }
6479                         }
6480                         else
6481                         {
6482                                //qDebug() << "DataBase::updateAwardDXCCTable: Duplicated SELECT query is not Valid" << QT_ENDL;
6483                         }
6484                     }
6485                 }
6486                    //qDebug() << "DataBase::updateAwardDXCCTable: Duplicated!" << QT_ENDL;
6487             }
6488             else
6489             {
6490                 queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
6491                 query.finish();
6492                // emit debugLog(Q_FUNC_INFO, "4", 7);
6493                 return false;
6494             }
6495         }
6496         else
6497         {
6498                //qDebug() << "DataBase::updateAwardDXCCTable: INSERT OK: " << QT_ENDL;
6499         }
6500 
6501         query.finish();
6502            //qDebug() << "DataBase::updateAwardDXCCTable: Checking steps " << QT_ENDL;
6503         if (( (j % step )== 0) )
6504         { // To update the speed I will only show the progress once each X QSOs
6505             _aux = QObject::tr("Updating DXCC Award information...") + "\n" + QObject::tr("QSO: ")  + QString::number(j) + "/" + QString::number(qsos);
6506             progress.setLabelText(_aux);
6507             progress.setValue(j);
6508         }
6509         if ( progress.wasCanceled() )
6510         {
6511                   //qDebug() << "DataBase::updateAwardDXCCTable: progress canceled" << QT_ENDL;
6512             return true;
6513         }
6514     }
6515 
6516     progress.setValue(qsos);
6517        //qDebug() << "DataBase::updateAwardDXCCTable: LAST END OK " << QT_ENDL;
6518 
6519     return true;
6520 }
6521 
updateAwardWAZTable()6522 bool DataBase::updateAwardWAZTable()
6523 {
6524        //qDebug() << "DataBase::updateAwardWAZTable" << QT_ENDL;
6525     QList<AwarddxccEntry> dxccStatusList;
6526     //QList<AwarddxccEntryCheck> dxccStatusListCheck;
6527     dxccStatusList.clear();
6528     //dxccStatusListCheck.clear();
6529 
6530     AwarddxccEntry awardEntry;
6531     awardEntry.dxcc = QString();
6532     awardEntry.band = QString();
6533     awardEntry.status = QString();
6534     awardEntry.logNumber = QString();
6535     awardEntry.qsoID = QString();
6536 
6537     QString stringQuery = QString("SELECT id, bandid, modeid, cqz, qsl_rcvd, lotw_qsl_rcvd, lognumber FROM log ORDER BY cqz");
6538     QSqlQuery query;//, query2;
6539 
6540     bool sqlOK = query.exec(stringQuery);
6541     QSqlRecord rec = query.record();
6542     if (!sqlOK)
6543     {
6544         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
6545         query.finish();
6546        // emit debugLog(Q_FUNC_INFO, "1", 7);
6547         return false;
6548     }
6549     else
6550     {
6551            //qDebug() << "DataBase::updateAwardWAZTable SELECT when OK" << QT_ENDL;
6552     }
6553     QStringList dxccStatus = QStringList(); //cqz, band, mode, confirmed, lognumber, qsoid (per award set)
6554     QStringList dxccStatusCheck = QStringList(); //cqz, band, mode, confirmed, lognumber (per award set) just to check
6555     int nameCol = -1;
6556 
6557     QString _aux = QString();
6558 
6559        //qDebug() << "DataBase::updateAwardWAZTable before the while" << QT_ENDL;
6560     while (query.next())
6561     {
6562            //qDebug() << "DataBase::updateAwardWAZTable IN the while" << QT_ENDL;
6563         if (query.isValid())
6564         {
6565                //qDebug() << "DataBase::updateAwardWAZTable VALID" << QT_ENDL;
6566             awardEntry.dxcc.clear();
6567             awardEntry.band.clear();
6568             awardEntry.status.clear();
6569             awardEntry.logNumber.clear();
6570             awardEntry.qsoID.clear();
6571 
6572                //qDebug() << "DataBase::updateAwardWAZTable in the while" << QT_ENDL;
6573             nameCol = rec.indexOf("qsl_rcvd");
6574             bool qsl = false;
6575 
6576             if ((query.value(nameCol)).toString() == "Y")
6577             {
6578                 qsl = true;
6579             }
6580 
6581             nameCol = rec.indexOf("lotw_qsl_rcvd");
6582             bool lotw = false;
6583             if ((query.value(nameCol)).toString() == "Y")
6584             {
6585                 lotw = true;
6586             }
6587 
6588             if (qsl || lotw )
6589             {
6590                 awardEntry.status = "1";
6591             }
6592             else
6593             {
6594                 awardEntry.status = "0";
6595             }
6596                //qDebug() << "DataBase::updateAwardWAZTable - status" << awardEntry.status << QT_ENDL;
6597             if ((awardEntry.status == "1") || (awardEntry.status == "0") )
6598             {
6599                 nameCol = rec.indexOf("cqz");
6600                 awardEntry.dxcc = (query.value(nameCol)).toString();
6601 
6602                 if ((awardEntry.dxcc).toInt()>0)
6603                 {
6604                     nameCol = rec.indexOf("bandid");
6605                     awardEntry.band = (query.value(nameCol)).toString();
6606 
6607                     nameCol = rec.indexOf("modeid");
6608                     awardEntry.mode = (query.value(nameCol)).toString();
6609 
6610                     nameCol = rec.indexOf("id");
6611                     awardEntry.qsoID = (query.value(nameCol)).toString();
6612 
6613                     nameCol = rec.indexOf("lognumber");
6614                     awardEntry.logNumber = (query.value(nameCol)).toString();
6615 
6616                        //qDebug() << "DataBase::updateAwardWAZTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/"  << awardEntry.logNumber <<"/" << awardEntry.qsoID << QT_ENDL;
6617                     dxccStatusList.append(awardEntry);
6618                 }
6619             } // END OF IF VALID
6620         }
6621     } // END OF  WHILE
6622 
6623        //qDebug() << "DataBase::updateAwardWAZTable - END OF WHILE" << QT_ENDL;
6624 
6625     query.finish();
6626 
6627 
6628        //qDebug() << "DataBase::updateAwardWAZTable: Log analized... let's clean the table!" << QT_ENDL;
6629 
6630     stringQuery = QString("DELETE FROM awardwaz");
6631 
6632     sqlOK = execQuery(Q_FUNC_INFO, stringQuery);
6633     if (!sqlOK)
6634     {return false;}
6635     else
6636     {
6637            //qDebug() << "DataBase::updateAwardWAZTable: awardwaz table DELETED" << QT_ENDL;
6638     }
6639 
6640 
6641        //qDebug() << "DataBase::updateAwardWAZTable: Now we start writing the table!!" << QT_ENDL;
6642 
6643     //int i = 0;
6644     _aux.clear();
6645 
6646     int qsos = dxccStatusList.length();
6647     int step = util->getProgresStepForDialog(qsos);
6648 
6649     QProgressDialog progress(QObject::tr("Updating WAZ award information..."), QObject::tr("Abort updating"), 0, qsos);
6650     progress.setMaximum(qsos);
6651     progress.setWindowModality(Qt::WindowModal);
6652 
6653        //qDebug() << "DataBase::updateAwardWAZTable: INSERTING: " << QString::number(qsos) << " QSOS..." << QT_ENDL;
6654 
6655     for (int j=0;j<dxccStatusList.length();j++)
6656     {
6657         stringQuery = QString("INSERT INTO awardwaz (cqz, band, mode, confirmed, lognumber, qsoid) VALUES ('%1', '%2', '%3', '%4', '%5', '%6') ").arg(dxccStatusList.at(j).dxcc).arg(dxccStatusList.at(j).band).arg(dxccStatusList.at(j).mode).arg(dxccStatusList.at(j).status).arg(dxccStatusList.at(j).logNumber).arg(dxccStatusList.at(j).qsoID);
6658         //sqlOK = query.exec(Q_FUNC_INFO, stringQuery);
6659         sqlOK = query.exec(stringQuery);
6660         if (!sqlOK)
6661         {
6662                //qDebug() << "DataBase::updateAwardWAZTable: Error: " << QString::number(query.lastError().nativeErrorCode()) << QT_ENDL;
6663             if (query.lastError().nativeErrorCode() == 19)
6664             { // DUPLICATED RECORD: Means that there is already a record in the award... so this set is worked. QSL can be Y or N in the award but inthe log may be other options
6665               // We should only take into account if N or Y
6666                 if (dxccStatusList.at(j).status!="1")
6667                 { // If tne new status is not confirmed, no change. DO NOTHING
6668                        //qDebug() << "DataBase::updateAwardWAZTable: Duplicated but DO NOTHING as new status is not Confirmed!!!" << QT_ENDL;
6669                 }
6670                 else
6671                 {
6672                        //qDebug() << "DataBase::updateAwardWAZTable: Duplicated but NOW is confirmed!!!" << QT_ENDL;
6673                     stringQuery = QString("SELECT confirmed, lognumber, qsoid FROM awardwaz WHERE cqz='%1' AND band='%2' AND mode='%3'").arg(dxccStatusList.at(j).dxcc).arg(dxccStatusList.at(j).band).arg(dxccStatusList.at(j).mode);
6674                     QSqlQuery query2;//, query2;
6675 
6676                     sqlOK = query2.exec(stringQuery);
6677                     QSqlRecord rec = query2.record();
6678                     if (!sqlOK)
6679                     {
6680                         queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery());
6681                         query2.finish();
6682                        // emit debugLog(Q_FUNC_INFO, "3", 7);
6683                         return false;
6684                     }
6685                     else
6686                     {
6687                         query2.next();
6688                         if (query2.isValid())
6689                         {
6690                             nameCol = rec.indexOf("confirmed");
6691                             stringQuery = (query2.value(nameCol)).toString();
6692                             QString _qsoid = QString();
6693                             nameCol = rec.indexOf("qsoid");
6694                             _qsoid = (query2.value(nameCol)).toString();
6695 
6696                             if ((stringQuery == "0") && (dxccStatusList.at(j).status == "1"))
6697                             {
6698                                 query2.finish();
6699                                 stringQuery = QString ("UPDATE awardwaz SET confirmed = '1', qsoid = '%1' WHERE qsoid='%2'").arg(dxccStatusList.at(j).qsoID).arg(_qsoid);
6700                                 if (execQuery(Q_FUNC_INFO, stringQuery))
6701                                 {
6702                                 }
6703                                 else
6704                                 {
6705                                        //qDebug() << "DataBase::updateAwardWAZTable: Duplicated but UPDATE IS NOT DONE" << QT_ENDL;
6706                                 }
6707                             }
6708                             else
6709                             {
6710                                    //qDebug() << "DataBase::updateAwardWAZTable: Duplicated but UPDATE NOT NEEDED" << QT_ENDL;
6711                             }
6712                         }
6713                         else
6714                         {
6715                                //qDebug() << "DataBase::updateAwardWAZTable: Duplicated SELECT query is not Valid" << QT_ENDL;
6716                         }
6717                     }
6718                 }
6719                    //qDebug() << "DataBase::updateAwardWAZTable: Duplicated!" << QT_ENDL;
6720             }
6721             else
6722             {
6723                 queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
6724                 query.finish();
6725                // emit debugLog(Q_FUNC_INFO, "5", 7);
6726                 return false;
6727             }
6728         }
6729         else
6730         {
6731                //qDebug() << "DataBase::updateAwardWAZTable: INSERT OK: " << QT_ENDL;
6732         }
6733 
6734         query.finish();
6735            //qDebug() << "DataBase::updateAwardWAZTable: Checking steps " << QT_ENDL;
6736         if (( (j % step )== 0) )
6737         { // To update the speed I will only show the progress once each X QSOs
6738             _aux = QObject::tr("Updating WAZ Award information...") + "\n" + QObject::tr("QSO: ")  + QString::number(j) + "/" + QString::number(qsos);
6739             progress.setLabelText(_aux);
6740             progress.setValue(j);
6741         }
6742         if ( progress.wasCanceled() )
6743         {
6744                   //qDebug() << "DataBase::updateAwardWAZTable: progress canceled" << QT_ENDL;
6745             return true;
6746         }
6747     }
6748 
6749     progress.setValue(qsos);
6750        //qDebug() << "DataBase::updateAwardWAZTable: LAST END OK " << QT_ENDL;
6751     return true;
6752 }
6753 
6754 
getNumberOfQsos(const int _logNumber)6755 int DataBase::getNumberOfQsos(const int _logNumber)
6756 {
6757     QString stringQuery = QString();
6758     if (_logNumber<1)
6759     {
6760         stringQuery = QString("SELECT COUNT (*) FROM log");
6761     }
6762     else
6763     {
6764         stringQuery = QString("SELECT COUNT (*) FROM log WHERE lognumber='%1'").arg(_logNumber);
6765     }
6766     QSqlQuery query;
6767     bool sqlOK = query.exec(stringQuery);
6768     int qsos = 0;
6769 
6770     if (sqlOK)
6771     {
6772         //QSqlDatabase::database().commit();
6773         query.next();
6774         qsos = (query.value(0)).toInt();
6775     }
6776     else
6777     {
6778         queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
6779     }
6780     query.finish();
6781     return qsos;
6782 }
6783 
queryErrorManagement(const QString & _functionFailed,const QString & errorCodeS,const QString & _nativeError,const QString & _failedQuery)6784 void DataBase::queryErrorManagement(const QString &_functionFailed, const QString &errorCodeS, const QString &_nativeError, const QString &_failedQuery)
6785 {
6786        //qDebug() << "DataBase::queryErrorManagement: constrid - " << QString::number(constrid) << QT_ENDL;
6787        //qDebug() << "DataBase::queryErrorManagement: Function: " << functionFailed << QT_ENDL;
6788        //qDebug() << "DataBase::queryErrorManagement: Native: " << _nativeError << QT_ENDL;
6789        //qDebug() << "DataBase::queryErrorManagement: Error: " << functionFailed << errorCodeS << QT_ENDL;
6790        //qDebug() << "DataBase::queryErrorManagement: Query failed: " << failedQuery << QT_ENDL;
6791 }
6792 
6793 /*
6794  bool DataBase::beginTransaction()
6795  {
6796         //qDebug() << "DataBase::beginTransaction: " << QT_ENDL;
6797      QSqlDatabase db = QSqlDatabase::database();
6798      db.setDatabaseName(dbName);
6799      return execQuery(Q_FUNC_INFO, "BEGIN IMMEDIATE TRANSACTION");
6800  }
6801 
6802 
6803  bool DataBase::commitTransaction()
6804  {
6805         //qDebug() << "DataBase::commitTransaction: " << QT_ENDL;
6806      return db.commit();
6807  }
6808 
6809 */
6810 
execQuery(const QString & function,const QString & stringQuery)6811  bool DataBase::execQuery(const QString &function, const QString &stringQuery)
6812  {
6813     //qDebug() << "DataBase::execQuery: " << function << " : " << stringQuery << QT_ENDL;
6814     QSqlQuery query;
6815 
6816     if (query.exec(stringQuery))
6817     {
6818         while (query.isActive())
6819         {
6820                //qDebug() << "DataBase::execQuery: Still active... " << QT_ENDL;
6821             query.finish();
6822         }
6823     //qDebug() << "DataBase::execQuery: No longer active... " << QT_ENDL;
6824         return true;
6825     }
6826     else
6827     {
6828         queryErrorManagement(function, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
6829         query.finish();
6830        // emit debugLog(Q_FUNC_INFO, "1", 7);
6831         return false;
6832     }
6833  }
6834 
6835