Merge pull request #3874 from xhaggi/pvr-database
authorSascha Woo <sascha.woo@gmail.com>
Sat, 4 Jan 2014 21:15:54 +0000 (13:15 -0800)
committerSascha Woo <sascha.woo@gmail.com>
Sat, 4 Jan 2014 21:15:54 +0000 (13:15 -0800)
[db] improve/remove of pvr related database methods

xbmc/addons/AddonDatabase.cpp
xbmc/dbwrappers/Database.cpp
xbmc/dbwrappers/Database.h
xbmc/epg/EpgDatabase.cpp
xbmc/pvr/PVRDatabase.cpp

index 87ceb47..75e80c1 100644 (file)
@@ -788,7 +788,7 @@ bool CAddonDatabase::GetPackageHash(const CStdString& addonID,
                                     const CStdString& packageFileName,
                                     CStdString&       hash)
 {
-  CStdString where = FormatSQL( "addonID='%s' and filename='%s'",
+  CStdString where = PrepareSQL("addonID='%s' and filename='%s'",
                                 addonID.c_str(), packageFileName.c_str());
   hash = GetSingleValue("package", "hash", where);
   return !hash.empty();
index 9bcf633..8128435 100644 (file)
@@ -135,30 +135,6 @@ uint32_t CDatabase::ComputeCRC(const CStdString &text)
   return crc;
 }
 
-
-CStdString CDatabase::FormatSQL(CStdString strStmt, ...)
-{
-  //  %q is the sqlite format string for %s.
-  //  Any bad character, like "'", will be replaced with a proper one
-  StringUtils::Replace(strStmt, "%s", "%q");
-  //  the %I64 enhancement is not supported by sqlite3_vmprintf
-  //  must be %ll instead
-  StringUtils::Replace(strStmt, "%I64", "%ll");
-
-  va_list args;
-  va_start(args, strStmt);
-  char *szSql = sqlite3_vmprintf(strStmt.c_str(), args);
-  va_end(args);
-
-  CStdString strResult;
-  if (szSql) {
-    strResult = szSql;
-    sqlite3_free(szSql);
-  }
-
-  return strResult;
-}
-
 CStdString CDatabase::PrepareSQL(CStdString strStmt, ...) const
 {
   CStdString strResult = "";
@@ -210,19 +186,11 @@ CStdString CDatabase::GetSingleValue(const CStdString &query)
   return GetSingleValue(query, m_pDS);
 }
 
-bool CDatabase::DeleteValues(const CStdString &strTable, const CStdString &strWhereClause /* = CStdString() */)
+bool CDatabase::DeleteValues(const CStdString &strTable, const Filter &filter /* = Filter() */)
 {
-  bool bReturn = true;
-
-  CStdString strQueryBase = "DELETE FROM %s";
-  if (!strWhereClause.empty())
-    strQueryBase += StringUtils::Format(" WHERE %s", strWhereClause.c_str());
-
-  CStdString strQuery = FormatSQL(strQueryBase, strTable.c_str());
-
-  bReturn = ExecuteQuery(strQuery);
-
-  return bReturn;
+  CStdString strQuery;
+  BuildSQL(PrepareSQL("DELETE FROM %s ", strTable.c_str()), filter, strQuery);
+  return ExecuteQuery(strQuery);
 }
 
 bool CDatabase::ExecuteQuery(const CStdString &strQuery)
index ec9f0ea..9dbe4e7 100644 (file)
@@ -71,7 +71,6 @@ public:
   void RollbackTransaction();
   bool InTransaction();
 
-  static CStdString FormatSQL(CStdString strStmt, ...);
   CStdString PrepareSQL(CStdString strStmt, ...) const;
 
   /*!
@@ -95,12 +94,11 @@ public:
 
   /*!
    * @brief Delete values from a table.
-   * @remarks The value of the strWhereClause parameter has to be FormatSQL'ed when used.
    * @param strTable The table to delete the values from.
-   * @param strWhereClause If set, use this WHERE clause.
+   * @param filter The Filter to apply to this query.
    * @return True if the query was executed successfully, false otherwise.
    */
-  bool DeleteValues(const CStdString &strTable, const CStdString &strWhereClause = CStdString());
+  bool DeleteValues(const CStdString &strTable, const Filter &filter = Filter());
 
   /*!
    * @brief Execute a query that does not return any result.
index eaa4605..91699a0 100644 (file)
@@ -170,10 +170,10 @@ bool CEpgDatabase::Delete(const CEpg &table)
     return false;
   }
 
-  CStdString strWhereClause;
-  strWhereClause = FormatSQL("idEpg = %u", table.EpgID());
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("idEpg = %u", table.EpgID()));
 
-  return DeleteValues("epg", strWhereClause);
+  return DeleteValues("epg", filter);
 }
 
 bool CEpgDatabase::DeleteOldEpgEntries(void)
@@ -183,9 +183,10 @@ bool CEpgDatabase::DeleteOldEpgEntries(void)
       CDateTimeSpan(0, g_advancedSettings.m_iEpgLingerTime / 60, g_advancedSettings.m_iEpgLingerTime % 60, 0);
   cleanupTime.GetAsTime(iCleanupTime);
 
-  CStdString strWhereClause = FormatSQL("iEndTime < %u", iCleanupTime);
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("iEndTime < %u", iCleanupTime));
 
-  return DeleteValues("epgtags", strWhereClause);
+  return DeleteValues("epgtags", filter);
 }
 
 bool CEpgDatabase::Delete(const CEpgInfoTag &tag)
@@ -194,16 +195,17 @@ bool CEpgDatabase::Delete(const CEpgInfoTag &tag)
   if (tag.BroadcastId() <= 0)
     return false;
 
-  CStdString strWhereClause = FormatSQL("idBroadcast = %u", tag.BroadcastId());
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("idBroadcast = %u", tag.BroadcastId()));
 
-  return DeleteValues("epgtags", strWhereClause);
+  return DeleteValues("epgtags", filter);
 }
 
 int CEpgDatabase::Get(CEpgContainer &container)
 {
   int iReturn(-1);
 
-  CStdString strQuery = FormatSQL("SELECT idEpg, sName, sScraperName FROM epg;");
+  CStdString strQuery = PrepareSQL("SELECT idEpg, sName, sScraperName FROM epg;");
   if (ResultQuery(strQuery))
   {
     iReturn = 0;
@@ -235,7 +237,7 @@ int CEpgDatabase::Get(CEpg &epg)
 {
   int iReturn(-1);
 
-  CStdString strQuery = FormatSQL("SELECT * FROM epgtags WHERE idEpg = %u;", epg.EpgID());
+  CStdString strQuery = PrepareSQL("SELECT * FROM epgtags WHERE idEpg = %u;", epg.EpgID());
   if (ResultQuery(strQuery))
   {
     iReturn = 0;
@@ -292,7 +294,7 @@ int CEpgDatabase::Get(CEpg &epg)
 bool CEpgDatabase::GetLastEpgScanTime(int iEpgId, CDateTime *lastScan)
 {
   bool bReturn = false;
-  CStdString strWhereClause = FormatSQL("idEpg = %u", iEpgId);
+  CStdString strWhereClause = PrepareSQL("idEpg = %u", iEpgId);
   CStdString strValue = GetSingleValue("lastepgscan", "sLastScan", strWhereClause);
 
   if (!strValue.empty())
@@ -310,7 +312,7 @@ bool CEpgDatabase::GetLastEpgScanTime(int iEpgId, CDateTime *lastScan)
 
 bool CEpgDatabase::PersistLastEpgScanTime(int iEpgId /* = 0 */, bool bQueueWrite /* = false */)
 {
-  CStdString strQuery = FormatSQL("REPLACE INTO lastepgscan(idEpg, sLastScan) VALUES (%u, '%s');",
+  CStdString strQuery = PrepareSQL("REPLACE INTO lastepgscan(idEpg, sLastScan) VALUES (%u, '%s');",
       iEpgId, CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsDBDateTime().c_str());
 
   return bQueueWrite ? QueueInsertQuery(strQuery) : ExecuteQuery(strQuery);
@@ -334,10 +336,10 @@ int CEpgDatabase::Persist(const CEpg &epg, bool bQueueWrite /* = false */)
 
   CStdString strQuery;
   if (epg.EpgID() > 0)
-    strQuery = FormatSQL("REPLACE INTO epg (idEpg, sName, sScraperName) "
+    strQuery = PrepareSQL("REPLACE INTO epg (idEpg, sName, sScraperName) "
         "VALUES (%u, '%s', '%s');", epg.EpgID(), epg.Name().c_str(), epg.ScraperName().c_str());
   else
-    strQuery = FormatSQL("INSERT INTO epg (sName, sScraperName) "
+    strQuery = PrepareSQL("INSERT INTO epg (sName, sScraperName) "
         "VALUES ('%s', '%s');", epg.Name().c_str(), epg.ScraperName().c_str());
 
   if (bQueueWrite)
@@ -377,7 +379,7 @@ int CEpgDatabase::Persist(const CEpgInfoTag &tag, bool bSingleUpdate /* = true *
 
   if (iBroadcastId < 0)
   {
-    strQuery = FormatSQL("REPLACE INTO epgtags (idEpg, iStartTime, "
+    strQuery = PrepareSQL("REPLACE INTO epgtags (idEpg, iStartTime, "
         "iEndTime, sTitle, sPlotOutline, sPlot, iGenreType, iGenreSubType, sGenre, "
         "iFirstAired, iParentalRating, iStarRating, bNotify, iSeriesId, "
         "iEpisodeId, iEpisodePart, sEpisodeName, iBroadcastUid) "
@@ -390,7 +392,7 @@ int CEpgDatabase::Persist(const CEpgInfoTag &tag, bool bSingleUpdate /* = true *
   }
   else
   {
-    strQuery = FormatSQL("REPLACE INTO epgtags (idEpg, iStartTime, "
+    strQuery = PrepareSQL("REPLACE INTO epgtags (idEpg, iStartTime, "
         "iEndTime, sTitle, sPlotOutline, sPlot, iGenreType, iGenreSubType, sGenre, "
         "iFirstAired, iParentalRating, iStarRating, bNotify, iSeriesId, "
         "iEpisodeId, iEpisodePart, sEpisodeName, iBroadcastUid, idBroadcast) "
@@ -418,7 +420,7 @@ int CEpgDatabase::Persist(const CEpgInfoTag &tag, bool bSingleUpdate /* = true *
 
 int CEpgDatabase::GetLastEPGId(void)
 {
-  CStdString strQuery = FormatSQL("SELECT MAX(idEpg) FROM epg");
+  CStdString strQuery = PrepareSQL("SELECT MAX(idEpg) FROM epg");
   CStdString strValue = GetSingleValue(strQuery);
   if (!strValue.empty())
     return atoi(strValue.c_str());
index 786dfa1..04b17e8 100644 (file)
@@ -284,13 +284,14 @@ int CPVRDatabase::GetLastChannelId(void)
 {
   int iReturn(0);
 
-  CStdString strQuery = FormatSQL("SELECT MAX(idChannel) as iMaxChannel FROM channels");
+  CStdString strQuery = PrepareSQL("SELECT MAX(idChannel) as iMaxChannel FROM channels");
   if (ResultQuery(strQuery))
   {
     try
     {
       if (!m_pDS->eof())
         iReturn = m_pDS->fv("iMaxChannel").get_asInt();
+      m_pDS->close();
     }
     catch (...) {}
   }
@@ -316,8 +317,11 @@ bool CPVRDatabase::DeleteClientChannels(const CPVRClient &client)
   }
 
   CLog::Log(LOGDEBUG, "PVR - %s - deleting all channels from client '%i' from the database", __FUNCTION__, client.GetID());
-  CStdString strWhereClause = FormatSQL("iClientId = %u", client.GetID());
-  return DeleteValues("channels", strWhereClause);
+
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("iClientId = %u", client.GetID()));
+
+  return DeleteValues("channels", filter);
 }
 
 bool CPVRDatabase::Delete(const CPVRChannel &channel)
@@ -327,15 +331,18 @@ bool CPVRDatabase::Delete(const CPVRChannel &channel)
     return false;
 
   CLog::Log(LOGDEBUG, "PVR - %s - deleting channel '%s' from the database", __FUNCTION__, channel.ChannelName().c_str());
-  CStdString strWhereClause = FormatSQL("idChannel = %u", channel.ChannelID());
-  return DeleteValues("channels", strWhereClause);
+
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("idChannel = %u", channel.ChannelID()));
+
+  return DeleteValues("channels", filter);
 }
 
 int CPVRDatabase::Get(CPVRChannelGroupInternal &results)
 {
   int iReturn(0);
 
-  CStdString strQuery = FormatSQL("SELECT channels.idChannel, channels.iUniqueId, channels.bIsRadio, channels.bIsHidden, channels.bIsUserSetIcon, "
+  CStdString strQuery = PrepareSQL("SELECT channels.idChannel, channels.iUniqueId, channels.bIsRadio, channels.bIsHidden, channels.bIsUserSetIcon, "
       "channels.sIconPath, channels.sChannelName, channels.bIsVirtual, channels.bEPGEnabled, channels.sEPGScraper, channels.iLastWatched, channels.iClientId, channels.bIsLocked, "
       "channels.iClientChannelNumber, channels.sInputFormat, channels.sInputFormat, channels.sStreamURL, channels.iEncryptionSystem, map_channelgroups_channels.iChannelNumber, channels.idEpg "
       "FROM map_channelgroups_channels "
@@ -411,8 +418,10 @@ bool CPVRDatabase::DeleteChannelSettings(const CPVRChannel &channel)
     return bReturn;
   }
 
-  CStdString strWhereClause = FormatSQL("idChannel = %u", channel.ChannelID());
-  return DeleteValues("channelsettings", strWhereClause);
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("idChannel = %u", channel.ChannelID()));
+
+  return DeleteValues("channelsettings", filter);
 }
 
 bool CPVRDatabase::GetChannelSettings(const CPVRChannel &channel, CVideoSettings &settings)
@@ -426,7 +435,7 @@ bool CPVRDatabase::GetChannelSettings(const CPVRChannel &channel, CVideoSettings
     return bReturn;
   }
 
-  CStdString strQuery = FormatSQL("SELECT * FROM channelsettings WHERE idChannel = %u;", channel.ChannelID());
+  CStdString strQuery = PrepareSQL("SELECT * FROM channelsettings WHERE idChannel = %u;", channel.ChannelID());
 
   if (ResultQuery(strQuery))
   {
@@ -488,7 +497,7 @@ bool CPVRDatabase::PersistChannelSettings(const CPVRChannel &channel, const CVid
     return false;
   }
 
-  CStdString strQuery = FormatSQL(
+  CStdString strQuery = PrepareSQL(
       "REPLACE INTO channelsettings "
         "(idChannel, iInterlaceMethod, iViewMode, fCustomZoomAmount, fPixelRatio, iAudioStream, iSubtitleStream, fSubtitleDelay, "
          "bSubtitles, fBrightness, fContrast, fGamma, fVolumeAmplification, fAudioDelay, bOutputToAllSpeakers, bCrop, iCropLeft, "
@@ -508,8 +517,10 @@ bool CPVRDatabase::PersistChannelSettings(const CPVRChannel &channel, const CVid
 
 bool CPVRDatabase::RemoveChannelsFromGroup(const CPVRChannelGroup &group)
 {
-  CStdString strWhereClause = FormatSQL("idGroup = %u", group.GroupID());
-  return DeleteValues("map_channelgroups_channels", strWhereClause);
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID()));
+
+  return DeleteValues("map_channelgroups_channels", filter);
 }
 
 bool CPVRDatabase::GetCurrentGroupMembers(const CPVRChannelGroup &group, vector<int> &members)
@@ -522,7 +533,7 @@ bool CPVRDatabase::GetCurrentGroupMembers(const CPVRChannelGroup &group, vector<
     return false;
   }
 
-  CStdString strCurrentMembersQuery = FormatSQL("SELECT idChannel FROM map_channelgroups_channels WHERE idGroup = %u", group.GroupID());
+  CStdString strCurrentMembersQuery = PrepareSQL("SELECT idChannel FROM map_channelgroups_channels WHERE idGroup = %u", group.GroupID());
   if (ResultQuery(strCurrentMembersQuery))
   {
     try
@@ -557,9 +568,10 @@ bool CPVRDatabase::DeleteChannelsFromGroup(const CPVRChannelGroup &group)
     return false;
   }
 
-  CStdString strWhereClause;
-  strWhereClause = FormatSQL("idGroup = %u", group.GroupID());
-  return DeleteValues("map_channelgroups_channels", strWhereClause);
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID()));
+
+  return DeleteValues("map_channelgroups_channels", filter);
 }
 
 bool CPVRDatabase::DeleteChannelsFromGroup(const CPVRChannelGroup &group, const vector<int> &channelsToDelete)
@@ -576,7 +588,6 @@ bool CPVRDatabase::DeleteChannelsFromGroup(const CPVRChannelGroup &group, const
   while (iDeletedChannels < channelsToDelete.size())
   {
     CStdString strChannelsToDelete;
-    CStdString strWhereClause;
 
     for (unsigned int iChannelPtr = 0; iChannelPtr + iDeletedChannels < channelsToDelete.size() && iChannelPtr < 50; iChannelPtr++)
       strChannelsToDelete += StringUtils::Format(", %d", channelsToDelete.at(iDeletedChannels + iChannelPtr));
@@ -584,8 +595,12 @@ bool CPVRDatabase::DeleteChannelsFromGroup(const CPVRChannelGroup &group, const
     if (!strChannelsToDelete.empty())
     {
       strChannelsToDelete.erase(0, 2);
-      strWhereClause = FormatSQL("idGroup = %u AND idChannel IN (%s)", group.GroupID(), strChannelsToDelete.c_str());
-      bDelete = DeleteValues("map_channelgroups_channels", strWhereClause) && bDelete;
+
+      Filter filter;
+      filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID()));
+      filter.AppendWhere(PrepareSQL("AND idChannel IN (%s)", strChannelsToDelete.c_str()));
+
+      bDelete = DeleteValues("map_channelgroups_channels", filter) && bDelete;
     }
 
     iDeletedChannels += 50;
@@ -612,13 +627,15 @@ bool CPVRDatabase::RemoveStaleChannelsFromGroup(const CPVRChannelGroup &group)
     // mysql doesn't support subqueries when deleting and sqlite doesn't support joins when deleting
     if (g_advancedSettings.m_databaseTV.type.Equals("mysql"))
     {
-      CStdString strQuery = FormatSQL("DELETE m FROM map_channelgroups_channels m LEFT JOIN channels c ON (c.idChannel = m.idChannel) WHERE c.idChannel IS NULL");
+      CStdString strQuery = PrepareSQL("DELETE m FROM map_channelgroups_channels m LEFT JOIN channels c ON (c.idChannel = m.idChannel) WHERE c.idChannel IS NULL");
       bDelete = ExecuteQuery(strQuery);
     }
     else
     {
-      CStdString strWhereClause = FormatSQL("idChannel IN (SELECT m.idChannel FROM map_channelgroups_channels m LEFT JOIN channels on m.idChannel = channels.idChannel WHERE channels.idChannel IS NULL)");
-      bDelete = DeleteValues("map_channelgroups_channels", strWhereClause);
+      Filter filter;
+      filter.AppendWhere("idChannel IN (SELECT m.idChannel FROM map_channelgroups_channels m LEFT JOIN channels on m.idChannel = channels.idChannel WHERE channels.idChannel IS NULL)");
+
+      bDelete = DeleteValues("map_channelgroups_channels", filter);
     }
   }
 
@@ -639,8 +656,10 @@ bool CPVRDatabase::RemoveStaleChannelsFromGroup(const CPVRChannelGroup &group)
   }
   else
   {
-    CStdString strWhereClause = FormatSQL("idGroup = %u", group.GroupID());
-    bDelete = DeleteValues("map_channelgroups_channels", strWhereClause) && bDelete;
+    Filter filter;
+    filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID()));
+
+    bDelete = DeleteValues("map_channelgroups_channels", filter) && bDelete;
   }
 
   return bDelete;
@@ -663,15 +682,18 @@ bool CPVRDatabase::Delete(const CPVRChannelGroup &group)
     return false;
   }
 
-  CStdString strWhereClause = FormatSQL("idGroup = %u AND bIsRadio = %u", group.GroupID(), group.IsRadio());
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID()));
+  filter.AppendWhere(PrepareSQL("bIsRadio = %u", group.IsRadio()));
+
   return RemoveChannelsFromGroup(group) &&
-      DeleteValues("channelgroups", strWhereClause);
+      DeleteValues("channelgroups", filter);
 }
 
 bool CPVRDatabase::Get(CPVRChannelGroups &results)
 {
   bool bReturn = false;
-  CStdString strQuery = FormatSQL("SELECT * from channelgroups WHERE bIsRadio = %u", results.IsRadio());
+  CStdString strQuery = PrepareSQL("SELECT * from channelgroups WHERE bIsRadio = %u", results.IsRadio());
 
   if (ResultQuery(strQuery))
   {
@@ -709,7 +731,7 @@ int CPVRDatabase::Get(CPVRChannelGroup &group)
     return -1;
   }
 
-  CStdString strQuery = FormatSQL("SELECT idChannel, iChannelNumber FROM map_channelgroups_channels WHERE idGroup = %u ORDER BY iChannelNumber", group.GroupID());
+  CStdString strQuery = PrepareSQL("SELECT idChannel, iChannelNumber FROM map_channelgroups_channels WHERE idGroup = %u ORDER BY iChannelNumber", group.GroupID());
   if (ResultQuery(strQuery))
   {
     iReturn = 0;
@@ -734,7 +756,11 @@ int CPVRDatabase::Get(CPVRChannelGroup &group)
         else
         {
           // remove a channel that doesn't exist (anymore) from the table
-          DeleteValues("map_channelgroups_channels", FormatSQL("idGroup = %u AND idChannel = %u", group.GroupID(), iChannelId));
+          Filter filter;
+          filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID()));
+          filter.AppendWhere(PrepareSQL("idChannel = %u", iChannelId));
+
+          DeleteValues("map_channelgroups_channels", filter);
         }
 
         m_pDS->next();
@@ -791,13 +817,13 @@ bool CPVRDatabase::PersistGroupMembers(CPVRChannelGroup &group)
     {
       PVRChannelGroupMember member = group.m_members.at(iChannelPtr);
 
-      CStdString strWhereClause = FormatSQL("idChannel = %u AND idGroup = %u AND iChannelNumber = %u",
+      CStdString strWhereClause = PrepareSQL("idChannel = %u AND idGroup = %u AND iChannelNumber = %u",
           member.channel->ChannelID(), group.GroupID(), member.iChannelNumber);
 
       CStdString strValue = GetSingleValue("map_channelgroups_channels", "idChannel", strWhereClause);
       if (strValue.empty())
       {
-        strQuery = FormatSQL("REPLACE INTO map_channelgroups_channels ("
+        strQuery = PrepareSQL("REPLACE INTO map_channelgroups_channels ("
             "idGroup, idChannel, iChannelNumber) "
             "VALUES (%i, %i, %i);",
             group.GroupID(), member.channel->ChannelID(), member.iChannelNumber);
@@ -832,13 +858,15 @@ bool CPVRDatabase::Delete(const CPVRClient &client)
     return false;
   }
 
-  CStdString strWhereClause = FormatSQL("sUid = '%s'", client.ID().c_str());
-  return DeleteValues("clients", strWhereClause);
+  Filter filter;
+  filter.AppendWhere(PrepareSQL("sUid = '%s'", client.ID().c_str()));
+
+  return DeleteValues("clients", filter);
 }
 
 int CPVRDatabase::GetClientId(const CStdString &strClientUid)
 {
-  CStdString strWhereClause = FormatSQL("sUid = '%s'", strClientUid.c_str());
+  CStdString strWhereClause = PrepareSQL("sUid = '%s'", strClientUid.c_str());
   CStdString strValue = GetSingleValue("clients", "idClient", strWhereClause);
 
   if (strValue.empty())
@@ -849,7 +877,7 @@ int CPVRDatabase::GetClientId(const CStdString &strClientUid)
 
 bool CPVRDatabase::ResetEPG(void)
 {
-  CStdString strQuery = FormatSQL("UPDATE channels SET idEpg = 0");
+  CStdString strQuery = PrepareSQL("UPDATE channels SET idEpg = 0");
   return ExecuteQuery(strQuery);
 }
 
@@ -869,10 +897,10 @@ bool CPVRDatabase::Persist(CPVRChannelGroup &group)
 
     /* insert a new entry when this is a new group, or replace the existing one otherwise */
     if (group.GroupID() <= 0)
-      strQuery = FormatSQL("INSERT INTO channelgroups (bIsRadio, iGroupType, sName) VALUES (%i, %i, '%s')",
+      strQuery = PrepareSQL("INSERT INTO channelgroups (bIsRadio, iGroupType, sName) VALUES (%i, %i, '%s')",
           (group.IsRadio() ? 1 :0), group.GroupType(), group.GroupName().c_str());
     else
-      strQuery = FormatSQL("REPLACE INTO channelgroups (idGroup, bIsRadio, iGroupType, sName) VALUES (%i, %i, %i, '%s')",
+      strQuery = PrepareSQL("REPLACE INTO channelgroups (idGroup, bIsRadio, iGroupType, sName) VALUES (%i, %i, %i, '%s')",
           group.GroupID(), (group.IsRadio() ? 1 :0), group.GroupType(), group.GroupName().c_str());
 
     bReturn = ExecuteQuery(strQuery);
@@ -904,7 +932,7 @@ int CPVRDatabase::Persist(const AddonPtr client)
     return iReturn;
   }
 
-  CStdString strQuery = FormatSQL("REPLACE INTO clients (sName, sUid) VALUES ('%s', '%s');",
+  CStdString strQuery = PrepareSQL("REPLACE INTO clients (sName, sUid) VALUES ('%s', '%s');",
       client->Name().c_str(), client->ID().c_str());
 
   if (ExecuteQuery(strQuery))
@@ -928,7 +956,7 @@ bool CPVRDatabase::Persist(CPVRChannel &channel, bool bQueueWrite /* = false */)
   if (channel.ChannelID() <= 0)
   {
     /* new channel */
-    strQuery = FormatSQL("INSERT INTO channels ("
+    strQuery = PrepareSQL("INSERT INTO channels ("
         "iUniqueId, bIsRadio, bIsHidden, bIsUserSetIcon, bIsLocked, "
         "sIconPath, sChannelName, bIsVirtual, bEPGEnabled, sEPGScraper, iLastWatched, iClientId, "
         "iClientChannelNumber, sInputFormat, sStreamURL, iEncryptionSystem, idEpg) "
@@ -941,7 +969,7 @@ bool CPVRDatabase::Persist(CPVRChannel &channel, bool bQueueWrite /* = false */)
   else
   {
     /* update channel */
-    strQuery = FormatSQL("REPLACE INTO channels ("
+    strQuery = PrepareSQL("REPLACE INTO channels ("
         "iUniqueId, bIsRadio, bIsHidden, bIsUserSetIcon, bIsLocked, "
         "sIconPath, sChannelName, bIsVirtual, bEPGEnabled, sEPGScraper, iLastWatched, iClientId, "
         "iClientChannelNumber, sInputFormat, sStreamURL, iEncryptionSystem, idChannel, idEpg) "