12#define LOC QString("Channel Group: ")
16 return QString::localeAwareCompare(a.
m_name, b.
m_name) < 0;
24 "SELECT channelgroup.id "
26 "WHERE channelgroup.chanid = :CHANID AND "
27 "channelgroup.grpid = :GRPID "
37 if (query.
next() && delete_chan)
40 QString
id = query.
value(0).toString();
41 query.
prepare(
"DELETE FROM channelgroup WHERE id = :CHANID");
45 LOG(VB_GENERAL, LOG_INFO,
LOC +
46 QString(
"Removing channel %1 from group %2.").arg(
id).arg(changrpid));
48 else if (query.
size() == 0)
51 query.
prepare(
"INSERT INTO channelgroup (chanid,grpid) "
52 "VALUES (:CHANID, :GRPID)");
57 LOG(VB_GENERAL, LOG_INFO,
LOC +
58 QString(
"Adding channel %1 to group %2.")
59 .arg(chanid).arg(changrpid));
63 LOG(VB_GENERAL, LOG_INFO,
LOC +
64 QString(
"Channel %1 already present in group %2.")
65 .arg(chanid).arg(changrpid));
76 "SELECT grpid, name FROM channelgroupnames "
77 "WHERE grpid = :GRPID");
85 if (query.
size() == 0)
87 LOG(VB_GENERAL, LOG_INFO,
LOC +
88 QString(
"AddChannel failed to find channel group %1.").arg(changrpid));
93 QString groupName = query.
value(1).toString();
97 "SELECT chanid, name FROM channel "
98 "WHERE chanid = :CHANID "
100 "AND deleted IS NULL");
108 if (query.
size() == 0)
110 LOG(VB_GENERAL, LOG_INFO,
LOC +
111 QString(
"AddChannel failed to find channel %1.").arg(chanid));
116 QString chanName = query.
value(1).toString();
120 "SELECT channelgroup.id "
122 "WHERE channelgroup.chanid = :CHANID AND "
123 "channelgroup.grpid = :GRPID "
133 if (query.
size() == 0)
136 query.
prepare(
"INSERT INTO channelgroup (chanid,grpid) "
137 "VALUES (:CHANID, :GRPID)");
142 LOG(VB_GENERAL, LOG_INFO,
LOC +
143 QString(
"Adding channel %1 to group %2.")
144 .arg(chanName, groupName));
155 "SELECT channelgroup.id "
157 "WHERE channelgroup.chanid = :CHANID AND "
158 "channelgroup.grpid = :GRPID "
171 QString
id = query.
value(0).toString();
172 query.
prepare(
"DELETE FROM channelgroup WHERE id = :CHANID");
176 LOG(VB_GENERAL, LOG_INFO,
LOC +
177 QString(
"Removing channel with id=%1.").arg(
id));
198 qstr =
"SELECT grpid, name FROM channelgroupnames"
203 qstr =
"SELECT DISTINCT t1.grpid, name FROM channelgroupnames t1, channelgroup t2"
204 " WHERE t1.grpid = t2.grpid"
217 query.
value(1).toString());
218 list.push_back(group);
225 qstr =
"SELECT grpid, name FROM channelgroupnames"
226 " WHERE name NOT IN (SELECT name FROM videosource)"
227 " AND name <> 'Priority' "
233 qstr =
"SELECT DISTINCT t1.grpid, name FROM channelgroupnames t1, channelgroup t2"
234 " WHERE t1.grpid = t2.grpid"
235 " AND name NOT IN (SELECT name FROM videosource)"
236 " AND name <> 'Priority' "
250 query.
value(1).toString());
251 list.push_back(group);
273 qstr =
"SELECT grpid, name FROM channelgroupnames"
274 " WHERE name = 'Priority'";
278 qstr =
"SELECT DISTINCT t1.grpid, name FROM channelgroupnames t1, channelgroup t2"
279 " WHERE t1.grpid = t2.grpid "
280 " AND name = 'Priority'";
292 query.
value(1).toString());
293 list.push_back(group);
300 qstr =
"SELECT grpid, name FROM channelgroupnames"
301 " WHERE name IN (SELECT name FROM videosource)"
306 qstr =
"SELECT DISTINCT t1.grpid, name FROM channelgroupnames t1, channelgroup t2"
307 " WHERE t1.grpid = t2.grpid"
308 " AND name IN (SELECT name FROM videosource)"
321 query.
value(1).toString());
322 list.push_back(group);
340 list.insert(list.end(), more.begin(), more.end());
354 return sorted[0].m_grpId;
359 if (it == sorted.end())
365 if (it == sorted.end())
374 return it != groupList.end();
386 return tr(
"All Channels");
393 query.
prepare(
"SELECT name FROM channelgroupnames WHERE grpid = :GROUPID");
398 else if (query.
next())
399 return query.
value(0).toString();
407 if (changroupname ==
"All Channels")
412 query.
prepare(
"SELECT grpid FROM channelgroupnames "
413 "WHERE name = :GROUPNAME");
414 query.
bindValue(
":GROUPNAME", changroupname);
418 else if (query.
next())
419 return query.
value(0).toUInt();
429 LOG(VB_GENERAL, LOG_INFO, QString(
"Add channelgroup %1").arg(groupName));
432 query.
prepare(
"INSERT INTO channelgroupnames (name) VALUE (:NEWNAME);");
448 LOG(VB_GENERAL, LOG_INFO, QString(
"Remove channels of channelgroup %1").arg(groupName));
451 query.
prepare(
"DELETE FROM channelgroup WHERE grpid = :GRPID;");
458 LOG(VB_GENERAL, LOG_INFO, QString(
"Remove channelgroup %1").arg(groupName));
459 query.
prepare(
"DELETE FROM channelgroupnames WHERE grpid = :GRPID;");
467 LOG(VB_GENERAL, LOG_DEBUG, QString(
"Channelgroup %1 not found").arg(groupName));
481 QString qstr =
"UPDATE channelgroupnames set name = :NEWNAME "
482 " WHERE name = :OLDNAME ;";
504 QMap<int, QString> allSources;
505 QMap<int, QString> connectedSources;
506 QMap<int, QString> disconnectedSources;
508 LOG(VB_GENERAL, LOG_INFO, QString(
"Running UpdateChannelGroups"));
513 query.
prepare(
"SELECT sourceid,name FROM videosource;");
517 allSources[query.
value(0).toInt()] = query.
value(1).toString();
527 for (
auto it = allSources.cbegin(); it != allSources.cend(); ++it)
529 uint sourceId = it.key();
532 connectedSources[sourceId] = allSources[sourceId];
534 disconnectedSources[sourceId] = allSources[sourceId];
539 QMap<int, QString> removeSources = disconnectedSources;
540 if (connectedSources.size() == 1)
542 auto it = connectedSources.cbegin();
543 uint sourceid = it.key();
544 removeSources[sourceid] = *it;
548 for (
const auto &sourceName : std::as_const(removeSources))
558 for (
const auto &chgrp : list)
561 "DELETE from channelgroup WHERE grpid = :GRPID"
562 " AND chanid NOT IN "
563 " (SELECT chanid FROM channel WHERE deleted IS NULL AND visible > 0)");
564 query.
bindValue(
":GRPID", chgrp.m_grpId);
572 LOG(VB_GENERAL, LOG_INFO, QString(
"Removed %1 channels from channelgroup %2")
580 if (connectedSources.size() > 1)
583 for (
const auto &sourceName : std::as_const(connectedSources))
589 for (
auto it = connectedSources.cbegin(); it != connectedSources.cend(); ++it)
591 uint sourceId = it.key();
592 QString sourceName = connectedSources[sourceId];
597 LOG(VB_GENERAL, LOG_INFO, QString(
"Update channelgroup %1").arg(sourceName));
600 "SELECT chanid FROM channel "
601 "WHERE sourceid = :SOURCEID "
602 "AND deleted IS NULL "
622 uint numPrioChannels = 0;
623 for (
auto it = connectedSources.cbegin(); it != connectedSources.cend(); ++it)
625 uint sourceId = it.key();
628 "SELECT count(*) FROM channel "
629 "WHERE sourceid = :SOURCEID "
630 "AND deleted IS NULL "
632 "AND recpriority > 0");
636 MythDB::DBError(
"UpdateChannelGroups Priority select channels", query);
641 numPrioChannels += query.
value(0).toUInt();
644 LOG(VB_GENERAL, LOG_INFO, QString(
"Found %1 priority channels").arg(numPrioChannels));
646 if (numPrioChannels > 0)
649 QString groupName =
"Priority";
651 LOG(VB_GENERAL, LOG_INFO, QString(
"Update channelgroup %1").arg(groupName));
660 "DELETE from channelgroup WHERE grpid = :GRPID "
661 " AND chanid NOT IN "
662 " (SELECT chanid FROM channel "
663 " WHERE deleted IS NULL "
665 " AND recpriority > 0)");
674 LOG(VB_GENERAL, LOG_INFO, QString(
"Removed %1 channels from channelgroup Priority")
679 for (
auto it = connectedSources.cbegin(); it != connectedSources.cend(); ++it)
681 uint sourceId = it.key();
683 "SELECT chanid FROM channel "
684 "WHERE sourceid = :SOURCEID "
685 "AND deleted IS NULL "
687 "AND recpriority > 0");
691 MythDB::DBError(
"UpdateChannelGroups Priority select channels", query);
bool lt_group(const ChannelGroupItem &a, const ChannelGroupItem &b)
std::vector< ChannelGroupItem > ChannelGroupList
static bool NotInChannelGroupList(const ChannelGroupList &groupList, int grpid)
static bool InChannelGroupList(const ChannelGroupList &groupList, int grpid)
static ChannelGroupList GetAutomaticChannelGroups(bool includeEmpty=true)
static bool RemoveChannelGroup(const QString &groupName)
static QString GetChannelGroupName(int grpid)
static void UpdateChannelGroups(void)
static bool AddChannel(uint chanid, int changrpid)
static int GetNextChannelGroup(const ChannelGroupList &sorted, int grpid)
static ChannelGroupList GetChannelGroups(bool includeEmpty=true)
static bool DeleteChannel(uint chanid, int changrpid)
static bool ToggleChannel(uint chanid, int changrpid, bool delete_chan)
static ChannelGroupList GetManualChannelGroups(bool includeEmpty=true)
static int GetChannelGroupId(const QString &changroupname)
static int AddChannelGroup(const QString &groupName)
static bool UpdateChannelGroup(const QString &oldName, const QString &newName)
QSqlQuery wrapper that fetches a DB connection from the connection pool.
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
bool first(void)
Wrap QSqlQuery::first() so we can display the query results.
QVariant value(int i) const
int numRowsAffected() const
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
QVariant lastInsertId()
Return the id of the last inserted row.
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
static void DBError(const QString &where, const MSqlQuery &query)
static uint GetConnectionCount(uint sourceid)
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)