Skip to content

Commit 2398966

Browse files
committed
Fix for issue #987 - Return -1 when SQLite field is null
1 parent c20f1ef commit 2398966

File tree

3 files changed

+64
-27
lines changed

3 files changed

+64
-27
lines changed

tools/library/tbc/lddecodemetadata.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <QDebug>
2121
#include <QMap>
2222
#include <QMultiMap>
23+
#include <QVariant>
2324
#include "tbc/logging.h"
2425

2526
// Default values used when configuring VideoParameters for a particular video system.
@@ -539,16 +540,16 @@ void LdDecodeMetaData::readFields(SqliteReader &reader, int captureId)
539540
// Note: field_id in database is 0-indexed, but seqNo should be 1-indexed
540541
int fieldId = fieldsQuery.value("field_id").toInt();
541542
field.seqNo = fieldId + 1;
542-
field.isFirstField = fieldsQuery.value("is_first_field").toInt() == 1;
543-
field.syncConf = fieldsQuery.value("sync_conf").toInt();
544-
field.medianBurstIRE = fieldsQuery.value("median_burst_ire").toDouble();
545-
field.fieldPhaseID = fieldsQuery.value("field_phase_id").toInt();
546-
field.audioSamples = fieldsQuery.value("audio_samples").toInt();
547-
field.diskLoc = fieldsQuery.value("disk_loc").toDouble();
548-
field.fileLoc = fieldsQuery.value("file_loc").toLongLong();
549-
field.decodeFaults = fieldsQuery.value("decode_faults").toInt();
550-
field.efmTValues = fieldsQuery.value("efm_t_values").toInt();
551-
field.pad = fieldsQuery.value("pad").toInt() == 1;
543+
field.isFirstField = SqliteValue::toBoolOrDefault(fieldsQuery, "is_first_field");
544+
field.syncConf = SqliteValue::toIntOrDefault(fieldsQuery, "sync_conf", 0);
545+
field.medianBurstIRE = SqliteValue::toDoubleOrDefault(fieldsQuery, "median_burst_ire", 0.0);
546+
field.fieldPhaseID = SqliteValue::toIntOrDefault(fieldsQuery, "field_phase_id");
547+
field.audioSamples = SqliteValue::toIntOrDefault(fieldsQuery, "audio_samples");
548+
field.diskLoc = SqliteValue::toDoubleOrDefault(fieldsQuery, "disk_loc");
549+
field.fileLoc = SqliteValue::toLongLongOrDefault(fieldsQuery, "file_loc");
550+
field.decodeFaults = SqliteValue::toIntOrDefault(fieldsQuery, "decode_faults");
551+
field.efmTValues = SqliteValue::toIntOrDefault(fieldsQuery, "efm_t_values");
552+
field.pad = SqliteValue::toBoolOrDefault(fieldsQuery, "pad");
552553

553554
// Read NTSC data from the main field record
554555
field.ntsc.isFmCodeDataValid = fieldsQuery.value("ntsc_is_fm_code_data_valid").toInt() == 1;

tools/library/tbc/sqliteio.cpp

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,34 @@
1818
#include <QStringList>
1919
#include "tbc/logging.h"
2020

21+
namespace SqliteValue
22+
{
23+
// Keep legacy "-1 means missing" semantics when SQLite stores NULL
24+
int toIntOrDefault(const QSqlQuery &query, const char *column, int defaultValue)
25+
{
26+
const QVariant value = query.value(column);
27+
return value.isNull() ? defaultValue : value.toInt();
28+
}
29+
30+
qint64 toLongLongOrDefault(const QSqlQuery &query, const char *column, qint64 defaultValue)
31+
{
32+
const QVariant value = query.value(column);
33+
return value.isNull() ? defaultValue : value.toLongLong();
34+
}
35+
36+
double toDoubleOrDefault(const QSqlQuery &query, const char *column, double defaultValue)
37+
{
38+
const QVariant value = query.value(column);
39+
return value.isNull() ? defaultValue : value.toDouble();
40+
}
41+
42+
bool toBoolOrDefault(const QSqlQuery &query, const char *column, bool defaultValue)
43+
{
44+
const QVariant value = query.value(column);
45+
return value.isNull() ? defaultValue : value.toInt() == 1;
46+
}
47+
}
48+
2149
// SQL schema as per documentation
2250
static const QString SCHEMA_SQL = R"(
2351
PRAGMA user_version = 1;
@@ -218,19 +246,19 @@ bool SqliteReader::readCaptureMetadata(int &captureId, QString &system, QString
218246
decoder = query.value("decoder").toString();
219247
gitBranch = query.value("git_branch").toString();
220248
gitCommit = query.value("git_commit").toString();
221-
videoSampleRate = query.value("video_sample_rate").toDouble();
222-
activeVideoStart = query.value("active_video_start").toInt();
223-
activeVideoEnd = query.value("active_video_end").toInt();
224-
fieldWidth = query.value("field_width").toInt();
225-
fieldHeight = query.value("field_height").toInt();
226-
numberOfSequentialFields = query.value("number_of_sequential_fields").toInt();
227-
colourBurstStart = query.value("colour_burst_start").toInt();
228-
colourBurstEnd = query.value("colour_burst_end").toInt();
229-
isMapped = query.value("is_mapped").toInt() == 1;
230-
isSubcarrierLocked = query.value("is_subcarrier_locked").toInt() == 1;
231-
isWidescreen = query.value("is_widescreen").toInt() == 1;
232-
white16bIre = query.value("white_16b_ire").toInt();
233-
black16bIre = query.value("black_16b_ire").toInt();
249+
videoSampleRate = SqliteValue::toDoubleOrDefault(query, "video_sample_rate");
250+
activeVideoStart = SqliteValue::toIntOrDefault(query, "active_video_start");
251+
activeVideoEnd = SqliteValue::toIntOrDefault(query, "active_video_end");
252+
fieldWidth = SqliteValue::toIntOrDefault(query, "field_width");
253+
fieldHeight = SqliteValue::toIntOrDefault(query, "field_height");
254+
numberOfSequentialFields = SqliteValue::toIntOrDefault(query, "number_of_sequential_fields");
255+
colourBurstStart = SqliteValue::toIntOrDefault(query, "colour_burst_start");
256+
colourBurstEnd = SqliteValue::toIntOrDefault(query, "colour_burst_end");
257+
isMapped = SqliteValue::toBoolOrDefault(query, "is_mapped");
258+
isSubcarrierLocked = SqliteValue::toBoolOrDefault(query, "is_subcarrier_locked");
259+
isWidescreen = SqliteValue::toBoolOrDefault(query, "is_widescreen");
260+
white16bIre = SqliteValue::toIntOrDefault(query, "white_16b_ire");
261+
black16bIre = SqliteValue::toIntOrDefault(query, "black_16b_ire");
234262
captureNotes = query.value("capture_notes").toString();
235263

236264
return true;
@@ -248,10 +276,10 @@ bool SqliteReader::readPcmAudioParameters(int captureId, int &bits, bool &isSign
248276
return false;
249277
}
250278

251-
bits = query.value("bits").toInt();
252-
isSigned = query.value("is_signed").toInt() == 1;
253-
isLittleEndian = query.value("is_little_endian").toInt() == 1;
254-
sampleRate = query.value("sample_rate").toDouble();
279+
bits = SqliteValue::toIntOrDefault(query, "bits");
280+
isSigned = SqliteValue::toBoolOrDefault(query, "is_signed");
281+
isLittleEndian = SqliteValue::toBoolOrDefault(query, "is_little_endian");
282+
sampleRate = SqliteValue::toDoubleOrDefault(query, "sample_rate");
255283

256284
return true;
257285
}

tools/library/tbc/sqliteio.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@
1818
#include <QVariant>
1919
#include <stdexcept>
2020

21+
namespace SqliteValue
22+
{
23+
int toIntOrDefault(const QSqlQuery &query, const char *column, int defaultValue = -1);
24+
qint64 toLongLongOrDefault(const QSqlQuery &query, const char *column, qint64 defaultValue = -1);
25+
double toDoubleOrDefault(const QSqlQuery &query, const char *column, double defaultValue = -1.0);
26+
bool toBoolOrDefault(const QSqlQuery &query, const char *column, bool defaultValue = false);
27+
}
28+
2129
class SqliteReader
2230
{
2331
public:

0 commit comments

Comments
 (0)