00001
00002 #include <algorithm>
00003
00004
00005 #include "mythlogging.h"
00006 #include "mythdb.h"
00007 #include "channelgroup.h"
00008
00009 #define LOC QString("Channel Group: ")
00010
00011 ChannelGroupItem& ChannelGroupItem::operator=(const ChannelGroupItem &other)
00012 {
00013 grpid = other.grpid;
00014 name = (other.name);
00015
00016 return *this;
00017 }
00018
00019 inline bool lt_group(const ChannelGroupItem &a, const ChannelGroupItem &b)
00020 {
00021 return QString::localeAwareCompare(a.name, b.name) < 0;
00022 }
00023
00024 bool ChannelGroup::ToggleChannel(uint chanid, int changrpid, int delete_chan)
00025 {
00026
00027 MSqlQuery query(MSqlQuery::InitCon());
00028 query.prepare(
00029 "SELECT channelgroup.id "
00030 "FROM channelgroup "
00031 "WHERE channelgroup.chanid = :CHANID AND "
00032 "channelgroup.grpid = :GRPID "
00033 "LIMIT 1");
00034 query.bindValue(":CHANID", chanid);
00035 query.bindValue(":GRPID", changrpid);
00036
00037 if (!query.exec())
00038 {
00039 MythDB::DBError("ChannelGroup::ToggleChannel", query);
00040 return false;
00041 }
00042 else if (query.next() && delete_chan)
00043 {
00044
00045 QString id = query.value(0).toString();
00046 query.prepare("DELETE FROM channelgroup WHERE id = :CHANID");
00047 query.bindValue(":CHANID", id);
00048 if (!query.exec())
00049 MythDB::DBError("ChannelGroup::ToggleChannel -- delete", query);
00050 LOG(VB_GENERAL, LOG_INFO, LOC +
00051 QString("Removing channel with id=%1.").arg(id));
00052 }
00053 else if (query.size() == 0)
00054 {
00055
00056 query.prepare("INSERT INTO channelgroup (chanid,grpid) "
00057 "VALUES (:CHANID, :GRPID)");
00058 query.bindValue(":CHANID", chanid);
00059 query.bindValue(":GRPID", changrpid);
00060 if (!query.exec())
00061 MythDB::DBError("ChannelGroup::ToggleChannel -- insert", query);
00062 LOG(VB_GENERAL, LOG_INFO, LOC +
00063 QString("Adding channel %1 to group %2.")
00064 .arg(chanid).arg(changrpid));
00065 }
00066
00067 return true;
00068 }
00069
00070 bool ChannelGroup::AddChannel(uint chanid, int changrpid)
00071 {
00072
00073 MSqlQuery query(MSqlQuery::InitCon());
00074 query.prepare(
00075 "SELECT channelgroup.id "
00076 "FROM channelgroup "
00077 "WHERE channelgroup.chanid = :CHANID AND "
00078 "channelgroup.grpid = :GRPID "
00079 "LIMIT 1");
00080 query.bindValue(":CHANID", chanid);
00081 query.bindValue(":GRPID", changrpid);
00082
00083 if (!query.exec())
00084 {
00085 MythDB::DBError("ChannelGroup::AddChannel", query);
00086 return false;
00087 }
00088 else if (query.size() == 0)
00089 {
00090
00091 query.prepare("INSERT INTO channelgroup (chanid,grpid) "
00092 "VALUES (:CHANID, :GRPID)");
00093 query.bindValue(":CHANID", chanid);
00094 query.bindValue(":GRPID", changrpid);
00095 if (!query.exec())
00096 MythDB::DBError("ChannelGroup::AddChannel -- insert", query);
00097 LOG(VB_GENERAL, LOG_INFO, LOC +
00098 QString("Adding channel %1 to group %2.")
00099 .arg(chanid).arg(changrpid));
00100 }
00101
00102 return true;
00103 }
00104
00105 bool ChannelGroup::DeleteChannel(uint chanid, int changrpid)
00106 {
00107
00108 MSqlQuery query(MSqlQuery::InitCon());
00109 query.prepare(
00110 "SELECT channelgroup.id "
00111 "FROM channelgroup "
00112 "WHERE channelgroup.chanid = :CHANID AND "
00113 "channelgroup.grpid = :GRPID "
00114 "LIMIT 1");
00115 query.bindValue(":CHANID", chanid);
00116 query.bindValue(":GRPID", changrpid);
00117
00118 if (!query.exec())
00119 {
00120 MythDB::DBError("ChannelGroup::DeleteChannel", query);
00121 return false;
00122 }
00123 else if (query.next())
00124 {
00125
00126 QString id = query.value(0).toString();
00127 query.prepare("DELETE FROM channelgroup WHERE id = :CHANID");
00128 query.bindValue(":CHANID", id);
00129 if (!query.exec())
00130 MythDB::DBError("ChannelGroup::DeleteChannel -- delete", query);
00131 LOG(VB_GENERAL, LOG_INFO, LOC +
00132 QString("Removing channel with id=%1.").arg(id));
00133 }
00134
00135 return true;
00136 }
00137
00138 ChannelGroupList ChannelGroup::GetChannelGroups(bool includeEmpty)
00139 {
00140 ChannelGroupList list;
00141
00142 MSqlQuery query(MSqlQuery::InitCon());
00143
00144 QString qstr;
00145
00146 if (includeEmpty)
00147 qstr = "SELECT grpid, name FROM channelgroupnames ORDER BY name";
00148 else
00149 qstr = "SELECT DISTINCT t1.grpid, name FROM channelgroupnames t1,channelgroup t2 "
00150 "WHERE t1.grpid = t2.grpid ORDER BY name";
00151
00152 query.prepare(qstr);
00153
00154 if (!query.exec())
00155 MythDB::DBError("ChannelGroup::GetChannelGroups", query);
00156 else
00157 {
00158 while (query.next())
00159 {
00160 ChannelGroupItem group(query.value(0).toUInt(),
00161 query.value(1).toString());
00162 list.push_back(group);
00163 }
00164 }
00165
00166 return list;
00167 }
00168
00169
00170
00171
00172 int ChannelGroup::GetNextChannelGroup(const ChannelGroupList &sorted, int grpid)
00173 {
00174
00175 if (sorted.empty())
00176 return -1;
00177
00178
00179 if (grpid == -1)
00180 return sorted[0].grpid;
00181
00182 ChannelGroupList::const_iterator it = find(sorted.begin(), sorted.end(), grpid);
00183
00184
00185 if (it == sorted.end())
00186 return -1;
00187
00188 ++it;
00189
00190
00191 if (it == sorted.end())
00192 return -1;
00193
00194 return it->grpid;
00195 }
00196
00197 QString ChannelGroup::GetChannelGroupName(int grpid)
00198 {
00199
00200 if (grpid == -1)
00201 return QObject::tr("All Channels");
00202
00203 MSqlQuery query(MSqlQuery::InitCon());
00204 query.prepare("SELECT name FROM channelgroupnames WHERE grpid = :GROUPID");
00205 query.bindValue(":GROUPID", grpid);
00206
00207 if (!query.exec())
00208 MythDB::DBError("ChannelGroup::GetChannelGroups", query);
00209 else if (query.next())
00210 return query.value(0).toString();
00211
00212 return "";
00213 }
00214
00215 int ChannelGroup::GetChannelGroupId(QString changroupname)
00216 {
00217
00218 if (changroupname == "All Channels")
00219 return -1;
00220
00221 MSqlQuery query(MSqlQuery::InitCon());
00222
00223 query.prepare("SELECT grpid FROM channelgroupnames "
00224 "WHERE name = :GROUPNAME");
00225 query.bindValue(":GROUPNAME", changroupname);
00226
00227 if (!query.exec())
00228 MythDB::DBError("ChannelGroup::GetChannelGroups", query);
00229 else if (query.next())
00230 return query.value(0).toUInt();
00231
00232 return 0;
00233 }