From 5e769f3e850e9a9f9328746cbe75900c5e46e875 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 18 Nov 2019 16:45:16 +0000 Subject: [PATCH] Log FT8 DXpedition mode dupe contacts Not logging dupes seems to cuase problems with QSL matching where the Hound fails to log when an RR73 message is not succesfully received. By logging dupes a later retry by a Hound to complete a QSO will be recorded in the Fox's log. --- models/FoxLog.cpp | 56 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/models/FoxLog.cpp b/models/FoxLog.cpp index 954090bd6..ad02cd2b8 100644 --- a/models/FoxLog.cpp +++ b/models/FoxLog.cpp @@ -47,6 +47,21 @@ public: #include "FoxLog.moc" +namespace +{ + QString const fox_log_ddl { + "CREATE %1 TABLE fox_log%2 (" + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + " \"when\" DATETIME NOT NULL," + " call VARCHAR(20) NOT NULL," + " grid VARCHAR(4)," + " report_sent VARCHAR(3)," + " report_rcvd VARCHAR(3)," + " band VARCHAR(6) NOT NULL" + ")" + }; +} + FoxLog::impl::impl (Configuration const * configuration) : configuration_ {configuration} { @@ -54,16 +69,37 @@ FoxLog::impl::impl (Configuration const * configuration) { QSqlQuery query; SQL_error_check (query, static_cast (&QSqlQuery::exec), - "CREATE TABLE fox_log (" - " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," - " \"when\" DATETIME NOT NULL," - " call VARCHAR(20) NOT NULL," - " grid VARCHAR(4)," - " report_sent VARCHAR(3)," - " report_rcvd VARCHAR(3)," - " band VARCHAR(6) NOT NULL," - " CONSTRAINT no_dupes UNIQUE (call, band)" - ")"); + fox_log_ddl.arg ("").arg ("")); + } + else + { + QSqlQuery query; + // query to check if table has a unique constraint + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "SELECT COUNT(*)" + " FROM sqlite_master" + " WHERE" + " type = 'index' AND tbl_name = 'fox_log'"); + query.next (); + if (query.value (0).toInt ()) + { + // update to new schema with no dupe disallowing unique + // constraint + database ().transaction (); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + fox_log_ddl.arg ("TEMPORARY").arg ("_backup")); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "INSERT INTO fox_log_backup SELECT * from fox_log"); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "DROP TABLE fox_log"); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + fox_log_ddl.arg ("").arg ("")); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "INSERT INTO fox_log SELECT * from fox_log_backup"); + SQL_error_check (query, static_cast (&QSqlQuery::exec), + "DROP TABLE fox_log_backup"); + database ().commit (); + } } SQL_error_check (dupe_query_, &QSqlQuery::prepare,