Opened 9 months ago

Closed 9 months ago

Last modified 8 months ago

#13420 closed Patch - Bug Fix (fixed)

DB Error in mythtv-setup and QString initialization

Reported by: Klaas de Waal Owned by: David Hampton
Priority: minor Milestone: 31.0
Component: MythTV - Channel Scanner Version: Master Head
Severity: medium Keywords: DVB channelscan QString initialization
Cc: Stuart Auchterlonie, David Hampton Ticket locked: no

Description

A channelscan with mythtv-setup gives the following error messages, one for each channel:

DB Error (MSqlQuery):
Query was:
INSERT INTO channelscan_channel  (  scanid,             transportid,                                mplex_id,           source_id,          channel_id,             callsign,           service_name,       chan_num,               service_id,         atsc_major_channel, atsc_minor_channel,     use_on_air_guide,   hidden,             hidden_in_guide,        freqid,             icon,               tvformat,               xmltvid,            pat_tsid,           vct_tsid,               vct_chan_tsid,      sdt_tsid,           orig_netid,             netid,              si_standard,        in_channels_conf,       in_pat,             in_pmt,             in_vct,                 in_nit,             in_sdt,             is_encrypted,           is_data_service,    is_audio_service,   is_opencable,           could_be_opencable, decryption_status,  default_authority    )  VALUES  ( ?,            ?,                               ?,          ?,         ?,            ?,          ?,      ?,              ?,        ?,?,    ?,  ?,            ?,       ?,            ?,              ?,              ?,           ?,          ?,              ?,     ?,          ?,            ?,             ?,       ?,      ?,            ?,            ?,                ?,            ?,            ?,          ?,   ?,  ?,          ?,?, ?    );
Bindings were:
:ATSC_MAJOR_CHANNEL=0, :ATSC_MINOR_CHANNEL=0, :CALLSIGN="Penthouse HD1",
:CHANNEL_ID=0, :CHAN_NUM="792", :COULD_BE_OPENCABLE=false, :DECRYPTION_STATUS=2,
:DEFAULT_AUTHORITY=NULL, :FREQID="", :HIDDEN=false, :HIDDEN_IN_GUIDE=false,
:ICON=NULL, :IN_CHANNELS_CONF=false, :IN_NIT=true, :IN_PAT=true, :IN_PMT=true,
:IN_SDT=true, :IN_VCT=false, :IS_AUDIO_SERVICE=false, :IS_DATA_SERVICE=false,
:IS_ENCRYPTED=true, :IS_OPEBCABLE=false, :MPLEX_ID=43, :NETID=5555,
:ORIG_NETID=1536, :PAT
2019-03-03 21:20:13.973048 E  Original query failed, but resend with empty strings in place of NULL strings worked.

This message is caused by database access with QString variables which are NULL. There is an error catching mechanism present that replaces each NULL strings with an empty string. The last line in the message above states that this is done and that then the database access succeeded.

This problem is caused by the recent change to move initialization to the header files. This in itself should and does not make any difference, however, the initializations for the QString members of ChannelInsertInfo? in channelinfo.cpp/.h have been lost in this process.

This can be found in the following commit:
https://github.com/MythTV/mythtv/commit/4d5526816f5c5d5ddbf52f960b597afbf5b31fea#diff-0500d09455f90efc1704bfbb28b33aab

The obvious solution is to restore the initialization of ChannelInsertinfo?.

A patch for this is attached.

Attachments (1)

20190303-channelinsertinfo-init.patch (1.5 KB) - added by Klaas de Waal 9 months ago.
Restore initialization of QString members of ChannelInsertInfo?

Download all attachments as: .zip

Change History (8)

Changed 9 months ago by Klaas de Waal

Restore initialization of QString members of ChannelInsertInfo?

comment:1 Changed 9 months ago by Klaas de Waal

Owner: set to David Hampton
Status: newassigned

comment:2 Changed 9 months ago by David Hampton <mythtv@…>

Resolution: fixed
Status: assignedclosed

In fcc1aa522/mythtv:

Catch and fix uninitialized QStrings passed to SQL code.

Most of Qt5 treats an uninitialized string and an empty string as the
same thing. QSqlQuery doesn't, storing NULL for the former and "" for
the latter. Add a new function for storing a non-null database field
that will store both of these QStrings as "".

Fixes #13420

comment:3 Changed 9 months ago by jpilk

Line 355 in channelinfo.cpp looks like a preexisting typo ?

query.bindValue(":IS_OPEBCABLE", m_is_opencable);

comment:4 Changed 9 months ago by David Hampton

Yes, but a consistent typo (the same in two places) so it worked properly. :-)

comment:5 Changed 9 months ago by David Hampton <mythtv@…>

In 19a51cb405/mythtv:

Catch and fix uninitialized QStrings passed to SQL code.

Most of Qt5 treats an uninitialized string and an empty string as the
same thing. QSqlQuery doesn't, storing NULL for the former and "" for
the latter. Add a new function for storing a non-null database field
that will store both of these QStrings as "".

Fixes #13420

comment:6 Changed 9 months ago by Stuart Auchterlonie

Milestone: needs_triage31.0

comment:7 Changed 8 months ago by Klaas de Waal <kdewaal@…>

In 28e98a80ed/mythtv:

More use of bindValueNoNull to fix DB error messages about null values.

Use the bindValueNoNull for all QString variables that are used for
database access in ChannelUtil::CreateChannel? and ChannelUtil::UpdateChannel?.
Remove existing code to check for null because bindValueNoNull is now used.

Refs #13420

Note: See TracTickets for help on using tickets.